]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.2'
authorDmitry Stogov <dmitry@zend.com>
Tue, 6 Mar 2018 00:00:46 +0000 (03:00 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 6 Mar 2018 00:00:46 +0000 (03:00 +0300)
* PHP-7.2:
  Replaced usafe reference from SHM to process memory with SHM to SHM reference.

1  2 
ext/opcache/ZendAccelerator.c
ext/opcache/ZendAccelerator.h
ext/opcache/zend_persist.c
ext/opcache/zend_persist.h

index c822cefd3e2606645914a31f660cae35cfffa276,594d8d10909f7f80bb14072bfd045bc24d761b3f..2061a343285a2f97fd78bbce24531dfdd2f3d8e1
@@@ -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();
index 5f59f14b9b4ac09001ec56c506b699fe34d6ab6f,c660038c75c6fc6ebef031b53e752740dcba8d5b..378f38b363adb4c07f81e39cbbfa0515a000f809
@@@ -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;
index 034067af09c3afb35b5a61911a0a75ea592d0237,c57f80224ba4e8b9695431d8cfc44d491eba9dfa..890ba47c265e343f9960f2d6c39e937824474461
@@@ -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();
index 73198403d6033b520caae4d1e13fddc0d2478942,73f0215a6571ecd9975ce66c0fae01c951446511..6774c046f0899ee6de8965da975697b119345aff
@@@ -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 */