Ticket #331 (closed バグ指摘: 修正済)

Opened 16 years ago

Last modified 16 years ago

SC_Utils::sfEncodeFileで無限ループする可能性

Reported by: adachi Owned by: nanasess
Priority: Milestone: EC-CUBE2.3.0
Component: フロント Version: 2.1.2(正式版)
Keywords: SC_Utils sfEncodeFile 無限ループ Cc:
修正済み:

Description

SC_Utils::sfEncodeFile()で、ファイルポインタのチェックを行っていないため、 無限ループになる場合がある。

 http://jp.php.net/manual/ja/function.feof.php

    function sfEncodeFile($filepath, $enc_type, $out_dir) {
        $ifp = fopen($filepath, "r");

        $basename = basename($filepath);
        $outpath = $out_dir . "enc_" . $basename;

        $ofp = fopen($outpath, "w+");

        while(!feof($ifp)) { // $ifpがfalseの場合がある
            $line = fgets($ifp);
            $line = mb_convert_encoding($line, $enc_type, "auto");
            fwrite($ofp,  $line);
        }

        fclose($ofp);
        fclose($ifp);

        return     $outpath;
    }

Change History

comment:1 Changed 16 years ago by nanasess

  • Owner changed from somebody to nanasess
  • Status changed from new to assigned

comment:2 Changed 16 years ago by nanasess

  • Status changed from assigned to closed
  • Resolution set to 修正済

下記のパッチで対応

Index: SC_Utils.php
===================================================================
--- SC_Utils.php	(リビジョン 17488)
+++ SC_Utils.php	(作業コピー)
@@ -1021,23 +1021,48 @@
         return $ret;
     }
 
+    /**
+     * テキストファイルの文字エンコーディングを変換する.
+     *
+     * $filepath に存在するテキストファイルの文字エンコーディングを変換する.
+     * 変換前の文字エンコーディングは, mb_detect_order で設定した順序で自動検出する.
+     * 変換後は, 変換前のファイル名に「enc_」というプレフィクスを付与し,
+     * $out_dir で指定したディレクトリへ出力する
+     *
+     * TODO $filepath のファイルがバイナリだった場合の扱い
+     * TODO fwrite などでのエラーハンドリング
+     *
+     * @access public
+     * @param string $filepath 変換するテキストファイルのパス
+     * @param string $enc_type 変換後のファイルエンコーディングの種類を表す文字列
+     * @param string $out_dir 変換後のファイルを出力するディレクトリを表す文字列
+     * @return string 変換後のテキストファイルのパス
+     */
     function sfEncodeFile($filepath, $enc_type, $out_dir) {
         $ifp = fopen($filepath, "r");
 
-        $basename = basename($filepath);
-        $outpath = $out_dir . "enc_" . $basename;
+        // 正常にファイルオープンした場合
+        if ($ifp !== false) {
 
-        $ofp = fopen($outpath, "w+");
+            $basename = basename($filepath);
+            $outpath = $out_dir . "enc_" . $basename;
 
-        while(!feof($ifp)) {
-            $line = fgets($ifp);
-            $line = mb_convert_encoding($line, $enc_type, "auto");
-            fwrite($ofp,  $line);
-        }
+            $ofp = fopen($outpath, "w+");
 
-        fclose($ofp);
-        fclose($ifp);
+            while(!feof($ifp)) {
+                $line = fgets($ifp);
+                $line = mb_convert_encoding($line, $enc_type, "auto");
+                fwrite($ofp,  $line);
+            }
 
+            fclose($ofp);
+            fclose($ifp);
+        }
+        // ファイルが開けなかった場合はエラーページを表示
+          else {
+              SC_Utils::sfDispError('');
+              exit;
+        }
         return     $outpath;
     }
 

comu-ver2 には, r17489 でコミット済み

Note: See TracTickets for help on using tickets.