]> granicus.if.org Git - php/commitdiff
Re-Fixed bug #70249 (Segmentation fault while running PHPUnit tests on phpBB 3.2...
authorXinchen Hui <laruence@gmail.com>
Wed, 11 Nov 2015 04:31:45 +0000 (12:31 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 11 Nov 2015 04:32:46 +0000 (12:32 +0800)
Let's fixed this in the root instead

NEWS
Zend/zend_hash.c
ext/standard/tests/general_functions/bug70249.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 6a88338f6e8958ba5195aa74f9c951c7b19961b8..53f4d405fbb9e12b29f455fa00f19260432943b9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2015, PHP 7.0.1
 
+- Core:
+  . Fixed bug #70249 (Segmentation fault while running PHPUnit tests on
+    phpBB 3.2-dev). (Laruence)
+
 - Streams/Socket
   . Add IPV6_V6ONLY constant / make it usable in stream contexts. (Bob)
 
index 52868cf4a6df60d6635662789dd078a2107a4354..c324f1dfa8b4b951b9e73c39703c2ed7f9e2e63e 100644 (file)
@@ -1458,8 +1458,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_fu
        HT_ASSERT(GC_REFCOUNT(ht) == 1);
 
        HASH_PROTECT_RECURSION(ht);
-       p = ht->arData;
-       for (idx = 0; idx < ht->nNumUsed; idx++, p++) {
+       for (idx = 0; idx < ht->nNumUsed; idx++) {
+               p = ht->arData + idx;
                if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
                result = apply_func(&p->val);
 
@@ -1484,8 +1484,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_f
        HT_ASSERT(GC_REFCOUNT(ht) == 1);
 
        HASH_PROTECT_RECURSION(ht);
-       p = ht->arData;
-       for (idx = 0; idx < ht->nNumUsed; idx++, p++) {
+       for (idx = 0; idx < ht->nNumUsed; idx++) {
+               p = ht->arData + idx;
                if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
                result = apply_func(&p->val, argument);
 
@@ -1513,8 +1513,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_arguments(HashTable *ht, apply_
 
        HASH_PROTECT_RECURSION(ht);
 
-       p = ht->arData;
-       for (idx = 0; idx < ht->nNumUsed; idx++, p++) {
+       for (idx = 0; idx < ht->nNumUsed; idx++) {
+               p = ht->arData + idx;
                if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
                va_start(args, num_args);
                hash_key.h = p->h;
@@ -1547,10 +1547,9 @@ ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t
 
        HASH_PROTECT_RECURSION(ht);
        idx = ht->nNumUsed;
-       p = ht->arData + idx;
        while (idx > 0) {
                idx--;
-               p--;
+               p = ht->arData + idx;
                if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
 
                result = apply_func(&p->val);
diff --git a/ext/standard/tests/general_functions/bug70249.phpt b/ext/standard/tests/general_functions/bug70249.phpt
new file mode 100644 (file)
index 0000000..743df83
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #70249 (Segmentation fault while running PHPUnit tests on phpBB 3.2-dev)
+--FILE--
+<?php
+
+class Logger {
+    public function __construct() {
+        register_shutdown_function(function () {
+            // make regular flush before other shutdown functions, which allows session data collection and so on
+            $this->flush();
+            // make sure log entries written by shutdown functions are also flushed
+            // ensure "flush()" is called last when there are multiple shutdown functions
+            register_shutdown_function([$this, 'flush'], true);
+        });
+    }
+
+    public function flush($final = false) {
+        return 1;
+    }
+}
+
+for ($i = 0; $i < 200; $i++) {
+    $a = new Logger();
+}
+?>
+okey
+--EXPECT--
+okey