PHP 5.4 のバグレポ出したら30分で修正された話

Advent Calendar 22日目 scanner.l と parser.y の差分を解説してみる - do_akiの徒然想記 にもちょこっと書いたのですが、
php 5.4.0 RC4 において、 code.1 が Segmentation fault を引き起こしていました。

code.1 Segmentation fault with PHP5.4.0RC4
<?php
Cls::{0}();

bug60611

恐る恐る、 php の バグトラッキングシステム (https://bugs.php.net/) に登録してみると……

ほんの30分程度で修正されていました!

PHP :: Bug #60611 :: Segmentation fault with Cls::{expr}() syntax

修正されたバージョンで試す

さっそく snapshot から ダウンロードして実行してみると、確かに php -r 'Cls::{0}();' では Segmentation fault を起こさなくなっていました。

修正内容(PHP: Revision 321429)を見ると、string ではない場合はstringに変換して処理を続けるようにしたようです。

code.2 snapshot (php5.4-201112280030) で実際に動かしたコードとその結果
class Cls {
    static function __callStatic($name, $arg) {
        var_dump($name);
    }
}

Cls::{0}();     // string(1) "0"
Cls::{1.0}();   // string(1) "1"
Cls::{true}();  // string(1) "1"
Cls::{false}(); // string(0) ""
Cls::{null}();  // string(0) ""

php5.3 では string 以外が渡された場合は Fatal error となっていたのですが、変更したようです。



んじゃ、$cls->{expr}() のほうはどうかなぁ、と思って php -r '$cls=new stdClass(); $cls->{0}();' を実行してみると…… Segmentation fault...

テストコードもちゃんとある(Zend/tests/bug60611.phpt)し、PASS してる。

どうも、 Cls::{expr}() のあとに $cls->{expr}() を実行すると問題ないのに、$cls->{expr}() だけを実行するとだめらしい。

bug60613

仕方ないので、もう一度報告。

PHP :: Bug #60613 :: Segmentation fault with $cls->{expr}() syntax

そしたら、今度はおよそ2時間後に修正が入りました。

PHP: Revision 321458

この修正によって、 php5.3 と同様の挙動をするように変更されました。
code.2 を実行しても、Fatal error: Method name must be a string となります。

とりあえず、これで Segmentation fault が発生することは無くなりました。

実はその後

修正した laruence さんのこんなコメントがBTS に。

dmitry, I have a quick look at this, since due to cache mechanism, I have not
gat familiar with this area.

it is better if you can have a look at this. I will keep troubleshooting anyway
:).

どうやら、キャッシュ周りの問題が影響しているように思えるけれども そのへんはlaruence さんの管轄外らしく、dmitry さんに投げたと。

そしてその問題をdmitry さんが修正されてます。

PHP: Revision 321463

ただ、この時点で既に string 以外が渡された時には Fatal Error となるように修正されてるため、 このテストコード(Zend/tests/bug60613.phpt)は通らなくなってました。

PHP: Revision 321466
ということで、テストコードが修正されて落ち着いたようです。

まとめ

Segmentation fault が発生するというのが結構大きな問題だからか、かなり早く修正されました。

英語苦手なので伝わるか不安でしたが、伝わったようで良かったです。説明するよりも、具体的なコードとその結果を示すことが大事なのかな。

今回のように一見修正されたように見えても完全には修正しきれていない場合もありますので、報告したらそれでおしまいではなく、きちんと検証までやるべきだなぁと感じました。少なくともそのバグを発見した経緯に関しては、報告者の方が詳しいはずなので。

ホントは、修正パッチを送れたらよかったなぁなんて思っていますが、なかなか難しい。。。