Bug(バグ) #2228
完了sfImageGenerator(GD) で存在しない例外クラスが使われている
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 による処理停止)が表示されてしまう。
Youichi Kimura さんが約13年前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 275ff4629d52c769ecc4987e22832e45330236e4 で適用されました。
Yuya Watanabe さんが12年以上前に更新
- 3.6 で発生するか を Yes から Unknown (未調査) に変更
- 3.4 で発生するか を Unknown (未調査) にセット
修正内容自体は問題ないと思いますが,リリース時にどこにこのチケットのコミットが含まれるかが不明なため,リリースが行われるブランチ等,修正が反映されていることがわかる状態になるまでは「Pending Review」としておきます.
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
この部分に到達する場合、どちらにしろエラーで実行が停止されるため動作確認程度は必要かもしれないですが、テストは不要とのことです。
kaoru n さんがほぼ10年前に更新
- コピー先 Backport(バックポート) #3785: sfImageGenerator(GD) で存在しない例外クラスが使われている を追加
Chiharu Nakajima さんが9年以上前に更新
- コピー先 Backport(バックポート) #3792: sfImageGenerator(GD) で存在しない例外クラスが使われている を追加