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

Reply via email to