From 3ef96c2cc6f3a1dddd8479e6c733f44e8dbcb5e9 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 26 Oct 2015 17:09:42 -0700 Subject: [PATCH] Fixed bug #70656 (require() statement broken after opcache_reset() or a few hours of use) --- NEWS | 6 +++++- ext/opcache/ZendAccelerator.c | 40 +++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/NEWS b/NEWS index f4e6c8d6f5..d3f01376ce 100644 --- 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) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index eaadac6e3a..a7fb07bf37 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -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); + } + } } } -- 2.40.0