cvs: ZendEngine2(PHP_5_3) / zend_compile.c zend_compile.h zend_language_parser.y zend_vm_def.h zend_vm_execute.h /tests bug45178.phpt
"Dmitry Stogov" <[email protected]>
| Newsgroups | gmane.comp.php.cvs.zend |
|---|---|
| Message-ID | <cvsdmitry1216900074@cvsserver> |
dmitry Thu Jul 24 11:47:54 2008 UTC
Added files: (Branch: PHP_5_3)
/ZendEngine2/tests bug45178.phpt
Modified files:
/ZendEngine2 zend_compile.c zend_compile.h zend_language_parser.y
zend_vm_def.h zend_vm_execute.h
Log:
Fixed bug #45178 (memory corruption on assignment result of "new" by reference)
--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
dmitry-20080724114754.txt
(text/plain, 10 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.73&r2=1.647.2.27.2.41.2.74&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.73 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.74
--- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.73 Thu Jul 17 19:29:34 2008
+++ ZendEngine2/zend_compile.c Thu Jul 24 11:47:49 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.73 2008/07/17 19:29:34 felipe Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.74 2008/07/24 11:47:49 dmitry Exp $ */
#include <zend_language_parser.h>
#include "zend.h"
@@ -683,6 +683,8 @@
opline->opcode = ZEND_ASSIGN_REF;
if (zend_is_function_or_method_call(rvar)) {
opline->extended_value = ZEND_RETURNS_FUNCTION;
+ } else if (rvar->u.EA.type & ZEND_PARSED_NEW) {
+ opline->extended_value = ZEND_RETURNS_NEW;
} else {
opline->extended_value = 0;
}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.316.2.8.2.12.2.26&r2=1.316.2.8.2.12.2.27&diff_format=u
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.26 ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.27
--- ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.26 Mon Jul 14 09:49:00 2008
+++ ZendEngine2/zend_compile.h Thu Jul 24 11:47:49 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.h,v 1.316.2.8.2.12.2.26 2008/07/14 09:49:00 dmitry Exp $ */
+/* $Id: zend_compile.h,v 1.316.2.8.2.12.2.27 2008/07/24 11:47:49 dmitry Exp $ */
#ifndef ZEND_COMPILE_H
#define ZEND_COMPILE_H
@@ -645,6 +645,7 @@
#define ZEND_PARSED_FUNCTION_CALL (1<<3)
#define ZEND_PARSED_VARIABLE (1<<4)
#define ZEND_PARSED_REFERENCE_VARIABLE (1<<5)
+#define ZEND_PARSED_NEW (1<<6)
/* unset types */
@@ -725,6 +726,7 @@
#define ZEND_RETURNS_FUNCTION 1<<0
+#define ZEND_RETURNS_NEW 1<<1
END_EXTERN_C()
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.8.2.22&r2=1.160.2.4.2.8.2.23&diff_format=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.22 ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.23
--- ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.22 Mon Jul 14 09:49:00 2008
+++ ZendEngine2/zend_language_parser.y Thu Jul 24 11:47:49 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.22 2008/07/14 09:49:00 dmitry Exp $ */
+/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.23 2008/07/24 11:47:49 dmitry Exp $ */
/*
* LALR shift/reduce conflicts and how they are resolved:
@@ -576,7 +576,7 @@
T_LIST '(' { zend_do_list_init(TSRMLS_C); } assignment_list ')' '=' expr { zend_do_list_end(&$$, &$7 TSRMLS_CC); }
| variable '=' expr { zend_check_writable_variable(&$1); zend_do_assign(&$$, &$1, &$3 TSRMLS_CC); }
| variable '=' '&' variable { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$4, BP_VAR_W, 1 TSRMLS_CC); zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); zend_do_assign_ref(&$$, &$1, &$4 TSRMLS_CC); }
- | variable '=' '&' T_NEW class_name_reference { zend_error(E_DEPRECATED, "Assigning the return value of new by reference is deprecated"); zend_check_writable_variable(&$1); zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$4, &$5 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$3, &$4, &$7 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); zend_do_assign_ref(&$$, &$1, &$3 TSRMLS_CC); }
+ | variable '=' '&' T_NEW class_name_reference { zend_error(E_DEPRECATED, "Assigning the return value of new by reference is deprecated"); zend_check_writable_variable(&$1); zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$4, &$5 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$3, &$4, &$7 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); $3.u.EA.type = ZEND_PARSED_NEW; zend_do_assign_ref(&$$, &$1, &$3 TSRMLS_CC); }
| T_NEW class_name_reference { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$1, &$2 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
| T_CLONE expr { zend_do_clone(&$$, &$2 TSRMLS_CC); }
| variable T_PLUS_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 TSRMLS_CC); }
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.61&r2=1.59.2.29.2.48.2.62&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.61 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.62
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.61 Thu Jul 24 09:42:15 2008
+++ ZendEngine2/zend_vm_def.h Thu Jul 24 11:47:49 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.61 2008/07/24 09:42:15 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.62 2008/07/24 11:47:49 dmitry Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -1624,6 +1624,8 @@
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN);
+ } else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ PZVAL_LOCK(*value_ptr_ptr);
}
if (OP1_TYPE == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
zend_error(E_ERROR, "Cannot assign by reference to overloaded object");
@@ -1636,6 +1638,10 @@
}
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
+ if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ Z_DELREF_PP(variable_ptr_ptr);
+ }
+
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.61&r2=1.62.2.30.2.49.2.62&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.61 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.62
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.61 Thu Jul 24 09:42:15 2008
+++ ZendEngine2/zend_vm_execute.h Thu Jul 24 11:47:49 2008
@@ -13825,6 +13825,8 @@
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ PZVAL_LOCK(*value_ptr_ptr);
}
if (IS_VAR == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
zend_error(E_ERROR, "Cannot assign by reference to overloaded object");
@@ -13837,6 +13839,10 @@
}
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
+ if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ Z_DELREF_PP(variable_ptr_ptr);
+ }
+
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
@@ -16245,6 +16251,8 @@
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
return ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ PZVAL_LOCK(*value_ptr_ptr);
}
if (IS_VAR == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
zend_error(E_ERROR, "Cannot assign by reference to overloaded object");
@@ -16257,6 +16265,10 @@
}
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
+ if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ Z_DELREF_PP(variable_ptr_ptr);
+ }
+
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
@@ -27120,6 +27132,8 @@
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ PZVAL_LOCK(*value_ptr_ptr);
}
if (IS_CV == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
zend_error(E_ERROR, "Cannot assign by reference to overloaded object");
@@ -27132,6 +27146,10 @@
}
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
+ if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ Z_DELREF_PP(variable_ptr_ptr);
+ }
+
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
@@ -29317,6 +29335,8 @@
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
return ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ PZVAL_LOCK(*value_ptr_ptr);
}
if (IS_CV == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
zend_error(E_ERROR, "Cannot assign by reference to overloaded object");
@@ -29329,6 +29349,10 @@
}
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
+ if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
+ Z_DELREF_PP(variable_ptr_ptr);
+ }
+
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug45178.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug45178.phpt
+++ ZendEngine2/tests/bug45178.phpt