From 675a8a64c3bdf5426113e33d88b477be3f9a0f39 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 27 Dec 2018 22:48:25 +0300 Subject: [PATCH] Use HT_IS_INITIALIZED() and HT_INVALIDATE() macros instead of hackish HT_FLAGS assumtions. --- Zend/zend_hash.h | 7 +++++++ ext/phar/dirstream.c | 2 +- ext/phar/func_interceptors.c | 24 ++++++++++++------------ ext/phar/phar.c | 28 ++++++++++++++-------------- ext/phar/phar_object.c | 2 +- ext/phar/stream.c | 6 +++--- ext/phar/util.c | 6 +++--- ext/phar/zip.c | 12 ++++++------ 8 files changed, 47 insertions(+), 40 deletions(-) diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index d045a7abc5..69ab04d2fc 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -42,6 +42,13 @@ #define HT_FLAGS(ht) (ht)->u.flags +#define HT_INVALIDATE(ht) do { \ + HT_FLAGS(ht) = 0; \ + } while (0) + +#define HT_IS_INITIALIZED(ht) \ + ((HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) != 0) + #define HT_IS_PACKED(ht) \ ((HT_FLAGS(ht) & HASH_FLAG_PACKED) != 0) diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index 548ef14d07..985f0f6db0 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -361,7 +361,7 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, return ret; } - if (!HT_FLAGS(&phar->manifest)) { + if (!HT_IS_INITIALIZED(&phar->manifest)) { php_url_free(resource); return NULL; } diff --git a/ext/phar/func_interceptors.c b/ext/phar/func_interceptors.c index 87020c5ed8..4531c710f8 100644 --- a/ext/phar/func_interceptors.c +++ b/ext/phar/func_interceptors.c @@ -31,8 +31,8 @@ PHAR_FUNC(phar_opendir) /* {{{ */ goto skip_phar; } - if ((HT_FLAGS(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) - && !HT_FLAGS(&cached_phars)) { + if ((HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) + && !HT_IS_INITIALIZED(&cached_phars)) { goto skip_phar; } @@ -104,8 +104,8 @@ PHAR_FUNC(phar_file_get_contents) /* {{{ */ goto skip_phar; } - if ((HT_FLAGS(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) - && !HT_FLAGS(&cached_phars)) { + if ((HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) + && !HT_IS_INITIALIZED(&cached_phars)) { goto skip_phar; } @@ -237,8 +237,8 @@ PHAR_FUNC(phar_readfile) /* {{{ */ goto skip_phar; } - if ((HT_FLAGS(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) - && !HT_FLAGS(&cached_phars)) { + if ((HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) + && !HT_IS_INITIALIZED(&cached_phars)) { goto skip_phar; } if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "p|br!", &filename, &filename_len, &use_include_path, &zcontext) == FAILURE) { @@ -337,8 +337,8 @@ PHAR_FUNC(phar_fopen) /* {{{ */ goto skip_phar; } - if ((HT_FLAGS(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) - && !HT_FLAGS(&cached_phars)) { + if ((HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) + && !HT_IS_INITIALIZED(&cached_phars)) { /* no need to check, include_path not even specified in fopen/ no active phars */ goto skip_phar; } @@ -852,8 +852,8 @@ PHAR_FUNC(phar_is_file) /* {{{ */ goto skip_phar; } - if ((HT_FLAGS(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) - && !HT_FLAGS(&cached_phars)) { + if ((HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) + && !HT_IS_INITIALIZED(&cached_phars)) { goto skip_phar; } if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "p", &filename, &filename_len) == FAILURE) { @@ -919,8 +919,8 @@ PHAR_FUNC(phar_is_link) /* {{{ */ goto skip_phar; } - if ((HT_FLAGS(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) - && !HT_FLAGS(&cached_phars)) { + if ((HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && !zend_hash_num_elements(&(PHAR_G(phar_fname_map)))) + && !HT_IS_INITIALIZED(&cached_phars)) { goto skip_phar; } if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "p", &filename, &filename_len) == FAILURE) { diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 4d5988eaa9..ac14b8bafe 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -80,7 +80,7 @@ ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */ if (ZSTR_LEN(entry->name) == sizeof("phar.readonly")-1) { PHAR_G(readonly) = ini; - if (PHAR_G(request_init) && HT_FLAGS(&PHAR_G(phar_fname_map))) { + if (PHAR_G(request_init) && HT_IS_INITIALIZED(&PHAR_G(phar_fname_map))) { zend_hash_apply_with_argument(&(PHAR_G(phar_fname_map)), phar_set_writeable_bit, (void *)&ini); } } else { @@ -144,9 +144,9 @@ finish_error: PHAR_G(manifest_cached) = 0; efree(tmp); zend_hash_destroy(&(PHAR_G(phar_fname_map))); - HT_FLAGS(&PHAR_G(phar_fname_map)) = 0; + HT_INVALIDATE(&PHAR_G(phar_fname_map)); zend_hash_destroy(&(PHAR_G(phar_alias_map))); - HT_FLAGS(&PHAR_G(phar_alias_map)) = 0; + HT_INVALIDATE(&PHAR_G(phar_alias_map)); zend_hash_destroy(&cached_phars); zend_hash_destroy(&cached_alias); zend_hash_graceful_reverse_destroy(&EG(regular_list)); @@ -171,8 +171,8 @@ finish_error: zend_hash_destroy(&cached_alias); cached_phars = PHAR_G(phar_fname_map); cached_alias = PHAR_G(phar_alias_map); - HT_FLAGS(&PHAR_G(phar_fname_map)) = 0; - HT_FLAGS(&PHAR_G(phar_alias_map)) = 0; + HT_INVALIDATE(&PHAR_G(phar_fname_map)); + HT_INVALIDATE(&PHAR_G(phar_alias_map)); zend_hash_graceful_reverse_destroy(&EG(regular_list)); memset(&EG(regular_list), 0, sizeof(HashTable)); efree(tmp); @@ -218,19 +218,19 @@ void phar_destroy_phar_data(phar_archive_data *phar) /* {{{ */ phar->signature = NULL; } - if (HT_FLAGS(&phar->manifest)) { + if (HT_IS_INITIALIZED(&phar->manifest)) { zend_hash_destroy(&phar->manifest); - HT_FLAGS(&phar->manifest) = 0; + HT_INVALIDATE(&phar->manifest); } - if (HT_FLAGS(&phar->mounted_dirs)) { + if (HT_IS_INITIALIZED(&phar->mounted_dirs)) { zend_hash_destroy(&phar->mounted_dirs); - HT_FLAGS(&phar->mounted_dirs) = 0; + HT_INVALIDATE(&phar->mounted_dirs); } - if (HT_FLAGS(&phar->virtual_dirs)) { + if (HT_IS_INITIALIZED(&phar->virtual_dirs)) { zend_hash_destroy(&phar->virtual_dirs); - HT_FLAGS(&phar->virtual_dirs) = 0; + HT_INVALIDATE(&phar->virtual_dirs); } if (Z_TYPE(phar->metadata) != IS_UNDEF) { @@ -3520,11 +3520,11 @@ PHP_RSHUTDOWN_FUNCTION(phar) /* {{{ */ { phar_release_functions(); zend_hash_destroy(&(PHAR_G(phar_alias_map))); - HT_FLAGS(&PHAR_G(phar_alias_map)) = 0; + HT_INVALIDATE(&PHAR_G(phar_alias_map)); zend_hash_destroy(&(PHAR_G(phar_fname_map))); - HT_FLAGS(&PHAR_G(phar_fname_map)) = 0; + HT_INVALIDATE(&PHAR_G(phar_fname_map)); zend_hash_destroy(&(PHAR_G(phar_persist_map))); - HT_FLAGS(&PHAR_G(phar_persist_map)) = 0; + HT_INVALIDATE(&PHAR_G(phar_persist_map)); PHAR_G(phar_SERVER_mung_list) = 0; if (PHAR_G(cached_fp)) { diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 7538c49b3c..cd15e519e0 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -497,7 +497,7 @@ carry_on: } return; - } else if (HT_FLAGS(&PHAR_G(phar_fname_map)) && NULL != (pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) { + } else if (HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && NULL != (pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) { goto carry_on; } else if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_str_find_ptr(&cached_phars, fname, fname_len))) { if (SUCCESS == phar_copy_on_write(&pphar)) { diff --git a/ext/phar/stream.c b/ext/phar/stream.c index ac44dd0682..8f0db6ed65 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -106,7 +106,7 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const if (mode[0] == 'w' || (mode[0] == 'r' && mode[1] == '+')) { phar_archive_data *pphar = NULL, *phar; - if (PHAR_G(request_init) && HT_FLAGS(&PHAR_G(phar_fname_map)) && NULL == (pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), resource->host))) { + if (PHAR_G(request_init) && HT_IS_INITIALIZED(&PHAR_G(phar_fname_map)) && NULL == (pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), resource->host))) { pphar = NULL; } if (PHAR_G(readonly) && (!pphar || !pphar->is_data)) { @@ -596,7 +596,7 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f php_url_free(resource); return SUCCESS; } - if (!HT_FLAGS(&phar->manifest)) { + if (!HT_IS_INITIALIZED(&phar->manifest)) { php_url_free(resource); return FAILURE; } @@ -613,7 +613,7 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f return SUCCESS; } /* check for mounted directories */ - if (HT_FLAGS(&phar->mounted_dirs) && zend_hash_num_elements(&phar->mounted_dirs)) { + if (HT_IS_INITIALIZED(&phar->mounted_dirs) && zend_hash_num_elements(&phar->mounted_dirs)) { zend_string *str_key; ZEND_HASH_FOREACH_STR_KEY(&phar->mounted_dirs, str_key) { diff --git a/ext/phar/util.c b/ext/phar/util.c index 7721a4e37c..6af4879c2d 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -920,7 +920,7 @@ phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, PHP_PHAR_API int phar_resolve_alias(char *alias, size_t alias_len, char **filename, size_t *filename_len) /* {{{ */ { phar_archive_data *fd_ptr; - if (HT_FLAGS(&PHAR_G(phar_alias_map)) + if (HT_IS_INITIALIZED(&PHAR_G(phar_alias_map)) && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { *filename = fd_ptr->fname; *filename_len = fd_ptr->fname_len; @@ -1244,7 +1244,7 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si return NULL; } - if (!HT_FLAGS(&phar->manifest)) { + if (!HT_IS_INITIALIZED(&phar->manifest)) { return NULL; } @@ -1289,7 +1289,7 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si } } - if (HT_FLAGS(&phar->mounted_dirs) && zend_hash_num_elements(&phar->mounted_dirs)) { + if (HT_IS_INITIALIZED(&phar->mounted_dirs) && zend_hash_num_elements(&phar->mounted_dirs)) { zend_string *str_key; ZEND_HASH_FOREACH_STR_KEY(&phar->mounted_dirs, str_key) { diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 9c9e3f6d68..bbafd8836e 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -293,11 +293,11 @@ foundit: entry.is_persistent = mydata->is_persistent; #define PHAR_ZIP_FAIL_FREE(errmsg, save) \ zend_hash_destroy(&mydata->manifest); \ - HT_FLAGS(&mydata->manifest) = 0; \ + HT_INVALIDATE(&mydata->manifest); \ zend_hash_destroy(&mydata->mounted_dirs); \ - HT_FLAGS(&mydata->mounted_dirs) = 0; \ + HT_INVALIDATE(&mydata->mounted_dirs); \ zend_hash_destroy(&mydata->virtual_dirs); \ - HT_FLAGS(&mydata->virtual_dirs) = 0; \ + HT_INVALIDATE(&mydata->virtual_dirs); \ php_stream_close(fp); \ zval_ptr_dtor(&mydata->metadata); \ if (mydata->signature) { \ @@ -315,11 +315,11 @@ foundit: return FAILURE; #define PHAR_ZIP_FAIL(errmsg) \ zend_hash_destroy(&mydata->manifest); \ - HT_FLAGS(&mydata->manifest) = 0; \ + HT_INVALIDATE(&mydata->manifest); \ zend_hash_destroy(&mydata->mounted_dirs); \ - HT_FLAGS(&mydata->mounted_dirs) = 0; \ + HT_INVALIDATE(&mydata->mounted_dirs); \ zend_hash_destroy(&mydata->virtual_dirs); \ - HT_FLAGS(&mydata->virtual_dirs) = 0; \ + HT_INVALIDATE(&mydata->virtual_dirs); \ php_stream_close(fp); \ zval_ptr_dtor(&mydata->metadata); \ if (mydata->signature) { \ -- 2.50.1