summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2013-04-04 14:48:53 +0800
committerXinchen Hui <laruence@php.net>2013-04-04 14:48:53 +0800
commit65e368debdbc0f321af95e402b0d151288018ba2 (patch)
tree1209537f226e1f156edd16a240f7028c9cbc24af
parent1f34ccbe34783f5671bc2a68e7299cea7493c82b (diff)
parent82ac3106e061b31ccbbf53a5276eae441254057d (diff)
downloadphp-git-65e368debdbc0f321af95e402b0d151288018ba2.tar.gz
Merge branch 'PHP-5.4' into PHP-5.5
-rw-r--r--Zend/tests/bug64578.phpt13
-rw-r--r--Zend/zend_execute.c7
2 files changed, 17 insertions, 3 deletions
diff --git a/Zend/tests/bug64578.phpt b/Zend/tests/bug64578.phpt
new file mode 100644
index 0000000000..73b3ec4f97
--- /dev/null
+++ b/Zend/tests/bug64578.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #64578 (debug_backtrace in set_error_handler corrupts zend heap: segfault)
+--FILE--
+<?php
+
+set_error_handler(function() { debug_backtrace(); });
+
+function x($s) { $s['a'] = 1; };
+$y = '1';
+x($y);
+print_r($y);
+--EXPECTF--
+1
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index b2d06238fa..a65f5331de 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1144,6 +1144,10 @@ convert_to_array:
zend_error_noreturn(E_ERROR, "[] operator not supported for strings");
}
+ if (type != BP_VAR_UNSET) {
+ SEPARATE_ZVAL_IF_NOT_REF(container_ptr);
+ }
+
if (Z_TYPE_P(dim) != IS_LONG) {
switch(Z_TYPE_P(dim)) {
@@ -1172,9 +1176,6 @@ convert_to_array:
convert_to_long(&tmp);
dim = &tmp;
}
- if (type != BP_VAR_UNSET) {
- SEPARATE_ZVAL_IF_NOT_REF(container_ptr);
- }
container = *container_ptr;
result->str_offset.str = container;
PZVAL_LOCK(container);