diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-23 17:01:49 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-23 17:01:49 +0200 |
commit | 51ea7fc4775bad00f332c0c8b0c54be7c60ab2ed (patch) | |
tree | 2b2674384fbc5bd7b5011cf5695546c6700788a3 | |
parent | 51905cd2126d8f1523de01a4b5cbdb4f161758c0 (diff) | |
parent | 8807889ac280503d5cd1cd05804a6f278a40300e (diff) | |
download | php-git-51ea7fc4775bad00f332c0c8b0c54be7c60ab2ed.tar.gz |
Merge branch 'PHP-7.4'
-rw-r--r-- | Zend/zend_API.c | 9 | ||||
-rw-r--r-- | Zend/zend_opcode.c | 10 | ||||
-rw-r--r-- | ext/standard/proc_open.c | 29 | ||||
-rw-r--r-- | ext/standard/user_filters.c | 5 | ||||
-rw-r--r-- | main/streams/filter.c | 5 | ||||
-rw-r--r-- | sapi/cli/php_cli.c | 5 |
6 files changed, 35 insertions, 28 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 50acdd878b..1ace606a7e 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2701,6 +2701,7 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* { { zend_class_entry *disabled_class; zend_string *key; + zend_function *fn; key = zend_string_alloc(class_name_length, 0); zend_str_tolower_copy(ZSTR_VAL(key), class_name, class_name_length); @@ -2709,8 +2710,16 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* { if (!disabled_class) { return FAILURE; } + INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new); disabled_class->create_object = display_disabled_class; + + ZEND_HASH_FOREACH_PTR(&disabled_class->function_table, fn) { + if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) && + fn->common.scope == disabled_class) { + zend_free_internal_arg_info(&fn->internal_function); + } + } ZEND_HASH_FOREACH_END(); zend_hash_clean(&disabled_class->function_table); return SUCCESS; } diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 6e58181707..1c4f812af3 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -104,7 +104,7 @@ ZEND_API void destroy_zend_function(zend_function *function) void zend_free_internal_arg_info(zend_internal_function *function) { if ((function->fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) && - !function->scope && function->arg_info) { + function->arg_info) { uint32_t i; uint32_t num_args = function->num_args + 1; @@ -135,7 +135,10 @@ ZEND_API void zend_function_dtor(zval *zv) ZEND_ASSERT(function->common.function_name); zend_string_release_ex(function->common.function_name, 1); - zend_free_internal_arg_info(&function->internal_function); + /* For methods this will be called explicitly. */ + if (!function->common.scope) { + zend_free_internal_arg_info(&function->internal_function); + } if (!(function->common.fn_flags & ZEND_ACC_ARENA_ALLOCATED)) { pefree(function, 1); @@ -352,8 +355,7 @@ ZEND_API void destroy_zend_class(zval *zv) ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) { if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) && fn->common.scope == ce) { - /* reset function scope to allow arg_info removing */ - fn->common.scope = NULL; + zend_free_internal_arg_info(&fn->internal_function); } } ZEND_HASH_FOREACH_END(); diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 27cd1759cb..cf1d85b7e9 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -75,7 +75,7 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent char **ep; #endif char *p; - size_t cnt, l, sizeenv = 0; + size_t cnt, sizeenv = 0; HashTable *env_hash; memset(&env, 0, sizeof(env)); @@ -122,25 +122,20 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent p = env.envp = (char *) pecalloc(sizeenv + 4, 1, is_persistent); ZEND_HASH_FOREACH_STR_KEY_PTR(env_hash, key, str) { - if (key) { - l = ZSTR_LEN(key) + ZSTR_LEN(str) + 2; - memcpy(p, ZSTR_VAL(key), ZSTR_LEN(key)); - strncat(p, "=", 1); - strncat(p, ZSTR_VAL(str), ZSTR_LEN(str)); - -#ifndef PHP_WIN32 - *ep = p; - ++ep; -#endif - p += l; - } else { - memcpy(p, ZSTR_VAL(str), ZSTR_LEN(str)); #ifndef PHP_WIN32 - *ep = p; - ++ep; + *ep = p; + ++ep; #endif - p += ZSTR_LEN(str) + 1; + + if (key) { + memcpy(p, ZSTR_VAL(key), ZSTR_LEN(key)); + p += ZSTR_LEN(key); + *p++ = '='; } + + memcpy(p, ZSTR_VAL(str), ZSTR_LEN(str)); + p += ZSTR_LEN(str); + *p++ = '\0'; zend_string_release_ex(str, 0); } ZEND_HASH_FOREACH_END(); diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index d1f8044d6d..c66f821fd4 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -292,8 +292,9 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, memcpy(wildcard, filtername, len + 1); /* copy \0 */ period = wildcard + (period - filtername); while (period) { - *period = '\0'; - strncat(wildcard, ".*", 2); + ZEND_ASSERT(period[0] == '.'); + period[1] = '*'; + period[2] = '\0'; if (NULL != (fdat = zend_hash_str_find_ptr(BG(user_filter_map), wildcard, strlen(wildcard)))) { period = NULL; } else { diff --git a/main/streams/filter.c b/main/streams/filter.c index afc1f3b8e5..7fdbd0c3bf 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -239,8 +239,9 @@ PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval memcpy(wildname, filtername, n+1); period = wildname + (period - filtername); while (period && !filter) { - *period = '\0'; - strncat(wildname, ".*", 2); + ZEND_ASSERT(period[0] == '.'); + period[1] = '*'; + period[2] = '\0'; if (NULL != (factory = zend_hash_str_find_ptr(filter_hash, wildname, strlen(wildname)))) { filter = factory->create_filter(filtername, filterparams, persistent); } diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 2b0fb71fcc..834a9a0161 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -236,19 +236,18 @@ static void print_extensions(void) /* {{{ */ static inline int sapi_cli_select(php_socket_t fd) { - fd_set wfd, dfd; + fd_set wfd; struct timeval tv; int ret; FD_ZERO(&wfd); - FD_ZERO(&dfd); PHP_SAFE_FD_SET(fd, &wfd); tv.tv_sec = (long)FG(default_socket_timeout); tv.tv_usec = 0; - ret = php_select(fd+1, &dfd, &wfd, &dfd, &tv); + ret = php_select(fd+1, NULL, &wfd, NULL, &tv); return ret != -1; } |