ID:          26156
 Updated by:  [EMAIL PROTECTED]
 Reported By: jan at kneschke dot de
-Status:      Assigned
+Status:      Closed
 Bug Type:    Zend Engine 2 problem
 PHP Version: 5CVS-2003-11-06 (dev)
 Assigned To: moriyoshi
 New Comment:

This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.




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

[2003-11-06 20:48:15] [EMAIL PROTECTED]

This is due to my premature patch lately applied on
zend_object_handlers.c. Assigning to me.


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

[2003-11-06 19:41:01] jan at kneschke dot de

Description:
------------
While the summary is a bit technical it the describes the 
actual problem very good: 
 
all over the code of the Zend Engine there are temporary 
zval's that find there way to REPLACE_ZVAL_VALUE which 
'calls' SEPARATE_ZVAL_IF_NOT_REF and even tries to 
destrory the temporary zval with zval_dtor(). 
 
SEPARATE_ZVAL_IF_NOT_REF expands to ...->is_ref what is an 
read to an un-init element, the zval_dtor() is an illegal 
free() call. 
 
First occurence: 
zend_operators.c:494 
 
zval tmp; 
if (op->value.obj.handlers->cast_object(op, &tmp, 
IS_STRING, 1 TSRMLS_CC) == SUCCESS) { 
  ... 
 
and '&tmp' is passed to zend_std_cast_object() which will 
result in a REPLACE_ZVAL_VALUE() 
 
another path to the same problem: 
zend.c:266 zend_print_zval_ex() 
 
zval expr_copy; 
zend_make_printable_zval(expr, &expr_copy, &use_copy); 
 
 
My solution for this kind of coding error is to use pzval 
for this job: 
 
diff -u -r1.164 zend_operators.c 
--- Zend/zend_operators.c       18 Sep 2003 11:50:05 -0000      
1.164 
+++ Zend/zend_operators.c       7 Nov 2003 00:39:23 -0000 
@@ -492,12 +492,17 @@ 
                        break; 
                case IS_OBJECT: 
                        if 
(op->value.obj.handlers->cast_object) { 
-                               zval tmp; 
+                               zval *tmp; 
                                TSRMLS_FETCH(); 
-                               if 
(op->value.obj.handlers->cast_object(op, &tmp, IS_STRING, 
1 TSRMLS_CC) == SUCCESS) { 
+ 
+                               MAKE_STD_ZVAL(tmp); 
+ 
+                               if 
(op->value.obj.handlers->cast_object(op, tmp, IS_STRING, 1 
TSRMLS_CC) == SUCCESS) { 
                                        zval_dtor(op); 
-                                       *op = tmp; 
+                                       *op = *tmp; 
                                        break; 
+                               } else { 
+                                       zval_dtor(tmp); 
                                } 
                                zend_error(E_NOTICE, 
"Object of class %s could not be converted to string", 
Z_OBJCE_P(op)->name); 
                        } else { 
 
 
 
zend_print_zval_ex() has to be fixed accordingly. 
 
valgrind helped me to catch this bug. 
 
and a last notice: MACROs with such side-effects are evil. 

Reproduce code:
---------------
<?php print new reflection_class('stdclass'); ?>



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


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

Reply via email to