Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Do NOT use system()
- From: knok@xxxxxxxxxxxxx (NOKUBI Takatsugu)
- Date: Tue, 30 Jul 2002 15:25:47 JST
- X-ml-name: namazu-devel-ja
- X-mail-count: 02604
<87n0samt2u.wl@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>の記事において
fumiya@xxxxxxxxxxxさんは書きました。
>> 簡単に、select を利用すればいいんじゃない?
確か方法はあるはずだとは思ってたんですが、select を思いだせませんで
した。どうもありがとうございます。
<20020730.020239.74741517.baba@xxxxxxxxxxxxxxxx>の記事において
baba@xxxxxxxxxxxxxxxxさんは書きました。
>> system() をやめ fork() と exec() を使うのが安全であるということで、
>> Perlクックブックのレシピ19.6「シェルエスケープなしでコマンドを実行
>> する」などを見ながら適用しようかとおもったのですが、少し調べてみた
>> ところ、IPC::Open3 を使うと簡潔でシェルを呼び出さないコードが書け
>> そう(に僕には見えた)ので、これを使った pdf.pl を作ってみました。実
>> 験コードを何度も何度も commit するのはちょっとアレなので、ちょっと
>> 見ていただけるとありがたいです。
open3 は何度かつかったことがあるのですが、基本的には問題なさそうに見
えます。make check も通りましたし、結果に問題もなさそうです。
IO::File を使うよう直してみたましたが、それも問題ありませんでした。
そのパッチを末尾につけておきます。
>> ・Windows98SE, ActivePerl-5.6.1.633-MSWin32-x86, namazu-2.0.10, xpdf-1.01
ActivePerl でも問題ないのであれば良さそうですね。
>> # IPC::Run は非標準なモジュールであることを考えると、やっぱり
>> # 標準でインストールされているモジュールを利用する方がよいかと。
そうですね。しかし security のためという観点だと、他の system() なコー
ドも全部これに変えないと意味がなさそうです...
--
野首 貴嗣
E-mail: knok@xxxxxxxxxxxxx
knok@xxxxxxxxxx / knok@xxxxxxxxxx
--- pdf.pl 2002-07-30 15:17:56.000000000 +0900
+++ pdf.pl.new 2002-07-30 15:17:50.000000000 +0900
@@ -47,9 +47,11 @@
$pdfinfopath = util::checkcmd('pdfinfo');
if (defined $pdfconvpath) {
# To capture a program's STDERR, but discard it's STDOUT:
- open(NULL, ">", util::devnull);
- my $pid = open3(gensym, ">&NULL", \*PH, $pdfconvpath, "-v");
- while (<PH>) {
+ my $null = new IO::File;
+ my $ph = new IO::File;
+ $null->open('>' . util::devnull);
+ my $pid = open3(gensym, ">&=".fileno($null), $ph, $pdfconvpath, "-v");
+ while (<$ph>) {
if (/^pdftotext\s+version\s+([0-9]+\.[0-9]+)/) {
$pdfconvver = $1;
}
@@ -99,8 +101,9 @@
util::vprint("Processing pdf file ... (using '$pdfconvpath')\n");
# To discard both of it's STDOUT and STDERR:
- open(NULL, ">", util::devnull);
- my $pid = open3(gensym, ">&NULL", ">&NULL", $pdfconvpath, @pdfconvopts, $tmpfile, $tmpfile2);
+ my $null = new IO::File;
+ $null->open('>' . util::devnull);
+ my $pid = open3(gensym, ">&=".fileno($null), ">&=".fileno($null), $pdfconvpath, @pdfconvopts, $tmpfile, $tmpfile2);
waitpid($pid, 0);
unless (-e $tmpfile2) {
@@ -124,9 +127,11 @@
if (defined $pdfinfopath) {
# To capture a program's STDOUT, but discard it's STDERR:
- open(NULL, ">", util::devnull);
- my $pid = open3(gensym, \*PH, ">&NULL", $pdfinfopath, $tmpfile);
- while (<PH>) {
+ my $null = new IO::File;
+ $null->open('>' . util::devnull);
+ my $ph = new IO::File;
+ my $pid = open3(gensym, $ph, ">&=".fileno($null), $pdfinfopath, $tmpfile);
+ while (<$ph>) {
if (/Title:\s+(.*)/) { # or /Subject: (.*)/
$fields->{'title'} = $1;
}