]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.6' into PHP-7.0
authorXinchen Hui <laruence@gmail.com>
Wed, 23 Dec 2015 16:11:09 +0000 (08:11 -0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 23 Dec 2015 16:11:09 +0000 (08:11 -0800)
1  2 
ext/spl/php_spl.c

index 719a9f3e48ca368d6cdef71b51f8ea344d0df1b4,d3228698de0e9c8f993abf4ed5ce36e93be854db..ef73b9adc604a701c4b9be92757ec5a689b562e2
@@@ -645,24 -654,29 +645,28 @@@ PHP_FUNCTION(spl_autoload_unregister
                efree(error);
        }
  
 -      lc_name = safe_emalloc(func_name_len, 1, sizeof(long) + 1);
 -      zend_str_tolower_copy(lc_name, func_name, func_name_len);
 -      efree(func_name);
 -
        if (Z_TYPE_P(zcallable) == IS_OBJECT) {
 -              lc_name = erealloc(lc_name, func_name_len + 2 + sizeof(zend_object_handle));
 -              memcpy(lc_name + func_name_len, &Z_OBJ_HANDLE_P(zcallable),
 -                      sizeof(zend_object_handle));
 -              func_name_len += sizeof(zend_object_handle);
 -              lc_name[func_name_len] = '\0';
 +              lc_name = zend_string_alloc(ZSTR_LEN(func_name) + sizeof(uint32_t), 0);
 +              zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(func_name), ZSTR_LEN(func_name));
 +              memcpy(ZSTR_VAL(lc_name) + ZSTR_LEN(func_name), &Z_OBJ_HANDLE_P(zcallable), sizeof(uint32_t));
 +              ZSTR_VAL(lc_name)[ZSTR_LEN(lc_name)] = '\0';
 +      } else {
 +              lc_name = zend_string_alloc(ZSTR_LEN(func_name), 0);
 +              zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(func_name), ZSTR_LEN(func_name));
        }
 +      zend_string_release(func_name);
  
        if (SPL_G(autoload_functions)) {
 -              if (func_name_len == sizeof("spl_autoload_call")-1 && !strcmp(lc_name, "spl_autoload_call")) {
 +              if (ZSTR_LEN(lc_name) == sizeof("spl_autoload_call") - 1 && !strcmp(ZSTR_VAL(lc_name), "spl_autoload_call")) {
                        /* remove all */
-                       zend_hash_destroy(SPL_G(autoload_functions));
-                       FREE_HASHTABLE(SPL_G(autoload_functions));
-                       SPL_G(autoload_functions) = NULL;
-                       EG(autoload_func) = NULL;
+                       if (!SPL_G(autoload_running)) {
+                               zend_hash_destroy(SPL_G(autoload_functions));
+                               FREE_HASHTABLE(SPL_G(autoload_functions));
+                               SPL_G(autoload_functions) = NULL;
+                               EG(autoload_func) = NULL;
+                       } else {
+                               zend_hash_clean(SPL_G(autoload_functions));
+                       }
                        success = SUCCESS;
                } else {
                        /* remove specific */