http://redmine.openpne.jp/
http://redmine.openpne.jp/favicon.ico
2011-04-06T14:21:36Z
OpenPNE Issue Tracking System
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7747
2011-04-06T14:21:36Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul></ul><p>ざっくり調べたので、原因についての現時点の見解を以下に示します。</p>
<p>展開できなかったファイルを調べたところ、いずれのファイルもパス名を含めて 100 バイトを超えたものとなっていました。 tar の規格上、ヘッダ部に格納可能なファイル名は 100 バイトまでと決まっているため、このようなファイルを格納することは通常できません。</p>
<p>tar の GNU 拡張では、この問題に対して、 100 バイトを超える、本来格納不可能なファイル名を、ヘッダ部ではなくコンテンツ部に格納することで対処しています。 PEAR の Archive_Tar によって作成されるパッケージもこの方式を採用しており、読み込みと書き込みの両方で、 GNU 形式の 100 バイトを超えたファイル名を扱えるようになっています。</p>
<p>ただし、 Archive_Tar には読み込みのタイミングにおける、 100 バイトを超えたファイル名の取得方法に誤りがあり、以下のチケットで(Archive_Tar 1.3.3 で)修正されています。</p>
<p>Bug #11594 :: _readLongHeader leaves 0 bytes in filename<br /><a class="external" href="http://pear.php.net/bugs/bug.php?id=11594">http://pear.php.net/bugs/bug.php?id=11594</a></p>
<p>tar は 512 バイト単位のブロックがいくつも組み合わさることにより成り立っています。ひとつのファイルにつき、最初に見つかったブロックはヘッダ部として扱われ、以降のブロックはコンテンツ部として扱われます。ヘッダやコンテンツの内容だけではそのブロックを埋められない場合、残りは NULL で埋められることになります。</p>
<p>OpenPNE で使用している Archive_Tar 1.3.2 は、ヘッダから取得可能な(短い)ファイル名については、終端に NULL が含まれていることを考慮し、 trim() をおこなっていましたが、コンテンツ部から取得する(長い)ファイル名については、終端の NULL の考慮をおこなっていませんでした。 Archive_Tar 1.3.3 では、この問題について、先に上げたチケットにて trim() をおこなうようにして対応しているようです。</p>
<p>ここからは推測になりますが、 NULL 文字が含まれるファイル名であったとしても、 PHP 5.3.3 までは問題なく扱うことができていたのではないかと思います。つまり、おそらく、この現象は PHP 5.3.4 以降で発生するものであるということになります。</p>
<p>というのも、 PHP 5.3.4 では、以下の変更がおこなわれているからです。</p>
<p><a class="external" href="http://svn.php.net/viewvc?view=revision&revision=305507">http://svn.php.net/viewvc?view=revision&revision=305507</a></p>
<p>この変更については、 Rasmus Lerdorf による以下のポストから知ることができます。</p>
<p>php.internals: Adding path_len to all stream functions in trunk<br /><a class="external" href="http://news.php.net/php.internals/50191">http://news.php.net/php.internals/50191</a></p>
<p>この変更により、ファイルパスを受け付ける多くの関数の引数は NULL 文字を含む文字列を許容しなくなりました。たとえば fopen() では、 NULL 文字が含まれている(=PHP の string 型変数としての文字列長と、 C 言語の char 型変数としての文字列長が一致しない)場合に false を返して失敗するようになりました。</p>
<p>tar の展開に使われる Archive_Tar::_extractList() では、 tar アーカイブから取得できたファイル名を fopen() 関数によってオープンし、ファイルの書き込みをおこなおうとします。つまり、ファイル名として NULL 文字を許容しなくなった PHP 5.3.4 以降で Archive_Tar 1.3.2 を使用し、パス名が 100 文字以上になるファイルを含むアーカイブを展開しようとすると、展開先のファイル名に NULL 文字が含まれていることにより fopen() が失敗し、 Archive_Tar はそこで展開を中断してしまいます。</p>
<p>これが本現象の原因なのではないかと思われます。仮にこの見立てが正しかったとすると、本現象の回避策は(利用者側で同梱の Archive_Tar を 1.3.3 以降のものに置き換えるか、プラグイン側で 100 文字以上のパスを使わないようにする以外に)ないということになります。</p>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7795
2011-04-08T15:36:33Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.7.0</i> にセット</li></ul>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7867
2011-04-18T00:55:58Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul><li><strong>ステータス</strong> を <i>New(新規)</i> から <i>Accepted(着手)</i> に変更</li><li><strong>担当者</strong> を <i>Kousuke Ebihara</i> にセット</li></ul>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7870
2011-04-18T08:26:40Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul><li><strong>ファイル</strong> <a href="/attachments/download/267/20110418_patch_for_Archive_Tar.diff">20110418_patch_for_Archive_Tar.diff</a> <a class="icon-only icon-magnifier" title="表示" href="/attachments/267/20110418_patch_for_Archive_Tar.diff">表示</a> を追加</li></ul><p>Archive_Tar 1.3.2 から最新の 1.3.7 までの変更点の概要と、それぞれについて OpenPNE への適用が必須かどうかの判断をしたものを以下に示します。</p>
<ul>
<li>r227940 : bzip2 取り扱い部分についてのみの変更。 PEAR パッケージとして有効なアーカイブは無圧縮 tar か gzip により圧縮された tar に限られるため、この変更を適用する必要はない。</li>
<li>r241532 : <strong>今回問題になっている、長いパス名の扱いが間違っている問題の修正であり、変更を適用する必要がある。</strong></li>
<li>r241545 : アーカイブ作成時と展開時でシンボリックリンクの考慮がなされていなかった。展開時の変更は微量であり、現在、シンボリックリンクを使用しているプラグインは存在しないため、即座に変更を入れる必要はない。</li>
<li>r268047 : <strong>ライセンス変更。このリビジョン以後の変更は修正 BSD ライセンスに基づいて扱われなければならないため、適用の必要がある。</strong></li>
<li>r287099 : アーカイブ作成過程において、変更時刻を表すヘッダに使う値が正しくないのを修正したというもの。 OpenPNE を動作させるにあたり、適用が必須なものではない。</li>
<li>r287105 : GNU tar として展開プログラムが認識するためのマジックヘッダがないというもの。プラグインパッケージは Archive_Tar で展開することを想定しているため、この変更を適用しなくとも OpenPNE の動作に影響はない。</li>
<li>r287108 : <strong>512 バイト以上の (ブロックをまたがる) パス名の途中に NULL が含まれてしまうというもの。いまのところ、プラグインでこの規模のパス名を生成するアーカイブは存在しないと思われるため、現時点で修正が必須なものではないが、パス名がライブラリ等の制約によって必要以上に (512 バイト以上に達するほどに) 長くなるという可能性は否定できないため、念のためこの変更も適用する。</strong></li>
<li>r287467 : <strong>展開時にパス名前後のスペースが除去されてしまう。このようなファイル名を意図してつけることはないとは思うが、なんらかの手違いによりそのようなファイルが混入している可能性はありうるので、この修正は入れたほうがよい。</strong></li>
<li>r287963 : いままで一部のエラー時に die() をコールしてスクリプトを強制的に終了させていたのを、 PEAR の標準的なエラーハンドリングに従うように変更したもの。適用が必須なものではない。</li>
<li>r293090 : ファイルの走査方法を変更し、 2GB 以上のファイルを取り扱えるように変更したもの。適用が必須なものではない。</li>
<li>r295988 : 無視ルールに当てはまるファイルをアーカイブしないようにする機能追加。適用が必須なものではない。</li>
</ul>
<p>以上の見解にしたがい、 r241532 と r268047 と r287108 と r287467 の変更のみを適用した際の差分を添付しました。ライセンス以外はいずれも軽微かつ最低限の変更であり、緊急リリースの差分としては妥当なところだと思います。</p>
<p><a class="external" href="http://redmine.openpne.jp/attachments/267/20110418_patch_for_Archive_Tar.diff">http://redmine.openpne.jp/attachments/267/20110418_patch_for_Archive_Tar.diff</a></p>
<p>そこで、以下のような対応をおこなうことにします。</p>
<ul>
<li>3.0, 3.2, 3.4 向けにはこの差分を適用したものをリリースする</li>
<li>開発版である 3.6 と 3.7 (master) では、 PEAR::Archive_Tar に対するバグ修正の恩恵を完全に享受できるよう、 Archive_Tar 1.3.7 へのバージョンアップをおこなうことにする</li>
</ul>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7872
2011-04-18T11:04:44Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul><li><strong>ステータス</strong> を <i>Accepted(着手)</i> から <i>Pending Review(レビュー待ち)</i> に変更</li><li><strong>進捗率</strong> を <i>0</i> から <i>50</i> に変更</li></ul><p>更新履歴 <a class="changeset" title="updated PEAR::Archive_Tar to 1.3.7 for avoiding error on extracting long-named file with PHP 5.3...." href="http://redmine.openpne.jp/projects/op3/repository/revisions/426023bfe32c9f45edbedb28af2e7a4ce2769c64">426023bfe32c9f45edbedb28af2e7a4ce2769c64</a> で適用されました。</p>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7884
2011-04-19T07:39:23Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul><li><strong>題名</strong> を <i>プラグインのtgzファイル名に不要なスペースがつくことがある</i> から <i>Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7905
2011-04-20T08:09:12Z
Rimpei Ogawa
ogawa@tejimaya.com
<ul><li><strong>ステータス</strong> を <i>Pending Review(レビュー待ち)</i> から <i>Pending Testing(テスト待ち)</i> に変更</li><li><strong>進捗率</strong> を <i>50</i> から <i>70</i> に変更</li></ul><p>master の変更確認OKです。</p>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=7911
2011-04-20T16:03:56Z
Kiwa Sakai
kiwa@openpne.jp
<ul><li><strong>ステータス</strong> を <i>Pending Testing(テスト待ち)</i> から <i>Fixed(完了)</i> に変更</li><li><strong>進捗率</strong> を <i>70</i> から <i>100</i> に変更</li></ul><ul>
<li>PHP5.3.4</li>
<li>PHP5.3.6</li>
<li>PHP5.2.17(PNE3.0のみ5.2.8)</li>
<li>PHP5.2.3</li>
</ul>
<p>上記バージョンで確認したところ、プラグインのダウンロードの処理に問題はなく、PHP5.2.3以外のバージョンでは正常にインストールできることを確認しました。<br />PHP5.2.3 については マニュアルにある推奨バージョンの最低のものということで確認を行いましたが、OpenPNE3.6以上についてはインストール開始直後セグメンテーション違反になりました。<br /><pre>
>> installer start clean install
セグメンテーション違反です
</pre></p>
<p>この問題はこのチケットでの対応以前から発生しており(OpenPNE3.6beta8で確認)、またPHP5.2.4でも同現象が発生していることが確認できたので、別チケットを作成しました。</p>
<p><a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): PHP 5.2.3〜5.2.5 で openpne:install をおこなうとセグメンテーション違反でインストールに失敗する (Fixed(完了))" href="http://redmine.openpne.jp/issues/2011">#2011</a>: php5.2.3・php5.2.4 で openpne:install をおこなうとセグメンテーション違反でインストールに失敗する</p>
OpenPNE 3 - Bug(バグ) #1908: Installing some plugins were failed with PHP 5.3.4+ (PHP 5.3.4 以上でプラグインの展開に失敗することがある)
http://redmine.openpne.jp/issues/1908?journal_id=20250
2016-03-14T08:04:56Z
kaoru n
<ul><li><strong>関連している</strong> <i><a class="issue tracker-1 status-13 priority-7 priority-highest closed" href="/issues/3918">Bug(バグ) #3918</a>: PHP 5.5 以降でプラグインの展開に失敗する</i> を追加</li></ul>