ディレクトリ探索のエラーハンドリング処理不足による無限ループ
-
WordPressプロジェクトの関係者様、
いつも大変お世話になっております。早速本題でございますが、
エラーハンドリング処理の不足が懸念される挙動
を確認いたしましたので報告いたします。ただ、この度のような報告は初めてであり、
本家開発元へお伝えすべき内容かも知れない
といった不安がございます。本家開発元への報告は英語で行う認識ですが、
私にはそのスキルがございません。もしも本家開発元への報告が必要な場合は、
大変恐れ入りますが皆様のお力を
お貸しいただけないでしょうか。
また、記載している情報に不足があれば
お申し付けいただければ幸いでございます。
どうかよろしくお願いいたします。[概要]
open_basedir を設定している環境において、
WordPressからアップロードした画像の保存先設定が
open_basedir領域外のパス となっていた場合に、
エラーを出力しつつ無限ループに陥る事象を確認しました。エラーログの肥大化などサーバーリソースの大量消費に繋がるため、
事象の報告と併せてエラーハンドリング処理の追加を提案いたします。詳細は以下の通りで、
先ずは挙動を確認した環境について記載します。[環境]
・php.ini の open_basedir を使用し、
PHPからアクセス可能なディレクトリを制限している。例えば次のような設定を行っている。
——————————
open_basedir = “/home/taro/www/example.com/”
——————————・WordPressはバージョン4.3.1で、
プラグインは(デフォルトの3点がインストールされているが)全て停止中。・WordPressではアップロードした画像データの保存先を変更するため、
ダッシュボードにログインした状態で「/wp-admin/options.php」にアクセスし、
「upload_path」の設定値として『open_basedir領域外』のパスを指定。例えば次のような設定を行っている。
——————————
upload_path = /home/taro/www/images
——————————・Linux系サーバーで、
PHPのバージョンは5.5。次に挙動を確認した際の状況について記載します。
[状況]
ダッシュボードの「メディア > 新規追加」にて画像データを1点アップロードすると、
次のエラーが大量に発生していた。
————————————————————
PHP Warning: is_dir(): open_basedir restriction in effect.
————————————————————続いて大量にエラーが発生した原因について見解を記載します。
[見解]
/wp-includes/functions.php 関数「wp_mkdir_p」内の
フォルダ探索を行う次のロジックで発生していたエラーであった。// We need to find the permissions of the parent folder that exists and inherit that. $target_parent = dirname( $target ); while ( '.' != $target_parent && ! is_dir( $target_parent ) ) { $target_parent = dirname( $target_parent ); }
※WordPress 4.3.1 環境では1510行目付近で、
特に while条件 の『! is_dir( $target_parent )』が当該箇所。ディレクトリにマッチするまで上位階層を順々に確認するロジックに伺えるが、
open_basedir 環境ではマッチングできないケースもあり、
“/(ルート)”階層に到達してもループ離脱の処理がないため
無限ループに陥っているものと考えている。最後にエラーハンドリング処理追加の提案について記載しますので、
大変恐れ入りますがご検討をお願いいたします。[提案]
dirname関数 を通す前後で値に変化が無ければ
“/(ルート)”などの最上位階層に到達していると考えられるため
return false としてメソッド「wp_mkdir_p」から抜ける。以上でございます。
こちらの調査が甘く報告が重複していたり、
想定の挙動ということであれば
ご指摘のほどよろしくお願いいたします。
- トピック「ディレクトリ探索のエラーハンドリング処理不足による無限ループ」には新たに返信することはできません。