ID:               45706
 Updated by:       [EMAIL PROTECTED]
 Reported By:      bobka at bigfoot dot com
-Status:           Open
+Status:           Feedback
 Bug Type:         Session related
 Operating System: Linux
 PHP Version:      5.2.6
 New Comment:

Does this happen only with the ArrayIterator?


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

[2008-08-06 08:45:17] bobka at bigfoot dot com

The bug is somewhere in "php" or "php_bin" serialize_handler that is
used to serialize _SESSION

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

[2008-08-06 08:38:06] bobka at bigfoot dot com

To define the class before session_start is the usual case. But if two
applications use the same session data, where one part of session data
is shared between applications and other are used exclusively, you don't
have to include *all* class definitions in each application. In this
case the part of session data, that is not defined, should be preserved
and not corrupted, shouldn't it?

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

[2008-08-04 12:51:07] [EMAIL PROTECTED]

The class has to be defined before session_start() call.
Documentation for session seems to lack this little note..

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

[2008-08-04 12:20:45] bobka at bigfoot dot com

Description:
------------
This is a very special case.

If an object of class that extends ArrayIterator is saved in session
data and the class definition is not available in a later call, then the
session data gets corrupted.

Call the example code three times to see the bug.

Reproduce code:
---------------
<?php
// start session
session_start();

// display session data
echo "<pre>".print_r($_SESSION,true)."</pre><br>";

// already initialized?
if (!isset($_SESSION['first']))
{
  // bug occures only if the class is not defined later
  // and only if it extends ArrayIterator
  class my_array extends ArrayIterator
  {
  }

  $_SESSION['first'] = "The first entry is ok";

  $t = new my_array();
  
  // at least one member needed
  $t[] = "this gets lost";

  $_SESSION['killer'] = $t;

  $_SESSION['this_is_going_to_be_messed_up'] = "The value of the entry
is ok";

  $_SESSION['last'] = "The last entry is ok";
}


Expected result:
----------------
At first call:
Array
(
)

At second call:
Array
(
    [first] => The first entry is ok
    [killer] => __PHP_Incomplete_Class Object
        (
            [__PHP_Incomplete_Class_Name] => my_array
            [0] => this gets lost
        )

    [this_is_going_to_be_messed_up] => The value of the entry is ok
    [last] => The last entry is ok
)

At third call
Array
(
    [first] => The first entry is ok
    [killer] => __PHP_Incomplete_Class Object
        (
            [__PHP_Incomplete_Class_Name] => my_array
            [0] => this gets lost
        )

    [this_is_going_to_be_messed_up] => The value of the entry is ok
    [last] => The last entry is ok
)


Actual result:
--------------
At third call:

Notice: session_start() [function.session-start]: Unexpected end of
serialized data in test.php on line 3

Array
(
    [first] => The first entry is ok
    [killer] => 
    [}this_is_going_to_be_messed_up] => The value of the entry is ok
    [last] => The last entry is ok
)



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


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

Reply via email to