colder Tue, 06 Oct 2009 13:34:56 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=289250
Log: Fix bug #49263 (Offset error when unserializing self-references in SplObjectStorage) Bug: http://bugs.php.net/49263 (Assigned) SplObjectStorage fails to serialize references Changed paths: U php/php-src/branches/PHP_5_2/ext/spl/spl_observer.c U php/php-src/branches/PHP_5_3/ext/spl/spl_observer.c A php/php-src/branches/PHP_5_3/ext/spl/tests/bug49263.phpt U php/php-src/trunk/ext/spl/spl_observer.c A php/php-src/trunk/ext/spl/tests/bug49263.phpt Modified: php/php-src/branches/PHP_5_2/ext/spl/spl_observer.c =================================================================== --- php/php-src/branches/PHP_5_2/ext/spl/spl_observer.c 2009-10-06 12:53:01 UTC (rev 289249) +++ php/php-src/branches/PHP_5_2/ext/spl/spl_observer.c 2009-10-06 13:34:56 UTC (rev 289250) @@ -348,7 +348,7 @@ ++p; ALLOC_INIT_ZVAL(pcount); - if (!php_var_unserialize(&pcount, &p, s + buf_len, &var_hash TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { + if (!php_var_unserialize(&pcount, &p, s + buf_len, NULL TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { zval_ptr_dtor(&pcount); goto outexcept; } Modified: php/php-src/branches/PHP_5_3/ext/spl/spl_observer.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/spl/spl_observer.c 2009-10-06 12:53:01 UTC (rev 289249) +++ php/php-src/branches/PHP_5_3/ext/spl/spl_observer.c 2009-10-06 13:34:56 UTC (rev 289250) @@ -622,7 +622,7 @@ ++p; ALLOC_INIT_ZVAL(pcount); - if (!php_var_unserialize(&pcount, &p, s + buf_len, &var_hash TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { + if (!php_var_unserialize(&pcount, &p, s + buf_len, NULL TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { zval_ptr_dtor(&pcount); goto outexcept; } Added: php/php-src/branches/PHP_5_3/ext/spl/tests/bug49263.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/spl/tests/bug49263.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/spl/tests/bug49263.phpt 2009-10-06 13:34:56 UTC (rev 289250) @@ -0,0 +1,54 @@ +--TEST-- +SPL: SplObjectStorage serialization references +--SKIPIF-- +<?php if (!extension_loaded("spl")) print "skip"; ?> +--FILE-- +<?php +$o1 = new stdClass; +$o2 = new stdClass; + +$s = new splObjectStorage(); + +$s->attach($o1, array('prev' => 2, 'next' => $o2)); +$s->attach($o2, array('prev' => $o1)); + +$ss = serialize($s); +unset($s,$o1,$o2); +echo $ss."\n"; +var_dump(unserialize($ss)); +?> +===DONE=== +--EXPECTF-- +C:16:"SplObjectStorage":113:{x:i:2;O:8:"stdClass":0:{},a:2:{s:4:"prev";i:2;s:4:"next";O:8:"stdClass":0:{}};r:4;,a:1:{s:4:"prev";r:1;};m:a:0:{}} +object(SplObjectStorage)#2 (1) { + ["storage":"SplObjectStorage":private]=> + array(2) { + ["%s"]=> + array(2) { + ["obj"]=> + object(stdClass)#1 (0) { + } + ["inf"]=> + array(2) { + ["prev"]=> + int(2) + ["next"]=> + object(stdClass)#3 (0) { + } + } + } + ["%s"]=> + array(2) { + ["obj"]=> + object(stdClass)#3 (0) { + } + ["inf"]=> + array(1) { + ["prev"]=> + object(stdClass)#1 (0) { + } + } + } + } +} +===DONE=== Modified: php/php-src/trunk/ext/spl/spl_observer.c =================================================================== --- php/php-src/trunk/ext/spl/spl_observer.c 2009-10-06 12:53:01 UTC (rev 289249) +++ php/php-src/trunk/ext/spl/spl_observer.c 2009-10-06 13:34:56 UTC (rev 289250) @@ -625,7 +625,7 @@ ++p; ALLOC_INIT_ZVAL(pcount); - if (!php_var_unserialize(&pcount, &p, s + buf_len, &var_hash TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { + if (!php_var_unserialize(&pcount, &p, s + buf_len, NULL TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { zval_ptr_dtor(&pcount); goto outexcept; } Added: php/php-src/trunk/ext/spl/tests/bug49263.phpt =================================================================== --- php/php-src/trunk/ext/spl/tests/bug49263.phpt (rev 0) +++ php/php-src/trunk/ext/spl/tests/bug49263.phpt 2009-10-06 13:34:56 UTC (rev 289250) @@ -0,0 +1,54 @@ +--TEST-- +SPL: SplObjectStorage serialization references +--SKIPIF-- +<?php if (!extension_loaded("spl")) print "skip"; ?> +--FILE-- +<?php +$o1 = new stdClass; +$o2 = new stdClass; + +$s = new splObjectStorage(); + +$s->attach($o1, array('prev' => 2, 'next' => $o2)); +$s->attach($o2, array('prev' => $o1)); + +$ss = serialize($s); +unset($s,$o1,$o2); +echo $ss."\n"; +var_dump(unserialize($ss)); +?> +===DONE=== +--EXPECTF-- +C:16:"SplObjectStorage":113:{x:i:2;O:8:"stdClass":0:{},a:2:{U:4:"prev";i:2;U:4:"next";O:8:"stdClass":0:{}};r:4;,a:1:{U:4:"prev";r:1;};m:a:0:{}} +object(SplObjectStorage)#2 (1) { + [u"storage":u"SplObjectStorage":private]=> + array(2) { + ["%s"]=> + array(2) { + ["obj"]=> + object(stdClass)#1 (0) { + } + ["inf"]=> + array(2) { + [u"prev"]=> + int(2) + [u"next"]=> + object(stdClass)#3 (0) { + } + } + } + ["%s"]=> + array(2) { + ["obj"]=> + object(stdClass)#3 (0) { + } + ["inf"]=> + array(1) { + [u"prev"]=> + object(stdClass)#1 (0) { + } + } + } + } +} +===DONE===
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php