summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-08-23 17:01:49 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-08-23 17:01:49 +0200
commit51ea7fc4775bad00f332c0c8b0c54be7c60ab2ed (patch)
tree2b2674384fbc5bd7b5011cf5695546c6700788a3
parent51905cd2126d8f1523de01a4b5cbdb4f161758c0 (diff)
parent8807889ac280503d5cd1cd05804a6f278a40300e (diff)
downloadphp-git-51ea7fc4775bad00f332c0c8b0c54be7c60ab2ed.tar.gz
Merge branch 'PHP-7.4'
-rw-r--r--Zend/zend_API.c9
-rw-r--r--Zend/zend_opcode.c10
-rw-r--r--ext/standard/proc_open.c29
-rw-r--r--ext/standard/user_filters.c5
-rw-r--r--main/streams/filter.c5
-rw-r--r--sapi/cli/php_cli.c5
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;
}