cvs: ZendEngine2 / zend_vm_def.h zend_vm_execute.h /tests bug47109.phpt

[email protected] ("Dmitry Stogov") Thu, 15 Jan 2009 08:49:11 -0000
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1232009351@cvsserver>
dmitry		Thu Jan 15 08:49:11 2009 UTC

  Modified files:              
    /ZendEngine2	zend_vm_def.h zend_vm_execute.h 
    /ZendEngine2/tests	bug47109.phpt 
  Log:
  Fixed bug #47109 (Memory leak on $a->{"a"."b"} when $a is not an object)
dmitry-20090115084911.txt (text/plain, 11.4 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.254&r2=1.255&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.254 ZendEngine2/zend_vm_def.h:1.255
--- ZendEngine2/zend_vm_def.h:1.254	Sat Jan 10 19:14:27 2009
+++ ZendEngine2/zend_vm_def.h	Thu Jan 15 08:49:11 2009
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.254 2009/01/10 19:14:27 felipe Exp $ */
+/* $Id: zend_vm_def.h,v 1.255 2009/01/15 08:49:11 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -1273,12 +1273,15 @@
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
 	zval *container = GET_OP1_OBJ_ZVAL_PTR(type);
+	zend_free_op free_op2;
+	zval *offset  = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		FREE_OP2();
 		FREE_OP1();
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -1292,9 +1295,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		FREE_OP2();
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = GET_OP2_ZVAL_PTR(BP_VAR_R);
 		zval *retval;
 
 		if (IS_OP2_TMP_FREE()) {
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.258&r2=1.259&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.258 ZendEngine2/zend_vm_execute.h:1.259
--- ZendEngine2/zend_vm_execute.h:1.258	Sat Jan 10 19:14:27 2009
+++ ZendEngine2/zend_vm_execute.h	Thu Jan 15 08:49:11 2009
@@ -10326,11 +10326,14 @@
 	zend_free_op free_op1;
 	zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
 
+	zval *offset  = &opline->op2.u.constant;
+
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -10344,9 +10347,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
-	} else {
 
-		zval *offset  = &opline->op2.u.constant;
+	} else {
 		zval *retval;
 
 		if (0) {
@@ -12266,12 +12268,15 @@
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
 	zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		zval_dtor(free_op2.var);
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -12285,9 +12290,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		zval_dtor(free_op2.var);
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 		zval *retval;
 
 		if (1) {
@@ -14115,12 +14119,15 @@
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
 	zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -14134,9 +14141,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 		zval *retval;
 
 		if (0) {
@@ -16639,11 +16645,14 @@
 	zend_free_op free_op1;
 	zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
 
+	zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -16657,9 +16666,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
-	} else {
 
-		zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+	} else {
 		zval *retval;
 
 		if (0) {
@@ -18190,12 +18198,15 @@
 
 	zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
 
+	zval *offset  = &opline->op2.u.constant;
+
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -18208,9 +18219,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
-	} else {
 
-		zval *offset  = &opline->op2.u.constant;
+	} else {
 		zval *retval;
 
 		if (0) {
@@ -19387,12 +19397,15 @@
 	zend_op *opline = EX(opline);
 
 	zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		zval_dtor(free_op2.var);
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -19406,9 +19419,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		zval_dtor(free_op2.var);
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 		zval *retval;
 
 		if (1) {
@@ -20522,12 +20534,15 @@
 	zend_op *opline = EX(opline);
 
 	zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -20541,9 +20556,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 		zval *retval;
 
 		if (0) {
@@ -21928,12 +21942,15 @@
 
 	zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
 
+	zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -21946,9 +21963,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
-	} else {
 
-		zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+	} else {
 		zval *retval;
 
 		if (0) {
@@ -24884,12 +24900,15 @@
 
 	zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
 
+	zval *offset  = &opline->op2.u.constant;
+
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -24902,9 +24921,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
-	} else {
 
-		zval *offset  = &opline->op2.u.constant;
+	} else {
 		zval *retval;
 
 		if (0) {
@@ -26633,12 +26651,15 @@
 	zend_op *opline = EX(opline);
 
 	zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		zval_dtor(free_op2.var);
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -26652,9 +26673,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		zval_dtor(free_op2.var);
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 		zval *retval;
 
 		if (1) {
@@ -28360,12 +28380,15 @@
 	zend_op *opline = EX(opline);
 
 	zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -28379,9 +28402,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 		zval *retval;
 
 		if (0) {
@@ -30649,12 +30671,15 @@
 
 	zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
 
+	zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
 	if (container == EG(error_zval_ptr)) {
 		if (!RETURN_VALUE_UNUSED(&opline->result)) {
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
 			PZVAL_LOCK(EG(error_zval_ptr));
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -30667,9 +30692,8 @@
 			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
 			PZVAL_LOCK(EG(uninitialized_zval_ptr));
 		}
-	} else {
 
-		zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+	} else {
 		zval *retval;
 
 		if (0) {
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug47109.phpt?r1=1.1&r2=1.2&diff_format=u
Index: ZendEngine2/tests/bug47109.phpt
diff -u /dev/null ZendEngine2/tests/bug47109.phpt:1.2
--- /dev/null	Thu Jan 15 08:49:11 2009
+++ ZendEngine2/tests/bug47109.phpt	Thu Jan 15 08:49:11 2009
@@ -0,0 +1,11 @@
+--TEST--
+Bug #47109 (Memory leak on $a->{"a"."b"} when $a is not an object)
+--FILE--
+<?php
+$a->{"a"."b"};
+?>
+--EXPECTF--
+Notice: Undefined variable: a in %sbug47109.php on line 2
+
+Notice: Trying to get property of non-object in %sbug47109.php on line 2
+