Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Do NOT use system()



<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;
 	    }