com php-src: Fix bug #66127 (Segmentation fault with ArrayObject unset): ext/spl/spl_array.c ext/spl/tests/bug66127.ph pt
ext/spl/tests/iterator_035.phpt
| From: | Johannes Schlüter | Date: | Fri, 18 Jul 2014 23:28:16 +0000 |
| Subject: | com php-src: Fix bug #66127 (Segmentation fault with ArrayObject unset): ext/spl/spl_array.c ext/spl/tests/bug66127.ph pt ext/spl/tests/iterator_035.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-79622@lists.php.net to get a copy of this message | ||
Commit: e2ba5c7987141fc11706207b0ce24ea2eb6dea87
Author: Stanislav Malyshev <stas@php.net> Tue, 10 Jun 2014 23:17:30 -0700
Parents: 8e9777a1f19f079c68df92c8c4ee163e6087a1d1
Branches: PHP-5.3
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e2ba5c7987141fc11706207b0ce24ea2eb6dea87
Log:
Fix bug #66127 (Segmentation fault with ArrayObject unset)
Bugs:
https://bugs.php.net/66127
Changed paths:
M ext/spl/spl_array.c
A ext/spl/tests/bug66127.phpt
M ext/spl/tests/iterator_035.phpt
Diff:
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 77453d6..f2f3f1c 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -408,7 +408,7 @@ static zval *spl_array_read_dimension_ex(int check_inherited, zval *object, zval
/* When in a write context,
* ZE has to be fooled into thinking this is in a reference set
* by separating (if necessary) and returning as an is_ref=1 zval (even if refcount == 1) */
- if ((type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) && !Z_ISREF_PP(ret)) {
+ if ((type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) && !Z_ISREF_PP(ret)
&& ret != &EG(uninitialized_zval_ptr)) {
if (Z_REFCOUNT_PP(ret) > 1) {
zval *newval;
diff --git a/ext/spl/tests/bug66127.phpt b/ext/spl/tests/bug66127..phpt
new file mode 100644
index 0000000..b5d1dca
--- /dev/null
+++ b/ext/spl/tests/bug66127.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #66127 (Segmentation fault with ArrayObject unset)
+--INI--
+error_reporting = E_ALL & ~E_NOTICE
+--FILE--
+<?php
+function crash()
+{
+ set_error_handler(function () {});
+ $var = 1;
+ trigger_error('error');
+ $var2 = $var;
+ $var3 = $var;
+ trigger_error('error');
+}
+
+$items = new ArrayObject();
+
+unset($items[0]);
+unset($items[0][0]);
+crash();
+echo "Worked!\n";
+?>
+--EXPECT--
+Worked!
diff --git a/ext/spl/tests/iterator_035.phpt b/ext/spl/tests/iterator_035.phpt
index 9ce098b..fc0271e 100644
--- a/ext/spl/tests/iterator_035.phpt
+++ b/ext/spl/tests/iterator_035.phpt
@@ -12,4 +12,6 @@ $a[] = &$tmp;
echo "Done\n";
?>
--EXPECTF--
+Notice: Indirect modification of overloaded element of ArrayIterator has no effect in %s on line %d
+
Fatal error: Cannot assign by reference to overloaded object in %s on line %d