From: Dmitry Stogov Date: Tue, 6 Mar 2018 00:00:46 +0000 (+0300) Subject: Merge branch 'PHP-7.2' X-Git-Tag: php-7.3.0alpha1~249 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=44e1d2f8a990ecb0dd12c9ee69f8b6ea1d2914be;p=php Merge branch 'PHP-7.2' * PHP-7.2: Replaced usafe reference from SHM to process memory with SHM to SHM reference. --- 44e1d2f8a990ecb0dd12c9ee69f8b6ea1d2914be diff --cc ext/opcache/ZendAccelerator.c index c822cefd3e,594d8d1090..2061a34328 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@@ -2466,13 -2373,11 +2466,15 @@@ static inline int accel_find_sapi(void static int zend_accel_init_shm(void) { + int i; + zend_shared_alloc_lock(); - accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals)); + if (ZCG(accel_directives).interned_strings_buffer) { + accel_shared_globals = zend_shared_alloc((ZCG(accel_directives).interned_strings_buffer * 1024 * 1024)); + } else { + accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals)); + } if (!accel_shared_globals) { zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!"); zend_shared_alloc_unlock(); diff --cc ext/opcache/ZendAccelerator.h index 5f59f14b9b,c660038c75..378f38b363 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@@ -284,9 -276,14 +284,12 @@@ typedef struct _zend_accel_shared_globa LONGLONG restart_in; #endif zend_bool restart_in_progress; - /* Interned Strings Support */ - char *interned_strings_start; - char *interned_strings_top; - char *interned_strings_end; - char *interned_strings_saved_top; - HashTable interned_strings; + + /* uninitialized HashTable Support */ + uint32_t uninitialized_bucket[-HT_MIN_MASK]; ++ + /* Interned Strings Support (must be the last element) */ + zend_string_table interned_strings; } zend_accel_shared_globals; extern zend_bool accel_startup_ok; diff --cc ext/opcache/zend_persist.c index 034067af09,c57f80224b..890ba47c26 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@@ -88,21 -86,28 +88,29 @@@ static void zend_hash_persist(HashTabl uint32_t idx, nIndex; Bucket *p; + HT_FLAGS(ht) |= HASH_FLAG_STATIC_KEYS; ht->pDestructor = NULL; - if (!(ht->u.flags & HASH_FLAG_INITIALIZED)) { + if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) { - HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + if (EXPECTED(!ZCG(current_persistent_script)->corrupted)) { + HT_SET_DATA_ADDR(ht, &ZCSG(uninitialized_bucket)); + } else { + HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + } return; } if (ht->nNumUsed == 0) { efree(HT_GET_DATA_ADDR(ht)); ht->nTableMask = HT_MIN_MASK; - HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + if (EXPECTED(!ZCG(current_persistent_script)->corrupted)) { + HT_SET_DATA_ADDR(ht, &ZCSG(uninitialized_bucket)); + } else { + HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + } - ht->u.flags &= ~HASH_FLAG_INITIALIZED; + HT_FLAGS(ht) &= ~HASH_FLAG_INITIALIZED; return; } - if (ht->u.flags & HASH_FLAG_PACKED) { + if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { void *data = HT_GET_DATA_ADDR(ht); zend_accel_store(data, HT_USED_SIZE(ht)); HT_SET_DATA_ADDR(ht, data); @@@ -175,21 -180,28 +183,29 @@@ static void zend_hash_persist_immutable uint32_t idx, nIndex; Bucket *p; + HT_FLAGS(ht) |= HASH_FLAG_STATIC_KEYS; ht->pDestructor = NULL; - if (!(ht->u.flags & HASH_FLAG_INITIALIZED)) { + if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) { - HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + if (EXPECTED(!ZCG(current_persistent_script)->corrupted)) { + HT_SET_DATA_ADDR(ht, &ZCSG(uninitialized_bucket)); + } else { + HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + } return; } if (ht->nNumUsed == 0) { efree(HT_GET_DATA_ADDR(ht)); ht->nTableMask = HT_MIN_MASK; - HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + if (EXPECTED(!ZCG(current_persistent_script)->corrupted)) { + HT_SET_DATA_ADDR(ht, &ZCSG(uninitialized_bucket)); + } else { + HT_SET_DATA_ADDR(ht, &uninitialized_bucket); + } - ht->u.flags &= ~HASH_FLAG_INITIALIZED; + HT_FLAGS(ht) &= ~HASH_FLAG_INITIALIZED; return; } - if (ht->u.flags & HASH_FLAG_PACKED) { + if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { HT_SET_DATA_ADDR(ht, zend_accel_memdup(HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht))); } else if (ht->nNumUsed < (uint32_t)(-(int32_t)ht->nTableMask) / 2) { /* compact table */ @@@ -863,9 -849,16 +879,16 @@@ static void zend_accel_persist_class_ta zend_hash_apply(class_table, (apply_func_t) zend_update_parent_ce); } - zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, const char **key, unsigned int key_length) -zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, char **key, unsigned int key_length, int for_shm) ++zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, const char **key, unsigned int key_length, int for_shm) { script->mem = ZCG(mem); + script->corrupted = 0; + ZCG(current_persistent_script) = script; + + if (!for_shm) { + /* script is not going to be saved in SHM */ + script->corrupted = 1; + } ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */ zend_shared_alloc_clear_xlat_table(); diff --cc ext/opcache/zend_persist.h index 73198403d6,73f0215a65..6774c046f0 --- a/ext/opcache/zend_persist.h +++ b/ext/opcache/zend_persist.h @@@ -23,7 -23,7 +23,7 @@@ #define ZEND_PERSIST_H int zend_accel_script_persistable(zend_persistent_script *script); -uint32_t zend_accel_script_persist_calc(zend_persistent_script *script, char *key, unsigned int key_length, int for_shm); -zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, char **key, unsigned int key_length, int for_shm); +uint32_t zend_accel_script_persist_calc(zend_persistent_script *script, const char *key, unsigned int key_length, int for_shm); - zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, const char **key, unsigned int key_length); ++zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, const char **key, unsigned int key_length, int for_shm); #endif /* ZEND_PERSIST_H */