|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-09-19 04:38 UTC] matthias dot boldt at ticket-web dot de
There was an error in older versions (4.1.0) of the serializer code (it's possible the error is in the current code, too): some times, the element-count for objects was to hight.
The old deserializer-code seams to ignore this problem. The new code has problems with that issue. We have many huge databases with serialized structures at some points. Thats why, we must use the old data :-(
I've fixed the problem with a little change in ext/standard/var_unserializer.re, function process_nested_data :
static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, int elements)
{
while (elements-- > 0) {
zval *key, *data;
ALLOC_INIT_ZVAL(key);
if (!php_var_unserialize(&key, p, max, NULL TSRMLS_CC)) {
zval_dtor(key);
FREE_ZVAL(key);
} else {
ALLOC_INIT_ZVAL(data);
if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) {
zval_dtor(key);
FREE_ZVAL(key);
zval_dtor(data);
FREE_ZVAL(data);
} else {
switch (Z_TYPE_P(key)) {
case IS_LONG:
zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL);
break;
case IS_STRING:
zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL);
break;
}
zval_dtor(key);
FREE_ZVAL(key);
}
}
}
return 1;
}
Now, it doesn't have a problem with to hight element counters. It would be great, if the developer of the new deserializer-code could look at this change and eventually
integrate it into the CVS-tree.
Greetings from Berlin,
Matthias
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 06 11:00:01 2025 UTC |
There is the diff: --- ext/standard/var_unserializer.re.old Thu Sep 19 16:34:32 2002 +++ ext/standard/var_unserializer.re Thu Sep 19 11:20:08 2002 @@ -144,31 +144,29 @@ if (!php_var_unserialize(&key, p, max, NULL TSRMLS_CC)) { zval_dtor(key); FREE_ZVAL(key); - return 0; - } - - ALLOC_INIT_ZVAL(data); - - if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) { - zval_dtor(key); - FREE_ZVAL(key); - zval_dtor(data); - FREE_ZVAL(data); - return 0; - } + } else { + ALLOC_INIT_ZVAL(data); - switch (Z_TYPE_P(key)) { - case IS_LONG: - zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); - break; - case IS_STRING: - zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); - break; + if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) { + zval_dtor(key); + FREE_ZVAL(key); + zval_dtor(data); + FREE_ZVAL(data); + } else { + switch (Z_TYPE_P(key)) { + case IS_LONG: + zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); + break; + case IS_STRING: + zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); + break; - } + } - zval_dtor(key); - FREE_ZVAL(key); + zval_dtor(key); + FREE_ZVAL(key); + } + } } return 1; @@ -396,9 +394,9 @@ } "}" { - /* this is the case where we have less data than planned */ + // this is the case where we have less data than planned zend_error(E_NOTICE, "Unexpected end of serialized data"); - return 0; /* not sure if it should be 0 or 1 here? */ + return 0; // not sure if it should be 0 or 1 here? } any { return 0; }Hello, there is a new patch (without C++-comments :-): --- ext/standard/var_unserializer.re.old Thu Sep 19 16:34:32 2002 +++ ext/standard/var_unserializer.re Fri Sep 20 09:07:25 2002 @@ -144,31 +144,29 @@ if (!php_var_unserialize(&key, p, max, NULL TSRMLS_CC)) { zval_dtor(key); FREE_ZVAL(key); - return 0; - } - - ALLOC_INIT_ZVAL(data); - - if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) { - zval_dtor(key); - FREE_ZVAL(key); - zval_dtor(data); - FREE_ZVAL(data); - return 0; - } + } else { + ALLOC_INIT_ZVAL(data); - switch (Z_TYPE_P(key)) { - case IS_LONG: - zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); - break; - case IS_STRING: - zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); - break; + if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) { + zval_dtor(key); + FREE_ZVAL(key); + zval_dtor(data); + FREE_ZVAL(data); + } else { + switch (Z_TYPE_P(key)) { + case IS_LONG: + zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); + break; + case IS_STRING: + zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); + break; - } + } - zval_dtor(key); - FREE_ZVAL(key); + zval_dtor(key); + FREE_ZVAL(key); + } + } } return 1;