]> granicus.if.org Git - php/commitdiff
Fixed bug #70656 (require() statement broken after opcache_reset() or a few hours...
authorXinchen Hui <laruence@gmail.com>
Tue, 27 Oct 2015 00:09:42 +0000 (17:09 -0700)
committerXinchen Hui <laruence@gmail.com>
Tue, 27 Oct 2015 00:09:42 +0000 (17:09 -0700)
NEWS
ext/opcache/ZendAccelerator.c

diff --git a/NEWS b/NEWS
index f4e6c8d6f5e1a2e9aaac90e1c6436f0a6fbe1841..d3f01376ce841286d5c56740b1db7730cdd7709c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,9 +2,13 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2015, PHP 7.0.1
 
+- Opcache:
+  . Fixed bug #70656 (require() statement broken after opcache_reset() or a
+    few hours of use). (Laruence)
+
 - Standard:
   . Fixed bug #70808 (array_merge_recursive corrupts memory of unset items).
-    (laruence)
+    (Laruence)
 
 - XSL:
   . Fixed bug #70678 (PHP7 returns true when false is expected). (Felipe)
index eaadac6e3a948e6f6aaabe03bf9dcd436d31eabc..a7fb07bf3791d11b2100d5df2f71ea036f66b415 100644 (file)
@@ -249,24 +249,28 @@ static void accel_interned_strings_restore_state(void)
     uint nIndex;
     Bucket *p;
 
-       ZCSG(interned_strings_top) = ZCSG(interned_strings_saved_top);
-    while (idx > 0) {
-       idx--;
-               p = ZCSG(interned_strings).arData + idx;
-               if ((char*)p->key < ZCSG(interned_strings_top)) break;
-               ZCSG(interned_strings).nNumUsed--;
-               ZCSG(interned_strings).nNumOfElements--;
-
-               nIndex = p->h | ZCSG(interned_strings).nTableMask;
-               if (HT_HASH(&ZCSG(interned_strings), nIndex) == HT_IDX_TO_HASH(idx)) {
-                       HT_HASH(&ZCSG(interned_strings), nIndex) = Z_NEXT(p->val);
-               } else {
-                       uint32_t prev = HT_HASH(&ZCSG(interned_strings), nIndex);
-                       while (Z_NEXT(HT_HASH_TO_BUCKET(&ZCSG(interned_strings), prev)->val) != idx) {
-                               prev = Z_NEXT(HT_HASH_TO_BUCKET(&ZCSG(interned_strings), prev)->val);
-                       }
-                       Z_NEXT(HT_HASH_TO_BUCKET(&ZCSG(interned_strings), prev)->val) = Z_NEXT(p->val);
-               }
+       if (EXPECTED(ZCSG(interned_strings_top) > ZCSG(interned_strings_saved_top))) {
+               memset(ZCSG(interned_strings_saved_top),
+                               0, ZCSG(interned_strings_top) - ZCSG(interned_strings_saved_top));
+               ZCSG(interned_strings_top) = ZCSG(interned_strings_saved_top);
+               while (idx > 0) {
+                       idx--;
+                       p = ZCSG(interned_strings).arData + idx;
+                       if ((char*)p->key < ZCSG(interned_strings_top)) break;
+                       ZCSG(interned_strings).nNumUsed--;
+                       ZCSG(interned_strings).nNumOfElements--;
+
+                       nIndex = p->h | ZCSG(interned_strings).nTableMask;
+                       if (HT_HASH(&ZCSG(interned_strings), nIndex) == HT_IDX_TO_HASH(idx)) {
+                               HT_HASH(&ZCSG(interned_strings), nIndex) = Z_NEXT(p->val);
+                       } else {
+                               uint32_t prev = HT_HASH(&ZCSG(interned_strings), nIndex);
+                               while (Z_NEXT(HT_HASH_TO_BUCKET(&ZCSG(interned_strings), prev)->val) != idx) {
+                                       prev = Z_NEXT(HT_HASH_TO_BUCKET(&ZCSG(interned_strings), prev)->val);
+                               }
+                               Z_NEXT(HT_HASH_TO_BUCKET(&ZCSG(interned_strings), prev)->val) = Z_NEXT(p->val);
+                       }
+               }
        }
 }