Edit report at https://bugs.php.net/bug.php?id=65806&edit=1

 ID:                 65806
 Updated by:         m...@php.net
 Reported by:        sysadmin at interexa dot de
 Summary:            unserialize fails with object which is referenced
                     multiple times
-Status:             Open
+Status:             Not a bug
 Type:               Bug
 Package:            *General Issues
 Operating System:   linux
 PHP Version:        5.4.20
 Block user comment: N
 Private report:     N

 New Comment:

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

The serialization context is reset and non-recursive in __sleep and __wakeup, 
so if you serialize something in __sleep, you have to unserialize it in 
__wakeup.


Previous Comments:
------------------------------------------------------------------------
[2013-10-02 07:56:18] sysadmin at interexa dot de

Description:
------------
Running the testscript fails. The second reference to Object A is null after 
unserialize.
This happens in PHP 5.4.x as well as  PHP 5.5.4.

Maybe this bug is related to bug 65724. 

Test script:
---------------
<?php
class myObjA {}
class myObjB {
    public $attrA;
    public $attrB;
}
class myObjC {
    public $attrC;
    public $attrD;
}
class myList {
    private $_serialized;
    private $_obj;

    public function __construct($obj)
    {
        $this->_obj = $obj;
        $this->_serialized = serialize($this->_obj);
    }
    public function get()
    {
        return unserialize($this->_serialized);
    }
    public function __sleep()
    {
        $this->_serialized = serialize($this->_obj);
        return array(
            "\0" . __CLASS__ . "\0_serialized",
        );
    }
}

echo "SCRIPT START" . PHP_EOL;

$objA = new myObjA();
$objB = new myObjB();
$objC = new myObjC();

$objB->attrA = new ArrayIterator();
$objB->attrB = $objA;

$objC->attrC = $objB;
$objC->attrD = $objA;

$list = new myList($objC);

echo 'check ' . check($list->get()) . PHP_EOL;

file_put_contents('serialize.dmp', serialize($list));

echo "start serialize/unserialize" . PHP_EOL;
$newList = unserialize(serialize($list));
echo "finish serialize/unserialize" . PHP_EOL;

//after unserialize the property myObjC::attrD is null instead of expected 
object
echo 'check ' . check($newList->get()) . PHP_EOL;

echo "SCRIPT END" . PHP_EOL ;

function check(myObjC $obj) {

    if (!is_object($obj->attrC)) {
        return 'failed (myObjC::attrC => ' . var_export($obj->attrC, true) . 
')';
    }
    if (!is_object($obj->attrD)) {
        return 'failed (myObjC::attrD => ' . var_export($obj->attrD, true) . 
')';
    }
    return 'successful';
}

Expected result:
----------------
SCRIPT START
check successful
start serialize/unserialize
finish serialize/unserialize
check successful
SCRIPT END


Actual result:
--------------
SCRIPT START
check successful
start serialize/unserialize
finish serialize/unserialize
check failed (myObjC::attrD => NULL)
SCRIPT END



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



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

Reply via email to