[PHP-dev 492] Re: users に流した mbstring.c パッチにバグがありました

Yasuo Ohgaki php-dev@php.gr.jp
Sun, 08 Sep 2002 07:48:05 +0900


大垣です。

自分で変数名と値の2つ分の場所確保が必要とコメント書いて
いて忘れてました. 初期化してないアドレスにアクセスしてま
したね。(汗

と、ここまで書いた時点でなぜ今まで問題なかったのか?と
よく考えてみると、この部分、exmaple.php?varの
varが初期化される様にEdinさんが変更していたはずです
よね。しかも、このパッチにはセパレータが複数指定できな
くなったバグもあって自分が直したはず...

あのパッチがコミットされた時に混入したseparatorバグ
を直した時にもっとよく確認しておくべきでした。

このパッチで、問題解決と思います。HEADにコミットしとき
ます。念の為、しばらくおいておいて問題なければ4.2.0ブ
ランチにもコミットしておきます。

--
Yasuo Ohgaki

Moriyoshi Koizumi wrote:
> 小泉です。
> 
> こちらの ML は初めてです。よろしくお願いします。
> 
> 先ほど php-users に投げたパッチには不具合がありました。
> (きしださん、藤本さん検証ありがとうございました。)
> 
> あまりソースを読んでいないのにパッチを作ってしまったのが非常にまずかったで
> すね。
> iconv の件でお世話になっていた、大垣さんにじかにパッチを送ってしまった
> 私の判断ミスもよくなかったと思います。
> これからパッチはとりあえずこの php-dev@php.gr.jp に投げて、とりあえず多く
> の方の目を通していただくようにします。
> 
> さて、再びパッチを作ってみましたが、どうでしょうか?
> 
> お忙しいとは思いますが、よろしくお願いします。
> 
> 
> 
> ------------------------------------------------------------------------
> 
> diff -u -r php-4.2.3.org/ext/mbstring/mbstring.c php-4.2.3/ext/mbstring/mbstring.c
> --- php-4.2.3.org/ext/mbstring/mbstring.c	Thu Aug  1 14:47:56 2002
> +++ php-4.2.3/ext/mbstring/mbstring.c	Sun Sep  8 05:44:09 2002
> @@ -1031,18 +1031,24 @@
>  	var = php_strtok_r(res, separator, &strtok_buf);
>  	while (var)  {
>  		val = strchr(var, '=');
> -		val_list[n] = var;
> -		len_list[n] = php_url_decode(var, strlen(var));
> -		n++;
>  		if (val) { /* have a value */
> +			len_list[n] = php_url_decode(var, val-var);
> +			val_list[n] = var;
> +			n++;
> +
>  			*val++ = '\0';
>  			val_list[n] = val;
>  			len_list[n] = php_url_decode(val, strlen(val));
> +			n++;
>  		} else {
> +			len_list[n] = php_url_decode(var, strlen(var));
> +			val_list[n] = var; 
> +			n++;
> +
>  			val_list[n] = "";
>  			len_list[n] = 0;
> +			n++;
>  		}
> -		n++;
>  		var = php_strtok_r(NULL, separator, &strtok_buf);
>  	} 
>  	num = n; /* make sure to process initilized vars only */
> 
> 
> ------------------------------------------------------------------------
> 
> Index: mbstring.c
> ===================================================================
> RCS file: /repository/php4/ext/mbstring/mbstring.c,v
> retrieving revision 1.97
> diff -u -r1.97 mbstring.c
> --- mbstring.c	7 Sep 2002 14:07:05 -0000	1.97
> +++ mbstring.c	7 Sep 2002 21:30:15 -0000
> @@ -1272,19 +1272,24 @@
>  	var = php_strtok_r(res, separator, &strtok_buf);
>  	while (var)  {
>  		val = strchr(var, '=');
> -		val_list[n] = var;
> -		n++;
>  		if (val) { /* have a value */
> -			php_url_decode(var, val-var);
> +			len_list[n] = php_url_decode(var, val-var);
> +			val_list[n] = var;
> +			n++;
> +
>  			*val++ = '\0';
>  			val_list[n] = val;
>  			len_list[n] = php_url_decode(val, strlen(val));
> +			n++;
>  		} else {
> -			php_url_decode(var, strlen(var));
> +			len_list[n] = php_url_decode(var, strlen(var));
> +			val_list[n] = var; 
> +			n++;
> +
>  			val_list[n] = "";
>  			len_list[n] = 0;
> +			n++;
>  		}
> -		n++;
>  		var = php_strtok_r(NULL, separator, &strtok_buf);
>  	} 
>  	num = n; /* make sure to process initilized vars only */