summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-10-03 09:05:14 +0000
committerDmitry Stogov <dmitry@php.net>2006-10-03 09:05:14 +0000
commit9875fe44e21cb98a274e1b8d0938ff1e13888012 (patch)
tree498ddfc3d0958050bc6f65ee90d5cc1cbf6bc376
parent62127575952c72a3c334a37b40265aa6af279767 (diff)
downloadphp-git-9875fe44e21cb98a274e1b8d0938ff1e13888012.tar.gz
Fixed bug #39017 (foreach(($obj = new myClass) as $v); echo $obj; segfaults)
-rw-r--r--NEWS2
-rwxr-xr-xZend/tests/bug39017.phpt11
-rw-r--r--Zend/zend_vm_def.h3
-rw-r--r--Zend/zend_vm_execute.h12
4 files changed, 28 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 63314e3d71..cabb18e634 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,8 @@ PHP NEWS
- Fixed mess with CGI/CLI -d option (now it works with cgi; constants are
working exactly like in php.ini; with FastCGI -d affects all requests).
(Dmitry)
+- Fixed bug #39017 (foreach(($obj = new myClass) as $v); echo $obj; segfaults).
+ (Dmitry)
- Fixed bug #39004 (Fixed generation of config.nice with autoconf 2.60).
(Ilia)
- Fixed bug #39003 (__autoload() is called for type hinting). (Dmitry, Tony)
diff --git a/Zend/tests/bug39017.phpt b/Zend/tests/bug39017.phpt
new file mode 100755
index 0000000000..70204758d5
--- /dev/null
+++ b/Zend/tests/bug39017.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Bug #39017 (foreach(($obj = new myClass) as $v); echo $obj; segfaults)
+--FILE--
+<?php
+class A {}
+foreach(($a=(object)new A()) as $v);
+var_dump($a); // UNKNOWN:0
+?>
+--EXPECTF--
+object(A)#%d (0) {
+}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 074a48ea99..ef44ed108a 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3106,6 +3106,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
array_ptr = tmp;
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
+ if (!ce || !ce->get_iterator) {
+ array_ptr->refcount++;
+ }
} else {
if (OP1_TYPE == IS_VAR &&
free_op1.var == NULL &&
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index aff983bd26..f23e6ab835 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2165,6 +2165,9 @@ static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
array_ptr = tmp;
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
+ if (!ce || !ce->get_iterator) {
+ array_ptr->refcount++;
+ }
} else {
if (IS_CONST == IS_VAR &&
free_op1.var == NULL &&
@@ -4701,6 +4704,9 @@ static int ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
array_ptr = tmp;
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
+ if (!ce || !ce->get_iterator) {
+ array_ptr->refcount++;
+ }
} else {
if (IS_TMP_VAR == IS_VAR &&
free_op1.var == NULL &&
@@ -7819,6 +7825,9 @@ static int ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
array_ptr = tmp;
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
+ if (!ce || !ce->get_iterator) {
+ array_ptr->refcount++;
+ }
} else {
if (IS_VAR == IS_VAR &&
free_op1.var == NULL &&
@@ -19853,6 +19862,9 @@ static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
array_ptr = tmp;
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
+ if (!ce || !ce->get_iterator) {
+ array_ptr->refcount++;
+ }
} else {
if (IS_CV == IS_VAR &&
free_op1.var == NULL &&