cvs: ZendEngine2(PHP_5_2) / zend_vm_def.h zend_vm_execute.h /tests bug47109.phpt php-src NEWS

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

  Added files:                 (Branch: PHP_5_2)
    /ZendEngine2/tests	bug47109.phpt 

  Modified files:              
    /php-src	NEWS 
    /ZendEngine2	zend_vm_def.h zend_vm_execute.h 
  Log:
  Fixed bug #47109 (Memory leak on $a->{"a"."b"} when $a is not an object)
dmitry-20090115084843.txt (text/plain, 11.4 KB)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1392&r2=1.2027.2.547.2.1393&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1392 php-src/NEWS:1.2027.2.547.2.1393
--- php-src/NEWS:1.2027.2.547.2.1392	Wed Jan 14 10:51:35 2009
+++ php-src/NEWS	Thu Jan 15 08:48:39 2009
@@ -17,6 +17,8 @@
 - Fixed bug in xml_error_string() which resulted in messages being
   off by one. (Scott)
 
+- Fixed bug #47109 (Memory leak on $a->{"a"."b"} when $a is not an object).
+  (Etienne, Dmitry)
 - Fixed bug #47042 (PHP cgi sapi is removing SCRIPT_FILENAME for non apache).
   (Sriram Natarajan)
 - Fixed bug #47037 (No error when using fopen with empty string). 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.62&r2=1.59.2.29.2.63&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.62 ZendEngine2/zend_vm_def.h:1.59.2.29.2.63
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.62	Sat Jan 10 20:30:48 2009
+++ ZendEngine2/zend_vm_def.h	Thu Jan 15 08:48:40 2009
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.62 2009/01/10 20:30:48 felipe Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.63 2009/01/15 08:48:40 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -1182,6 +1182,8 @@
 	zval *container;
 	zval **retval;
 	zend_free_op free_op1;
+	zend_free_op free_op2;
+	zval *offset  = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -1194,6 +1196,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		FREE_OP2();
 		FREE_OP1();
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -1206,10 +1209,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		FREE_OP2();
 	} else {
-		zend_free_op free_op2;
-		zval *offset  = GET_OP2_ZVAL_PTR(BP_VAR_R);
-
 		if (IS_OP2_TMP_FREE()) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.65&r2=1.62.2.30.2.66&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.65 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.66
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.65	Sat Jan 10 20:30:48 2009
+++ ZendEngine2/zend_vm_execute.h	Thu Jan 15 08:48:40 2009
@@ -9142,6 +9142,8 @@
 	zval **retval;
 	zend_free_op free_op1;
 
+	zval *offset  = &opline->op2.u.constant;
+
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
 
@@ -9153,6 +9155,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -9165,10 +9168,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
-	} else {
-
-		zval *offset  = &opline->op2.u.constant;
 
+	} else {
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -10660,6 +10661,8 @@
 	zval *container;
 	zval **retval;
 	zend_free_op free_op1;
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -10672,6 +10675,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		zval_dtor(free_op2.var);
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -10684,10 +10688,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		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);
-
 		if (1) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -12182,6 +12184,8 @@
 	zval *container;
 	zval **retval;
 	zend_free_op free_op1;
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -12194,6 +12198,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -12206,10 +12211,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		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);
-
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -14201,6 +14204,8 @@
 	zval **retval;
 	zend_free_op free_op1;
 
+	zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
 
@@ -14212,6 +14217,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+
 		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -14224,10 +14230,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
-	} else {
-
-		zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
 
+	} else {
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -15470,6 +15474,8 @@
 	zval **retval;
 
 
+	zval *offset  = &opline->op2.u.constant;
+
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
 
@@ -15482,6 +15488,7 @@
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -15493,10 +15500,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
-	} else {
-
-		zval *offset  = &opline->op2.u.constant;
 
+	} else {
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -16493,6 +16498,8 @@
 	zval *container;
 	zval **retval;
 
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -16505,6 +16512,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		zval_dtor(free_op2.var);
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -16517,10 +16525,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		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);
-
 		if (1) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -17473,6 +17479,8 @@
 	zval *container;
 	zval **retval;
 
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -17485,6 +17493,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -17497,10 +17506,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		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);
-
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -18719,6 +18726,8 @@
 	zval **retval;
 
 
+	zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
 
@@ -18731,6 +18740,7 @@
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -18742,10 +18752,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
-	} else {
-
-		zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
 
+	} else {
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -21299,6 +21307,8 @@
 	zval **retval;
 
 
+	zval *offset  = &opline->op2.u.constant;
+
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
 
@@ -21311,6 +21321,7 @@
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -21322,10 +21333,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
-	} else {
-
-		zval *offset  = &opline->op2.u.constant;
 
+	} else {
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -22809,6 +22818,8 @@
 	zval *container;
 	zval **retval;
 
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -22821,6 +22832,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		zval_dtor(free_op2.var);
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -22833,10 +22845,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		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);
-
 		if (1) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -24323,6 +24333,8 @@
 	zval *container;
 	zval **retval;
 
+	zend_free_op free_op2;
+	zval *offset  = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
 
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
@@ -24335,6 +24347,7 @@
 			PZVAL_LOCK(*retval);
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
+		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
 		ZEND_VM_NEXT_OPCODE();
 	}
@@ -24347,10 +24360,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
+		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);
-
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}
@@ -26332,6 +26343,8 @@
 	zval **retval;
 
 
+	zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
 	retval = &EX_T(opline->result.u.var).var.ptr;
 	EX_T(opline->result.u.var).var.ptr_ptr = retval;
 
@@ -26344,6 +26357,7 @@
 			AI_USE_PTR(EX_T(opline->result.u.var).var);
 		}
 
+
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -26355,10 +26369,8 @@
 		*retval = EG(uninitialized_zval_ptr);
 		SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
 		AI_USE_PTR(EX_T(opline->result.u.var).var);
-	} else {
-
-		zval *offset  = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
 
+	} else {
 		if (0) {
 			MAKE_REAL_ZVAL_PTR(offset);
 		}

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug47109.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug47109.phpt
+++ ZendEngine2/tests/bug47109.phpt