ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

file upload problem in mbstring(enable encoding_translation) (続き)

昨日のですが。
mbstringの微妙な挙動について(懲りずに)色々と調べていたのですが、ある時を境に急に出なくなりました。
特にファイルの修正はしてないのに。。。なんだか狐につままれたような気分。怪奇現象?こえぇ。
落ち着いて自分がやっていた作業履歴を思い出しながら考えていたら、一つだけ思い当たる事がありました。
ビルドの時間を短縮しようとコンパイル・オプションに「--disable-all」を有効にしてました(途中からコンパイル・オプションを変化させた)。という事は?
この時点で怪しそうな拡張モジュールが(ほぼ)特定。ピカーン!と電球が光った。(>_<)
外部入力データに関与しそうな拡張モジュールといえば。。。5.2.0から導入された(かつデフォルトで有効になっている)filter拡張モジュールかっ!
filter拡張モジュールを有効にしたり無効にしたりする事で、正しく動作したり正しく動作しなかったり。一歩前進!
ただ、filter拡張モジュールのデフォルトの動作(unsafe_raw)は何もしなかったハズなので、こやつが原因では無さそう。むぅ。
引き続き「/php-src/main/rfc1867.c」の処理フローを眺めていると、filter拡張モジュールが有効な場合と無効な場合では(若干)処理フローが違う事に気がつきました。
filter拡張モジュールが有効な場合はphp_mb_gpc_stack_variable関数を経由していない。。。これか。_| ̄|○
とりあえず、以下のパッチで正常に動作する事は確認できました。修正したファイルがファイルなだけに(本家にバグ報告する前に)廣川さんに相談してみようか。。。

--- php5.2-200803050130,orig/main/rfc1867.c	2007-12-31 16:33:36.000000000 +0900
+++ php5.2-200803050130/main/rfc1867.c	2008-03-05 16:23:01.000000000 +0900
@@ -961,6 +961,13 @@
 					php_rfc1867_callback(MULTIPART_EVENT_FORMDATA, &event_formdata, &event_extra_data TSRMLS_CC);
 				}
 
+#if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING)
+					if (php_mb_encoding_translation(TSRMLS_C)) {
+						php_mb_gpc_stack_variable(param, value, &val_list, &len_list, 
+												  &num_vars, &num_vars_max TSRMLS_CC);
+					}
+#endif
+
 				if (!strcasecmp(param, "MAX_FILE_SIZE")) {
 					max_file_size = atol(value);
 				}

それにしても、この遅延評価(問題が起きてから調査・対処)な体質はそろそろ改善していかないと。。。_| ̄|○