]> granicus.if.org Git - php/commitdiff
Fix bug #66127 (Segmentation fault with ArrayObject unset) php-5.4.30RC1
authorStanislav Malyshev <stas@php.net>
Wed, 11 Jun 2014 06:17:30 +0000 (23:17 -0700)
committerStanislav Malyshev <stas@php.net>
Wed, 11 Jun 2014 06:24:11 +0000 (23:24 -0700)
NEWS
ext/spl/spl_array.c
ext/spl/tests/bug66127.phpt [new file with mode: 0644]
ext/spl/tests/iterator_035.phpt

diff --git a/NEWS b/NEWS
index 853732f5dcbd9f9700d5e03f9699ededea22e7e4..f0367a8cc97c5a550ab495827d2b4944a5f77a3e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -41,6 +41,7 @@ PHP                                                                        NEWS
   . Implemented FR #49898 (Add SoapClient::__getCookies()). (Boro Sitnikovski)
 
 - SPL:
+  . Fixed bug #66127 (Segmentation fault with ArrayObject unset). (Stas)
   . Fixed bug #67359 (Segfault in recursiveDirectoryIterator). (Laruence)
   . Fixed bug #67360 (Missing element after ArrayObject::getIterator). (Adam)
 
index 34f3a3818d8bb6301e4f85e254f5c4b7f13b2bf6..758947a8cc756899a7a4ef70cdfa325e4d09abe5 100644 (file)
@@ -402,7 +402,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 (file)
index 0000000..b5d1dca
--- /dev/null
@@ -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!
index 9ce098b69d7c11d510a874546fabd7261374fc25..fc0271e3811d71bcf0203018cb9dd4f94a39ea1b 100644 (file)
@@ -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