htmlspecialcharsに関するorzなお知らせ

■htmlspecialcharsのInvalid multibyte sequenceエラーの問題
http://d.hatena.ne.jp/narusase/20091203

↑の続き

いろいろオプションを変えてテストしてみた結果php.iniの設定によってhtmlspecialcharsの挙動が変わることが判明した。

具体的には 設定項目の「display_errors = On」を「display_errors = Off」にするとエラーが発現する。
表示しない設定だと表示するとか駄目すぐる・・・orz



ソースをみてみると。
ext/standard/html.c の L1142行目のあたりが怪しい

if(!PG(display_errors)) {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid multibyte sequence in argument");
}

調査した結果 ! がついていることで意味が反転してる模様
おーい、PHPの中の人〜〜


最新版のphp-5.2.11でもこのバグは残っている模様なのでここにパッチを示しておく。
対象のファイルは php-5.2.11/ext/standard/html.c

下記のファイルを html.c.patch として保存して、パッチ当てして再コンパイルすれば問題は解消するはず。
本家に投げるのは言語の問題があるから、日本のユーザ会へ投げておきますかね〜〜

*** html.c.old  2009-12-04 12:07:22.000000000 +0900
--- html.c      2009-12-04 12:44:37.000000000 +0900
***************
*** 1137,1143 ****
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       if(!PG(display_errors)) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid multibyte sequence in argument");
                        }
                        *newlen = 0;
--- 1137,1143 ----
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       if(PG(display_errors)) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid multibyte sequence in argument");
                        }
                        *newlen = 0;


追記:
本家を調べてみたら同じ問題がレポートされていた
http://bugs.php.net/bug.php?id=47494

・・・が、意図的にやってるので対処する気ね〜よ みたいな書き込みが見える気がするのは気のせいだろうか?

意図的にやるなら、せめて「display_errors = On」でも「display_errors = Off」でもエラーにするべきだと強く言いたい
・・・が、英語力皆無なので無理っぽい・・・orz

いちおうプランBはこんな感じでOKなはず(未テスト)

*** html.c.old  2009-12-04 12:07:22.000000000 +0900
--- html.c.b    2009-12-04 18:51:38.000000000 +0900
***************
*** 1137,1145 ****
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       if(!PG(display_errors)) {
!                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid multibyte sequence in argument");
!                       }
                        *newlen = 0;
                        return STR_EMPTY_ALLOC();
                }
--- 1137,1143 ----
                if(status == FAILURE) {
                        /* invalid MB sequence */
                        efree(replaced);
!                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid 
multibyte sequence in argument");
                        *newlen = 0;
                        return STR_EMPTY_ALLOC();
                }


追記2:
id:IwamotoTakashi(岩本隆史)さんやid:ockeghem(徳丸浩)さん、yamagataさんなど多数の方からからブックマークやリンクをいただきました。
id:moriyoshiさんからは初めてのはてなスターをいただきました。
なにやら、twitter あたりからもきているようで紹介してくれた方々に御礼申し上げます〜〜


つっこまれる前に白状しておくとタイトルは岩本さんのところ↓のパクリですはい(笑
○htmlspecialcharsに関する残念なお知らせ
http://d.hatena.ne.jp/IwamotoTakashi/20091006/p1