操作
Backport(バックポート) #3792
完了sfImageGenerator(GD) で存在しない例外クラスが使われている
開始日:
2011-06-20
期日:
進捗率:
100%
予定工数:
説明
Overview¶
定義されていないクラス sfRuntimeException が sfImageGenerator クラス内で使われている。
- plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php
- plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGeneratorGD.class.php
History¶
- master ブランチに問題のコードが含まれたコミット : 110行目
plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php 103- public function output($outputFilename) 104- { 105- if (!is_dir(dirname($outputFilename))) 106- { 107- $currentUmask = umask(0000); 108- if (false === @mkdir(dirname($outputFilename), 0777, true)) 109- { 110: throw new sfRuntimeException('Failed to make cache directory.'); 111- } 112- umask($currentUmask); 113- } 114- 115- if ($this->doSave($outputFilename, $this->format, $this->quality)) 116- { 117- return file_get_contents($outputFilename); 118- } 119- 120- return false; 121- }
- http://redmine.openpne.jp/projects/op3/repository/revisions/8a93c715cfd6f43e35ec74cf302a27cc77732b48
- この #1086 のコミットでは OpenPNE-3.5.3 時点で、 sfImageGeneratorGD クラスを sfImageGenerator に移動している
- 上記のコミット以前に、問題のコードが含まれたコミット
- http://trac.openpne.jp/changeset/12951
- OpenPNE-3.1.3 時点で、 sfImageGeneratorGD クラスが配置されている
- しかし、このコミットは svn:externals を外して、SVN管理下にソースを移動しているだけである
- 上記のコミット以前に、 externals 先のファイルに問題のコードが含まれたコミット
- http://trac.openpne.jp/changeset/10244
- http://trac.openpne.jp/ticket/3246#comment:7 で、当該部分を追加したコミットが行われている
if (!is_dir(dirname($outputFilename))) { $currentUmask = umask(0000); if (false === @mkdir(dirname($outputFilename), 0777, true)) { throw new sfRuntimeException('Failed to make cache directory.'); } umask($currentUmask); }
Way to fix¶
近い名前の例外クラスには
- sfException
- RuntimeException
- opRuntimeException
がある。
- plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php
- plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGeneratorGD.class.php
このクラスファイルは OpenPNE に依存したものではなく、当該の例外は、実行時の例外を知らせるものであると読み取れる。つまり本来書くべきクラス名は RuntimeException であると思われる。当該部分の例外クラス名を sfRuntimeException から RuntimeException に修正する。
Versions¶
http://trac.openpne.jp/changeset/10244 このコミット以降の全ての OpenPNE 3系。
OpenPNE-3.2 or earlier, 3.4, 3.6, master.
Influence¶
この例外が本来投げられるタイミングで、未定義である sfRuntimeException を使用しようとしたために Fatal Error が発生する。そのタイミングとは、
- サーバ側に画像のキャッシュファイルが生成される時(サーバ側のキャッシュがないときにブラウザから画像を表示するなど)に、
- 画像のキャッシュファイルを作成するディレクトリ(web/cache/img/*)が存在せず、
- そのディレクトリ(web/cache/img/*)を新規作成しようとしたときに作成できない場合(*1)
である。 web/cache に書き込み権限がない場合などには(*1)を満たすため、比較的容易に当該箇所の処理を行わせようとする(Fatal Error を発生させる)ことができる。
そのような場合に画像のURLに直接アクセスすると、本来ユーザに表示されるべきではない真っ白な画面(Fatal Error による処理停止)が表示されてしまう。
操作