ID: 14293 Updated by: zak Reported By: [EMAIL PROTECTED] Old Status: Open Status: Closed Bug Type: Session related Operating System: linux PHP Version: 4.2.0 New Comment:
It looks like this was corrected yesterday - closing. Please re-open if you have any concerns (or I am wrong) :) Previous Comments: ------------------------------------------------------------------------ [2001-11-29 21:37:42] [EMAIL PROTECTED] oops... sorry... i patches i posted aren't working :( here is (as i hope) the correct one: --- ../../php4/ext/standard/var.c Sat Nov 10 22:18:34 2001 +++ ext/standard/var.c Fri Nov 30 03:33:49 2001 @@ -198,27 +198,29 @@ int count = zend_hash_num_elements(HASH_OF(retval_ptr)); php_var_serialize_class_name(buf, struc TSRMLS_CC); - smart_str_append_long(buf, count); - smart_str_appendl(buf, ":{", 2); + if (count > 0) { char *key; zval **d, **name; ulong index; HashPosition pos; int i; - - zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos); + int cundef; + + smart_str buf2={0}; + cundef=0; + zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos); for (;; zend_hash_move_forward_ex(HASH_OF(retval_ptr), &pos)) { i = zend_hash_get_current_key_ex(HASH_OF(retval_ptr), &key, NULL, &index, 0, &pos); if (i == HASH_KEY_NON_EXISTANT) break; - + zend_hash_get_current_data_ex(HASH_OF(retval_ptr), (void **) &name, &pos); if (Z_TYPE_PP(name) != IS_STRING) { @@ -229,14 +231,24 @@ } if (zend_hash_find(Z_OBJPROP_PP(struc), Z_STRVAL_PP(name), Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) { - php_var_serialize_string(buf, Z_STRVAL_PP(name), + php_var_serialize_string(&buf2, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); - php_var_serialize_intern(buf, d, var_hash TSRMLS_CC); + php_var_serialize_intern(&buf2, d, var_hash +TSRMLS_CC); + } else { + cundef++; } } + // if (cundef>0) + // php_error(E_WARNING,"__sleep returned %d attributes, but some +(%d) were unset",count,cundef); + smart_str_append_long(buf, count-cundef); + smart_str_appendl(buf, ":{", 2); + smart_str_appendl(buf,buf2.c,buf2.len); + smart_str_free(&buf2); } + + smart_str_appendc(buf, '}'); } that seems to work... but sascha may fix it his way... cu ---bernd roemer--- (fumanchi) ------------------------------------------------------------------------ [2001-11-29 20:29:06] [EMAIL PROTECTED] hi... i found a bug in the serializer-function (current cvs 4.2.0-dev) which results in invalid serialised-strings. if you serialize an object which uses __sleep() to define the classnamevariables should be serialized, and some of this variables aren't initialized (isset()==flase), the serializer won't serialize these vars (OK). BUT he produces invalid strings because he doesn't use the correct value for the "number of object-attributes". O:1:"a":3:{s:5:"value";s:1:"a";} ^ ^ 3 parts are predicted.. but only 1 is provided. :( an example-script: <?php class a { function a() { $this->value="a"; } function __sleep() { return(array('a','b','value')); } } $a=new a(); echo serialize($a); ?> ok.. now.. i found two differend patches: the first (not my favourite) simply serializes uninitialized variables if they had bool(false) as value. ----------------------------------------------------------- --- ../../php4/ext/standard/var.c Sat Nov 10 22:18:34 2001 +++ ext/standard/var.c Fri Nov 30 01:22:05 2001 @@ -198,27 +198,34 @@ int count = zend_hash_num_elements(HASH_OF(retval_ptr)); php_var_serialize_class_name(buf, struc TSRMLS_CC); - smart_str_append_long(buf, count); - smart_str_appendl(buf, ":{", 2); + if (count > 0) { char *key; zval **d, **name; ulong index; HashPosition pos; int i; + int cundef; + smart_str_append_long(buf, count); + smart_str_appendl(buf, ":{", 2); + + cundef=0; zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos); - for (;; zend_hash_move_forward_ex(HASH_OF(retval_ptr), &pos)) { i = zend_hash_get_current_key_ex(HASH_OF(retval_ptr), &key, NULL, &index, 0, &pos); - if (i == HASH_KEY_NON_EXISTANT) + if (i == HASH_KEY_NON_EXISTANT) { + php_var_serialize_string(buf, Z_STRVAL_PP(name), +Z_STRLEN_PP(name)); + smart_str_appendl(buf, "b:0;", 4); + cundef++; break; - + } + zend_hash_get_current_data_ex(HASH_OF(retval_ptr), (void **) &name, &pos); if (Z_TYPE_PP(name) != IS_STRING) { @@ -234,9 +241,13 @@ Z_STRLEN_PP(name)); php_var_serialize_intern(buf, d, var_hash TSRMLS_CC); } } + if (cundef>0) + php_error(E_WARNING,"__sleep returned %d attributes, but some +(%d) were unset",count,cundef); } + + smart_str_appendc(buf, '}'); } the second (my favourite) just puts the correct value for number of psrts in the result: ----------------------------------------------------------- --- ../../php4/ext/standard/var.c Sat Nov 10 22:18:34 2001 +++ ext/standard/var.c Fri Nov 30 01:31:50 2001 @@ -198,27 +198,33 @@ int count = zend_hash_num_elements(HASH_OF(retval_ptr)); php_var_serialize_class_name(buf, struc TSRMLS_CC); - smart_str_append_long(buf, count); - smart_str_appendl(buf, ":{", 2); + if (count > 0) { char *key; zval **d, **name; ulong index; HashPosition pos; int i; - - zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos); + int cundef; + + smart_str buf2={0}; + cundef=0; + zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos); for (;; zend_hash_move_forward_ex(HASH_OF(retval_ptr), &pos)) { i = zend_hash_get_current_key_ex(HASH_OF(retval_ptr), &key, NULL, &index, 0, &pos); - if (i == HASH_KEY_NON_EXISTANT) + if (i == HASH_KEY_NON_EXISTANT) { +// php_var_serialize_string(&buf2, Z_STRVAL_PP(name), +Z_STRLEN_PP(name)); +// smart_str_appendl(&buf2, "b:0;", 4); + cundef++; break; - + } + zend_hash_get_current_data_ex(HASH_OF(retval_ptr), (void **) &name, &pos); if (Z_TYPE_PP(name) != IS_STRING) { @@ -229,14 +235,22 @@ } if (zend_hash_find(Z_OBJPROP_PP(struc), Z_STRVAL_PP(name), Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) { - php_var_serialize_string(buf, Z_STRVAL_PP(name), + php_var_serialize_string(&buf2, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); - php_var_serialize_intern(buf, d, var_hash TSRMLS_CC); + php_var_serialize_intern(&buf2, d, var_hash +TSRMLS_CC); } } + if (cundef>0) + php_error(E_WARNING,"__sleep returned %d attributes, but some +(%d) were unset",count,cundef); + smart_str_append_long(buf, count-cundef); + smart_str_appendl(buf, ":{", 2); + smart_str_appendl(buf,buf2.c,buf2.len); + smart_str_free(&buf2); } + + smart_str_appendc(buf, '}'); } regards ---bernd roemer--- (fumanchi) ------------------------------------------------------------------------ Edit this bug report at http://bugs.php.net/?id=14293&edit=1 -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]