cvs: ZendEngine2(PHP_5_2) / zend_vm_def.h zend_vm_execute.h /tests bug37707.phpt
| From: | Dmitry Stogov | Date: | Thu, 08 Jun 2006 08:56:28 +0000 |
| Subject: | cvs: ZendEngine2(PHP_5_2) / zend_vm_def.h zend_vm_execute.h /tests bug37707.phpt | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-5001@lists.php.net to get a copy of this message | ||
dmitry Thu Jun 8 08:56:28 2006 UTC
Modified files: (Branch: PHP_5_2)
/ZendEngine2 zend_vm_def.h zend_vm_execute.h
/ZendEngine2/tests bug37707.phpt
Log:
Proper fix for bug #37707 ("clone $x" must call __clone() enven if result value is not
used)
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.8&r2=1.59.2.29.2.9&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.8 ZendEngine2/zend_vm_def.h:1.59.2.29.2.9
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.8 Thu Jun 8 08:37:50 2006
+++ ZendEngine2/zend_vm_def.h Thu Jun 8 08:56:26 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.8 2006/06/08 08:37:50 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.9 2006/06/08 08:56:26 dmitry Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -2506,12 +2506,15 @@
}
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- if (!EG(exception) && RETURN_VALUE_USED(opline)) {
+ if (!EG(exception)) {
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
EX_T(opline->result.u.var).var.ptr->refcount=1;
EX_T(opline->result.u.var).var.ptr->is_ref=1;
+ if (!RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
+ }
}
FREE_OP1_IF_VAR();
ZEND_VM_NEXT_OPCODE();
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.8&r2=1.62.2.30.2.9&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.8 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.9
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.8 Thu Jun 8 08:37:50 2006
+++ ZendEngine2/zend_vm_execute.h Thu Jun 8 08:56:26 2006
@@ -1831,12 +1831,15 @@
}
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- if (!EG(exception) && RETURN_VALUE_USED(opline)) {
+ if (!EG(exception)) {
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
EX_T(opline->result.u.var).var.ptr->refcount=1;
EX_T(opline->result.u.var).var.ptr->is_ref=1;
+ if (!RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
+ }
}
ZEND_VM_NEXT_OPCODE();
@@ -4328,12 +4331,15 @@
}
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- if (!EG(exception) && RETURN_VALUE_USED(opline)) {
+ if (!EG(exception)) {
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
EX_T(opline->result.u.var).var.ptr->refcount=1;
EX_T(opline->result.u.var).var.ptr->is_ref=1;
+ if (!RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
+ }
}
ZEND_VM_NEXT_OPCODE();
@@ -7407,12 +7413,15 @@
}
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- if (!EG(exception) && RETURN_VALUE_USED(opline)) {
+ if (!EG(exception)) {
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
EX_T(opline->result.u.var).var.ptr->refcount=1;
EX_T(opline->result.u.var).var.ptr->is_ref=1;
+ if (!RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
+ }
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
@@ -14295,12 +14304,15 @@
}
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- if (!EG(exception) && RETURN_VALUE_USED(opline)) {
+ if (!EG(exception)) {
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
EX_T(opline->result.u.var).var.ptr->refcount=1;
EX_T(opline->result.u.var).var.ptr->is_ref=1;
+ if (!RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
+ }
}
ZEND_VM_NEXT_OPCODE();
@@ -19623,12 +19635,15 @@
}
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- if (!EG(exception) && RETURN_VALUE_USED(opline)) {
+ if (!EG(exception)) {
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
EX_T(opline->result.u.var).var.ptr->refcount=1;
EX_T(opline->result.u.var).var.ptr->is_ref=1;
+ if (!RETURN_VALUE_USED(opline)) {
+ zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
+ }
}
ZEND_VM_NEXT_OPCODE();
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/bug37707.phpt?r1=1.1.2.1&r2=1.1.2.2&diff_format=u
Index: ZendEngine2/tests/bug37707.phpt
diff -u ZendEngine2/tests/bug37707.phpt:1.1.2.1 ZendEngine2/tests/bug37707.phpt:1.1.2.2
--- ZendEngine2/tests/bug37707.phpt:1.1.2.1 Wed Jun 7 13:41:49 2006
+++ ZendEngine2/tests/bug37707.phpt Thu Jun 8 08:56:27 2006
@@ -2,10 +2,15 @@
Bug #37707 (clone without assigning leaks memory)
--FILE--
<?php
-class testme {}
+class testme {
+ function __clone() {
+ echo "clonned\n";
+ }
+}
clone new testme();
echo "NO LEAK\n";
?>
--EXPECT--
+clonned
NO LEAK