Re: cvs: php-src(PHP_5_2) / NEWS /ext/wddx wddx.c /ext/wddx/tests bug41283.phpt

From: Date: Tue, 08 May 2007 09:36:33 +0000
Subject: Re: cvs: php-src(PHP_5_2) / NEWS /ext/wddx wddx.c /ext/wddx/tests bug41283.phpt
References: 1  Groups: php.cvs php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
Hi Ilia, all,

I've attached patches for what I think is a better fix here, and it
simplifies the code.  Looking at the CVS log, the is_numeric_string() usage
was added in version 1.120 to fix the first numeric key bug.  The simple,
better thing would've been to just change zend_hash... to zend_symtable...,
as I've done now.  Ilia, this is basically the same fix as Bug #38464 for
array_count_values().

Again, the "symtable" function will handle numeric string keys as elsewhere
in PHP.  The only thing that changes from the current code is that strings
with leading whitespace, + sign, or 0s won't be considered numeric again
(e.g. back to behavior before the "symtable" functions were created), which
should be correct if you don't want more future bug reports. ;-)


Matt


----- Original Message -----
From: "Ilia Alshanetsky"
Sent: Saturday, May 05, 2007

> iliaa Sat May  5 15:14:56 2007 UTC
>
>   Added files:                 (Branch: PHP_5_2)
>     /php-src/ext/wddx/tests bug41283.phpt
>
>   Modified files:
>     /php-src NEWS
>     /php-src/ext/wddx wddx.c
>   Log:
>
>   Fixed bug #41283 (Bug with serializing array key that are doubles or
>   floats).
>
>
http://cvs.php.net/viewvc.cgi/php-src/ext/wddx/wddx.c?r1=1.119.2.10.2.15&r2=1.119.2.10.2.16&diff_format=u
> Index: php-src/ext/wddx/wddx.c
> diff -u php-src/ext/wddx/wddx.c:1.119.2.10.2.15
php-src/ext/wddx/wddx.c:1.119.2.10.2.16
> --- php-src/ext/wddx/wddx.c:1.119.2.10.2.15 Sun Mar  4 04:38:43 2007
> +++ php-src/ext/wddx/wddx.c Sat May  5 15:14:56 2007
> @@ -16,7 +16,7 @@
>
+----------------------------------------------------------------------+
>   */
>
> -/* $Id: wddx.c,v 1.119.2.10.2.15 2007/03/04 04:38:43 stas Exp $ */
> +/* $Id: wddx.c,v 1.119.2.10.2.16 2007/05/05 15:14:56 iliaa Exp $ */
>
>  #ifdef HAVE_CONFIG_H
>  #include "config.h"
> @@ -984,6 +984,9 @@
>   goto bigint;
>   }
>   l = (long) d;
> + if (l != d) {
> + goto bigint;
> + }
>   case IS_LONG:
>   zend_hash_index_update(target_hash, l, &ent1->data, sizeof(zval *),
NULL);
>   break;
>


Index: ext/wddx/wddx.c =================================================================== RCS file: /repository/php-src/ext/wddx/wddx.c,v retrieving revision 1.144 diff -u -r1.144 wddx.c --- ext/wddx/wddx.c 24 Feb 2007 16:25:55 -0000 1.144 +++ ext/wddx/wddx.c 8 May 2007 09:07:59 -0000 @@ -975,22 +975,7 @@ add_property_zval(ent2->data, ent1->varname, ent1->data); EG(scope) = old_scope; } else { - long l; - double d; - - switch (is_numeric_string(ent1->varname, strlen(ent1->varname), &l, &d, 0)) { - case IS_DOUBLE: - if (d > INT_MAX) { - goto bigint; - } - l = (long) d; - case IS_LONG: - zend_hash_index_update(target_hash, l, &ent1->data, sizeof(zval *), NULL); - break; - default: -bigint: - zend_hash_update(target_hash,ent1->varname, strlen(ent1->varname)+1, &ent1->data, sizeof(zval *), NULL); - } + zend_symtable_update(target_hash, ent1->varname, strlen(ent1->varname)+1, &ent1->data, sizeof(zval *), NULL); } efree(ent1->varname); } else { Index: ext/wddx/wddx.c =================================================================== RCS file: /repository/php-src/ext/wddx/wddx.c,v retrieving revision 1.119.2.10.2.16 diff -u -r1.119.2.10.2.16 wddx.c --- ext/wddx/wddx.c 5 May 2007 15:14:56 -0000 1.119.2.10.2.16 +++ ext/wddx/wddx.c 8 May 2007 09:08:34 -0000 @@ -974,26 +974,7 @@ add_property_zval(ent2->data, ent1->varname, ent1->data); EG(scope) = old_scope; } else { - long l; - double d; - int varname_len = strlen(ent1->varname); - - switch (is_numeric_string(ent1->varname, varname_len, &l, &d, 0)) { - case IS_DOUBLE: - if (d > INT_MAX) { - goto bigint; - } - l = (long) d; - if (l != d) { - goto bigint; - } - case IS_LONG: - zend_hash_index_update(target_hash, l, &ent1->data, sizeof(zval *), NULL); - break; - default: -bigint: - zend_hash_update(target_hash,ent1->varname, varname_len + 1, &ent1->data, sizeof(zval *), NULL); - } + zend_symtable_update(target_hash, ent1->varname, strlen(ent1->varname)+1, &ent1->data, sizeof(zval *), NULL); } efree(ent1->varname); } else {

Thread (2 messages)

« previous php.internals (#29315) next »