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

 ID:                 64354
 Updated by:         larue...@php.net
 Reported by:        alan at klestoff dot ru
 Summary:            Unserialize array of objects whose class can't be
                     autoloaded fail
 Status:             Open
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Debian
 PHP Version:        5.3.22
-Assigned To:        
+Assigned To:        mike
 Block user comment: N
 Private report:     N

 New Comment:

@mike, what do you think about the patch?  thanks


Previous Comments:
------------------------------------------------------------------------
[2013-03-06 04:39:59] larue...@php.net

there is one thing I am not sure now.

that is, if such exception threw, an notice of parse error will also be trigged

which is a little confused. since it is not actually an unserializing error

------------------------------------------------------------------------
[2013-03-05 08:08:05] larue...@php.net

the similar problem maybe also exists in wakeup/sleep etc , will check them 
later

------------------------------------------------------------------------
[2013-03-05 08:07:07] larue...@php.net

The following patch has been added/updated:

Patch Name: bug64354.patch
Revision:   1362470827
URL:        
https://bugs.php.net/patch-display.php?bug=64354&patch=bug64354.patch&revision=1362470827

------------------------------------------------------------------------
[2013-03-05 08:06:37] larue...@php.net

hmm, this is because one serializing triggered more than one exception.

quick patch attached.

------------------------------------------------------------------------
[2013-03-05 07:27:04] alan at klestoff dot ru

Description:
------------
We have serialized object of class A and array with 2 such objects

<?php
class A {}

echo serialize(new A()).PHP_EOL;
echo serialize(array(new A(), new A())).PHP_EOL;
?>

Then we write autoload function which throws exception if can't find a file 
with 
class.

And in first case - we have a normal behaviour (we can catch exception).
In second we have uncaughted exception. 

Test script:
---------------
<?php
  spl_autoload_register(
    function($class) {
                if (!file_exists($class.'.php'))
                        throw new Exception();

                require_once $class.'.php';
        }
  );
  
  try {
    var_dump(unserialize('O:1:"A":0:{}'));
    echo 'Serialized'.PHP_EOL;
  } catch (Exception $e) { 
    echo 'Failed'.PHP_EOL;
  }
  
  try {
    var_dump(unserialize('a:2:{i:0;O:1:"A":0:{}i:1;O:1:"A":0:{}}'));
    echo 'Serialized'.PHP_EOL;
  } catch (Exception $e) { 
    echo 'Failed'.PHP_EOL;
  }

Expected result:
----------------
Failed
Failed

Actual result:
--------------
Failed
PHP Fatal error:  Uncaught exception 'Exception' in -:5
Stack trace:
#0 [internal function]: {closure}('A')
#1 [internal function]: spl_autoload_call('A')
#2 -(20): unserialize('a:2:{i:0;O:1:"A...')
#3 {main}

Next exception 'Exception' in -:5
Stack trace:
#0 [internal function]: {closure}('A')
#1 -(0): spl_autoload_call('A')
#2 {main}
  thrown in - on line 5


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



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

Reply via email to