#19493 [Opn->Fbk]: Error in older versions of serializer results in error of currend deserializer

From: Date: Thu, 19 Sep 2002 14:05:16 +0000
Subject: #19493 [Opn->Fbk]: Error in older versions of serializer results in error of currend deserializer
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-19751@lists.php.net to get a copy of this message
 ID:               19493
 Updated by:       sander@php.net
 Reported By:      matthias.boldt@ticket-web.de
-Status:           Open
+Status:           Feedback
 Bug Type:         Session related
 Operating System: Linux 2.4.18
 PHP Version:      4.2.3
 New Comment:

Please supply a unified diff here.


Previous Comments:
------------------------------------------------------------------------

[2002-09-19 04:53:25] matthias.boldt@ticket-web.de

I've changed thd category ...

------------------------------------------------------------------------

[2002-09-19 04:38:19] matthias.boldt@ticket-web.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


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=19493&edit=1



Thread (9 messages)

« previous php.bugs (#19751) next »