diff --git a/ext/dom/node.c b/ext/dom/node.c index 8ba2a5aeb0939..ad30a3fa67e1e 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -2101,33 +2101,72 @@ PHP_METHOD(DOMNode, lookupNamespaceURI) } /* }}} end dom_node_lookup_namespace_uri */ +/* Allocate, track and prepend a temporary nsDef entry for C14N. + * Returns the new xmlNsPtr for the caller to fill in href/prefix/_private, + * or NULL on allocation failure. */ +static xmlNsPtr dom_alloc_ns_decl(HashTable *links, xmlNodePtr node) +{ + xmlNsPtr ns = xmlMalloc(sizeof(*ns)); + if (!ns) { + return NULL; + } + + zval *zv = zend_hash_index_lookup(links, (zend_ulong) node); + if (Z_ISNULL_P(zv)) { + ZVAL_LONG(zv, 1); + } else { + Z_LVAL_P(zv)++; + } + + memset(ns, 0, sizeof(*ns)); + ns->type = XML_LOCAL_NAMESPACE; + ns->next = node->nsDef; + node->nsDef = ns; + + return ns; +} + +/* Mint a temporary nsDef entry so C14N finds namespaces that live on node->ns + * but have no matching xmlns attribute (typical for createElementNS). */ +static void dom_add_synthetic_ns_decl(HashTable *links, xmlNodePtr node, xmlNsPtr src_ns) +{ + xmlNsPtr ns = dom_alloc_ns_decl(links, node); + if (!ns) { + return; + } + + ns->href = xmlStrdup(src_ns->href); + ns->prefix = src_ns->prefix ? xmlStrdup(src_ns->prefix) : NULL; +} + +/* Same, but for attribute namespaces, which may collide by prefix with the + * element's own ns or with a sibling attribute's ns. */ +static void dom_add_synthetic_ns_decl_for_attr(HashTable *links, xmlNodePtr node, xmlNsPtr src_ns) +{ + for (xmlNsPtr existing = node->nsDef; existing; existing = existing->next) { + if (xmlStrEqual(existing->prefix, src_ns->prefix)) { + return; + } + } + + dom_add_synthetic_ns_decl(links, node, src_ns); +} + static void dom_relink_ns_decls_element(HashTable *links, xmlNodePtr node) { if (node->type == XML_ELEMENT_NODE) { for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) { if (php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) { - xmlNsPtr ns = xmlMalloc(sizeof(*ns)); + xmlNsPtr ns = dom_alloc_ns_decl(links, node); if (!ns) { return; } - zval *zv = zend_hash_index_lookup(links, (zend_ulong) node); - if (Z_ISNULL_P(zv)) { - ZVAL_LONG(zv, 1); - } else { - Z_LVAL_P(zv)++; - } - bool should_free; xmlChar *attr_value = php_libxml_attr_value(attr, &should_free); - memset(ns, 0, sizeof(*ns)); - ns->type = XML_LOCAL_NAMESPACE; ns->href = should_free ? attr_value : xmlStrdup(attr_value); ns->prefix = attr->ns->prefix ? xmlStrdup(attr->name) : NULL; - ns->next = node->nsDef; - node->nsDef = ns; - ns->_private = attr; if (attr->prev) { attr->prev->next = attr->next; @@ -2148,6 +2187,14 @@ static void dom_relink_ns_decls_element(HashTable *links, xmlNodePtr node) * can return the current namespace. */ zend_hash_index_add_new_ptr(links, (zend_ulong) node | 1, node->ns); node->ns = xmlSearchNs(node->doc, node, NULL); + } else if (node->ns) { + dom_add_synthetic_ns_decl(links, node, node->ns); + } + + for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) { + if (attr->ns && !php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) { + dom_add_synthetic_ns_decl_for_attr(links, node, attr->ns); + } } } } @@ -2177,13 +2224,15 @@ static void dom_unlink_ns_decls(HashTable *links) node->nsDef = ns->next; xmlAttrPtr attr = ns->_private; - if (attr->prev) { - attr->prev->next = attr; - } else { - node->properties = attr; - } - if (attr->next) { - attr->next->prev = attr; + if (attr) { + if (attr->prev) { + attr->prev->next = attr; + } else { + node->properties = attr; + } + if (attr->next) { + attr->next->prev = attr; + } } xmlFreeNs(ns); diff --git a/ext/dom/tests/modern/xml/gh21544.phpt b/ext/dom/tests/modern/xml/gh21544.phpt new file mode 100644 index 0000000000000..b76742ae84a59 --- /dev/null +++ b/ext/dom/tests/modern/xml/gh21544.phpt @@ -0,0 +1,28 @@ +--TEST-- +GH-21544 (Dom\XMLDocument::C14N() drops namespace declarations on DOM-built documents) +--CREDITS-- +Toon Verwerft (veewee) +--EXTENSIONS-- +dom +--FILE-- +createElementNS("urn:envelope", "env:Root"); +$doc->appendChild($root); +$child = $doc->createElementNS("urn:child", "x:Child"); +$root->appendChild($child); + +$parsed = Dom\XMLDocument::createFromString( + '' +); + +echo "DOM-built C14N: " . $doc->C14N() . PHP_EOL; +echo "Parsed C14N: " . $parsed->C14N() . PHP_EOL; +var_dump($doc->C14N() === $parsed->C14N()); + +?> +--EXPECT-- +DOM-built C14N: +Parsed C14N: +bool(true) diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index 64cace889922b..097272a97842e 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -247,11 +247,11 @@ static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const Has */ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC) /* {{{ */ { - php_url *resource = NULL; char *error; phar_archive_data *phar; - if ((resource = phar_parse_url(wrapper, path, mode, options)) == NULL) { + php_url *resource = phar_parse_url(wrapper, path, mode, options); + if (!resource) { php_stream_wrapper_log_error(wrapper, options, "phar url \"%s\" is unknown", path); return NULL; } @@ -343,7 +343,7 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, */ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mode, int options, php_stream_context *context) /* {{{ */ { - phar_entry_info entry, *e; + phar_entry_info entry; phar_archive_data *phar = NULL; char *error; php_url *resource = NULL; @@ -390,7 +390,8 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo return 0; } - if ((e = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 2, &error, true))) { + phar_entry_info *e = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 2, &error, true); + if (e) { /* directory exists, or is a subdirectory of an existing file */ if (e->is_temp_dir) { zend_string_efree(e->filename); @@ -444,7 +445,8 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo entry.flags = PHAR_ENT_PERM_DEF_DIR; entry.old_flags = PHAR_ENT_PERM_DEF_DIR; - if (NULL == zend_hash_add_mem(&phar->manifest, entry.filename, &entry, sizeof(phar_entry_info))) { + void *had_been_added = zend_hash_add_mem(&phar->manifest, entry.filename, &entry, sizeof(phar_entry_info)); + if (!had_been_added) { php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", adding to manifest failed", ZSTR_VAL(entry.filename), phar->fname); zend_string_efree(entry.filename); return 0; @@ -469,10 +471,8 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo */ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context) /* {{{ */ { - phar_entry_info *entry; phar_archive_data *phar = NULL; char *error; - php_url *resource = NULL; /* pre-readonly check, we need to know if this is a data phar */ zend_string *arch = phar_split_fname(url, strlen(url), NULL, 2, 2); @@ -492,7 +492,8 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options return 0; } - if ((resource = phar_parse_url(wrapper, url, "w", options)) == NULL) { + php_url *resource = phar_parse_url(wrapper, url, "w", options); + if (!resource) { return 0; } @@ -518,7 +519,8 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options size_t path_len = ZSTR_LEN(resource->path) - 1; - if (!(entry = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, path_len, 2, &error, true))) { + phar_entry_info *entry = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, path_len, 2, &error, true); + if (!entry) { if (error) { php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error); efree(error); diff --git a/ext/phar/func_interceptors.c b/ext/phar/func_interceptors.c index 297de62231fdd..a3a0590f94c58 100644 --- a/ext/phar/func_interceptors.c +++ b/ext/phar/func_interceptors.c @@ -106,7 +106,8 @@ static zend_string* phar_get_name_for_relative_paths(zend_string *filename, bool zend_string *name = NULL; if (using_include_path) { - if (!(name = phar_find_in_include_path(filename, NULL))) { + name = phar_find_in_include_path(filename, NULL); + if (!name) { /* this file is not in the phar, use the original path */ zend_string_release_ex(arch, false); return NULL; @@ -337,15 +338,12 @@ static void phar_fancy_stat(zend_stat_t *stat_sb, int type, zval *return_value) wmask=S_IWGRP; xmask=S_IXGRP; } else { - int groups, n, i; - gid_t *gids; - - groups = getgroups(0, NULL); - if(groups > 0) { - gids=(gid_t *)safe_emalloc(groups, sizeof(gid_t), 0); - n=getgroups(groups, gids); - for(i=0;ist_gid==gids[i]) { + int groups = getgroups(0, NULL); + if (groups > 0) { + gid_t *gids = safe_emalloc(groups, sizeof(gid_t), 0); + int n = getgroups(groups, gids); + for(int i = 0; i < n; ++i){ + if (stat_sb->st_gid==gids[i]) { rmask=S_IRGRP; wmask=S_IWGRP; xmask=S_IXGRP; @@ -844,7 +842,8 @@ void phar_release_functions(void) /* {{{ void phar_intercept_functions_init(void) */ #define PHAR_INTERCEPT(func) \ PHAR_G(orig_##func) = NULL; \ - if (NULL != (orig = zend_hash_str_find_ptr(CG(function_table), #func, sizeof(#func)-1))) { \ + orig = zend_hash_str_find_ptr(CG(function_table), #func, sizeof(#func)-1); \ + if (orig) { \ PHAR_G(orig_##func) = orig->internal_function.handler; \ orig->internal_function.handler = PHP_FN(phar_##func); \ } diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 4855517dd627a..b0d56c8067e87 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -91,7 +91,7 @@ HashTable cached_alias; static void phar_split_cache_list(void) /* {{{ */ { char *tmp; - char *key, *lasts, *end; + char *key, *lasts; char ds[2]; phar_archive_data *phar; uint32_t i = 0; @@ -124,7 +124,7 @@ static void phar_split_cache_list(void) /* {{{ */ key; key = php_strtok_r(NULL, ds, &lasts)) { size_t len; - end = strchr(key, DEFAULT_DIR_SEPARATOR); + const char *end = strchr(key, DEFAULT_DIR_SEPARATOR); if (end) { len = end - key; } else { @@ -1263,7 +1263,8 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname MAPPHAR_FAIL("Cannot open archive \"%s\", invalid alias"); } - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { signature = NULL; fp = NULL; @@ -1460,10 +1461,9 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c /* assume tar format, PharData can specify other */ mydata->is_tar = 1; } else { - phar_archive_data *fd_ptr; - - if (alias && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr)) { + if (alias) { + const phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (fd_ptr && SUCCESS != phar_free_alias(fd_ptr)) { spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", mydata->fname, alias); zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len); @@ -1669,14 +1669,14 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l continue; } else if (!memcmp(pos, bz_magic, 3)) { php_stream_filter *filter; - php_stream *temp; if (!PHAR_G(has_bz2)) { MAPPHAR_ALLOC_FAIL("unable to decompress bzipped phar archive \"%s\" to temporary file, enable bz2 extension in php.ini") } /* entire file is bzip-compressed, uncompress to temporary file */ - if (!(temp = php_stream_fopen_tmpfile())) { + php_stream *temp = php_stream_fopen_tmpfile(); + if (!temp) { MAPPHAR_ALLOC_FAIL("unable to create temporary file for decompression of bzipped phar archive \"%s\"") } @@ -1750,10 +1750,10 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l static zend_result phar_analyze_path(const char *fname, const char *ext, size_t ext_len, int for_create) /* {{{ */ { php_stream_statbuf ssb; - char *realpath; char *filename = estrndup(fname, (ext - fname) + ext_len); - if ((realpath = expand_filepath(filename, NULL))) { + char *realpath = expand_filepath(filename, NULL); + if (realpath) { #ifdef PHP_WIN32 phar_unixify_path_separators(realpath, strlen(realpath)); #endif @@ -1800,7 +1800,8 @@ static zend_result phar_analyze_path(const char *fname, const char *ext, size_t if (SUCCESS != php_stream_stat_path((char *) filename, &ssb)) { if (!slash) { - if (!(realpath = expand_filepath(filename, NULL))) { + realpath = expand_filepath(filename, NULL); + if (!realpath) { efree(filename); return FAILURE; } @@ -1943,7 +1944,8 @@ zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len phar_archive_data *pphar; if (is_complete) { - if (NULL != (pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), (char *) filename, filename_len))) { + pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), filename, filename_len); + if (pphar) { *ext_str = filename + (filename_len - pphar->ext_len); woohoo: *ext_len = pphar->ext_len; @@ -1963,7 +1965,8 @@ zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len return FAILURE; } - if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_str_find_ptr(&cached_phars, (char *) filename, filename_len))) { + pphar = PHAR_G(manifest_cached) ? zend_hash_str_find_ptr(&cached_phars, filename, filename_len) : NULL; + if (pphar) { *ext_str = filename + (filename_len - pphar->ext_len); goto woohoo; } diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index db2856309fcb7..8d7632fbb4dd4 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -146,7 +146,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phar) char *openssl_privatekey; uint32_t openssl_privatekey_len; /* phar_get_archive cache */ - char* last_phar_name; + const char *last_phar_name; uint32_t last_phar_name_len; uint32_t last_alias_len; const char* last_alias; @@ -245,9 +245,9 @@ typedef struct _phar_entry_info { struct _phar_archive_data { char *fname; uint32_t fname_len; - /* for phar_detect_fname_ext, this stores the location of the file extension within fname */ + /* The ext field stores the location of the file extension from the fname field, and thus should never be freed. */ uint32_t ext_len; - char *ext; + const char *ext; char *alias; uint32_t alias_len; char version[12]; diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 2e309d9a9831d..0cde5704c2d08 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -44,7 +44,6 @@ static zend_class_entry *phar_ce_entry; static int phar_file_type(const HashTable *mimes, const char *file, char **mime_type) /* {{{ */ { - phar_mime_type *mime; const char *ext = strrchr(file, '.'); if (!ext) { *mime_type = "text/plain"; @@ -52,7 +51,9 @@ static int phar_file_type(const HashTable *mimes, const char *file, char **mime_ return PHAR_MIME_OTHER; } ++ext; - if (NULL == (mime = zend_hash_str_find_ptr(mimes, ext, strlen(ext)))) { + + phar_mime_type *mime = zend_hash_str_find_ptr(mimes, ext, strlen(ext)); + if (!mime) { *mime_type = "application/octet-stream"; return PHAR_MIME_OTHER; } @@ -64,7 +65,6 @@ static int phar_file_type(const HashTable *mimes, const char *file, char **mime_ static void phar_mung_server_vars(char *fname, char *entry, size_t entry_len, const char *basename, size_t request_uri_len) /* {{{ */ { HashTable *_SERVER; - zval *stuff; char *path_info; size_t basename_len = strlen(basename); size_t code; @@ -78,23 +78,25 @@ static void phar_mung_server_vars(char *fname, char *entry, size_t entry_len, co _SERVER = Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]); /* PATH_INFO and PATH_TRANSLATED should always be munged */ - if (NULL != (stuff = zend_hash_str_find(_SERVER, "PATH_INFO", sizeof("PATH_INFO")-1))) { + zval *stuff = zend_hash_str_find(_SERVER, ZEND_STRL("PATH_INFO")); + if (stuff) { path_info = Z_STRVAL_P(stuff); code = Z_STRLEN_P(stuff); if (code > (size_t)entry_len && !memcmp(path_info, entry, entry_len)) { ZVAL_STR(&temp, Z_STR_P(stuff)); ZVAL_STRINGL(stuff, path_info + entry_len, request_uri_len); - zend_hash_str_update(_SERVER, "PHAR_PATH_INFO", sizeof("PHAR_PATH_INFO")-1, &temp); + zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_PATH_INFO"), &temp); } } - if (NULL != (stuff = zend_hash_str_find(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED")-1))) { + stuff = zend_hash_str_find(_SERVER, ZEND_STRL("PATH_TRANSLATED")); + if (stuff) { zend_string *str = strpprintf(4096, "phar://%s%s", fname, entry); ZVAL_STR(&temp, Z_STR_P(stuff)); ZVAL_NEW_STR(stuff, str); - zend_hash_str_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED")-1, &temp); + zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_PATH_TRANSLATED"), &temp); } if (!PHAR_G(phar_SERVER_mung_list)) { @@ -102,46 +104,50 @@ static void phar_mung_server_vars(char *fname, char *entry, size_t entry_len, co } if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_REQUEST_URI) { - if (NULL != (stuff = zend_hash_str_find(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI")-1))) { + stuff = zend_hash_str_find(_SERVER, ZEND_STRL("REQUEST_URI")); + if (stuff) { path_info = Z_STRVAL_P(stuff); code = Z_STRLEN_P(stuff); if (code > basename_len && !memcmp(path_info, basename, basename_len)) { ZVAL_STR(&temp, Z_STR_P(stuff)); ZVAL_STRINGL(stuff, path_info + basename_len, code - basename_len); - zend_hash_str_update(_SERVER, "PHAR_REQUEST_URI", sizeof("PHAR_REQUEST_URI")-1, &temp); + zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_REQUEST_URI"), &temp); } } } if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_PHP_SELF) { - if (NULL != (stuff = zend_hash_str_find(_SERVER, "PHP_SELF", sizeof("PHP_SELF")-1))) { + stuff = zend_hash_str_find(_SERVER, ZEND_STRL("PHP_SELF")); + if (stuff) { path_info = Z_STRVAL_P(stuff); code = Z_STRLEN_P(stuff); if (code > basename_len && !memcmp(path_info, basename, basename_len)) { ZVAL_STR(&temp, Z_STR_P(stuff)); ZVAL_STRINGL(stuff, path_info + basename_len, code - basename_len); - zend_hash_str_update(_SERVER, "PHAR_PHP_SELF", sizeof("PHAR_PHP_SELF")-1, &temp); + zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_PHP_SELF"), &temp); } } } if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_SCRIPT_NAME) { - if (NULL != (stuff = zend_hash_str_find(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME")-1))) { + stuff = zend_hash_str_find(_SERVER, ZEND_STRL("SCRIPT_NAME")); + if (stuff) { ZVAL_STR(&temp, Z_STR_P(stuff)); ZVAL_STRINGL(stuff, entry, entry_len); - zend_hash_str_update(_SERVER, "PHAR_SCRIPT_NAME", sizeof("PHAR_SCRIPT_NAME")-1, &temp); + zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_SCRIPT_NAME"), &temp); } } if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_SCRIPT_FILENAME) { - if (NULL != (stuff = zend_hash_str_find(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME")-1))) { + stuff = zend_hash_str_find(_SERVER, ZEND_STRL("SCRIPT_FILENAME")); + if (stuff) { zend_string *str = strpprintf(4096, "phar://%s%s", fname, entry); ZVAL_STR(&temp, Z_STR_P(stuff)); ZVAL_NEW_STR(stuff, str); - zend_hash_str_update(_SERVER, "PHAR_SCRIPT_FILENAME", sizeof("PHAR_SCRIPT_FILENAME")-1, &temp); + zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_SCRIPT_FILENAME"), &temp); } } } @@ -319,10 +325,9 @@ static void phar_do_403(void) /* {{{ */ static void phar_do_404(phar_archive_data *phar, char *fname, size_t fname_len, zend_string *f404) /* {{{ */ { sapi_header_line ctr = {0}; - phar_entry_info *info; if (phar && f404 && ZSTR_LEN(f404)) { - info = phar_get_entry_info(phar, ZSTR_VAL(f404), ZSTR_LEN(f404), NULL, true); + phar_entry_info *info = phar_get_entry_info(phar, ZSTR_VAL(f404), ZSTR_LEN(f404), NULL, true); if (info) { /* Status doesn't matter, we're exiting anyway. */ @@ -344,7 +349,7 @@ static void phar_do_404(phar_archive_data *phar, char *fname, size_t fname_len, /* post-process REQUEST_URI and retrieve the actual request URI. This is for cases like http://localhost/blah.phar/path/to/file.php/extra/stuff which calls "blah.phar" file "path/to/file.php" with PATH_INFO "/extra/stuff" */ -static void phar_postprocess_ru_web(char *fname, size_t fname_len, char *entry, size_t *entry_len, char **ru, size_t *ru_len) /* {{{ */ +static void phar_postprocess_ru_web(const char *fname, size_t fname_len, char *entry, size_t *entry_len, char **ru, size_t *ru_len) /* {{{ */ { char *e = entry + 1, *u1 = NULL, *u = NULL, *saveu = NULL; size_t e_len = *entry_len - 1, u_len = 0; @@ -479,7 +484,8 @@ PHP_METHOD(Phar, mount) goto finish; } carry_on2: - if (NULL == (pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), arch))) { + pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), arch); + if (!pphar) { if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_find_ptr(&cached_phars, arch))) { if (SUCCESS == phar_copy_on_write(&pphar)) { goto carry_on; @@ -642,7 +648,9 @@ PHP_METHOD(Phar, webPhar) if (!testit) { goto finish; } - if (!(pt = strstr(testit, basename))) { + + pt = strstr(testit, basename); + if (!pt) { efree(testit); goto finish; } @@ -668,7 +676,8 @@ PHP_METHOD(Phar, webPhar) } else { path_info = SG(request_info).request_uri; - if (!(pt = strstr(path_info, basename))) { + pt = strstr(path_info, basename); + if (!pt) { /* this can happen with rewrite rules - and we have no idea what to do then, so return */ goto finish; } @@ -1626,7 +1635,8 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */ return ZEND_HASH_APPLY_KEEP; } - if (!(data = phar_build_entry_data(phar_obj->archive->fname, phar_obj->archive->fname_len, str_key, str_key_len, &error, value))) { + data = phar_build_entry_data(phar_obj->archive->fname, phar_obj->archive->fname_len, str_key, str_key_len, &error, value); + if (!data) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s cannot be created: %s", str_key, error); efree(error); @@ -1937,7 +1947,6 @@ static zend_result phar_copy_file_contents(phar_entry_info *entry, php_stream *f static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* {{{ */ { - const char *oldname = NULL; phar_archive_data *phar = *sphar; char *oldpath = NULL; char *basename = NULL, *basepath = NULL; @@ -1947,7 +1956,7 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* char *error = NULL; const char *pcr_error; size_t ext_len = ext ? strlen(ext) : 0; - size_t new_len, oldname_len, phar_ext_len; + size_t new_len, phar_ext_len; phar_archive_data *pphar = NULL; php_stream_statbuf ssb; @@ -2028,25 +2037,27 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* oldpath = estrndup(phar->fname, phar->fname_len); - if ((oldname = zend_memrchr(phar->fname, '/', phar->fname_len))) { - ++oldname; + + const char *old_name = zend_memrchr(phar->fname, '/', phar->fname_len); + if (old_name) { + ++old_name; } else { - oldname = phar->fname; + old_name = phar->fname; } - oldname_len = strlen(oldname); + size_t old_name_len = strlen(old_name); /* Copy the old name to create base for the new name */ - basename = estrndup(oldname, oldname_len); + basename = estrndup(old_name, old_name_len); phar_ext_list_len = sizeof(phar_ext_list)/sizeof(phar_ext_list[0]); /* Remove possible PHAR extensions */ /* phar_ext_list must be in order of longest extension to shortest */ for (i=0; i < phar_ext_list_len; i++) { phar_ext_len = strlen(phar_ext_list[i]); - if (phar_ext_len && oldname_len > phar_ext_len) { + if (phar_ext_len && old_name_len > phar_ext_len) { /* Check if the basename strings ends with the extension */ - if (memcmp(phar_ext_list[i], basename + (oldname_len - phar_ext_len), phar_ext_len) == 0) { - ext_pos = basename + (oldname_len - phar_ext_len); + if (memcmp(phar_ext_list[i], basename + (old_name_len - phar_ext_len), phar_ext_len) == 0) { + ext_pos = basename + (old_name_len - phar_ext_len); ext_pos[0] = '\0'; break; } @@ -2070,7 +2081,7 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* spprintf(&newname, 0, "%s.%s", basename, ext); efree(basename); - basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len)); + basepath = estrndup(oldpath, (strlen(oldpath) - old_name_len)); new_len = spprintf(&newpath, 0, "%s%s", basepath, newname); phar->fname_len = new_len; phar->fname = newpath; @@ -2113,7 +2124,7 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* goto err_reused_oldpath; } if (!phar->is_data) { - if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &ext_len, 1, 1, true)) { + if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, &(phar->ext), &ext_len, 1, 1, true)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar \"%s\" has invalid extension %s", phar->fname, ext); goto err_reused_oldpath; } @@ -2136,7 +2147,7 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* } else { - if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &ext_len, 0, 1, true)) { + if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, &(phar->ext), &ext_len, 0, 1, true)) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "data phar \"%s\" has invalid extension %s", phar->fname, ext); goto err_reused_oldpath; } @@ -3380,7 +3391,7 @@ PHP_METHOD(Phar, copy) { char *error; const char *pcr_error; - phar_entry_info *oldentry, newentry = {0}, *temp; + phar_entry_info newentry = {0}; zend_string *new_file = NULL; zend_string *old_file = NULL; @@ -3410,13 +3421,15 @@ PHP_METHOD(Phar, copy) RETURN_THROWS(); } - if (NULL == (oldentry = zend_hash_find_ptr(&phar_obj->archive->manifest, old_file)) || oldentry->is_deleted) { + phar_entry_info *oldentry = zend_hash_find_ptr(&phar_obj->archive->manifest, old_file); + if (!oldentry || oldentry->is_deleted) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "file \"%s\" cannot be copied to file \"%s\", file does not exist in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), phar_obj->archive->fname); RETURN_THROWS(); } - if (NULL != (temp = zend_hash_find_ptr(&phar_obj->archive->manifest, new_file)) && !temp->is_deleted) { + const phar_entry_info *temp = zend_hash_find_ptr(&phar_obj->archive->manifest, new_file); + if (temp && !temp->is_deleted) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "file \"%s\" cannot be copied to file \"%s\", file must not already exist in phar %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), phar_obj->archive->fname); RETURN_THROWS(); @@ -3503,7 +3516,6 @@ PHP_METHOD(Phar, offsetExists) PHP_METHOD(Phar, offsetGet) { char *error; - phar_entry_info *entry; zend_string *file_name = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &file_name) == FAILURE) { @@ -3513,7 +3525,8 @@ PHP_METHOD(Phar, offsetGet) PHAR_ARCHIVE_OBJECT(); /* security is 0 here so that we can get a better error message than "entry doesn't exist" */ - if (!(entry = phar_get_entry_info_dir(phar_obj->archive, ZSTR_VAL(file_name), ZSTR_LEN(file_name), 1, &error, false))) { + phar_entry_info *entry = phar_get_entry_info_dir(phar_obj->archive, ZSTR_VAL(file_name), ZSTR_LEN(file_name), 1, &error, false); + if (!entry) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist%s%s", ZSTR_VAL(file_name), error?", ":"", error?error:""); } else { if (entry->is_temp_dir) { @@ -3554,7 +3567,6 @@ PHP_METHOD(Phar, offsetGet) static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, const zend_string *content, zval *zresource) { char *error; - phar_entry_data *data; php_stream *contents_file = NULL; php_stream_statbuf ssb; #ifdef PHP_WIN32 @@ -3586,7 +3598,8 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con } #endif - if (!(data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, filename, filename_len, "w+b", 0, &error, true, time(NULL)))) { + phar_entry_data *data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, filename, filename_len, "w+b", 0, &error, true, time(NULL)); + if (!data) { if (error) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist and cannot be created: %s", filename, error); efree(error); @@ -3658,9 +3671,9 @@ finish: ; static void phar_mkdir(phar_archive_data **pphar, zend_string *dir_name) { char *error; - phar_entry_data *data; + phar_entry_data *data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, ZSTR_VAL(dir_name), ZSTR_LEN(dir_name), "w+b", 2, &error, true, time(NULL)); - if (!(data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, ZSTR_VAL(dir_name), ZSTR_LEN(dir_name), "w+b", 2, &error, true, time(NULL)))) { + if (!data) { if (error) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Directory %s does not exist and cannot be created: %s", ZSTR_VAL(dir_name), error); efree(error); @@ -3732,7 +3745,6 @@ PHP_METHOD(Phar, offsetUnset) { char *error; zend_string *file_name; - phar_entry_info *entry; if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &file_name) == FAILURE) { RETURN_THROWS(); @@ -3746,7 +3758,8 @@ PHP_METHOD(Phar, offsetUnset) } if (zend_hash_exists(&phar_obj->archive->manifest, file_name)) { - if (NULL != (entry = zend_hash_find_ptr(&phar_obj->archive->manifest, file_name))) { + phar_entry_info *entry = zend_hash_find_ptr(&phar_obj->archive->manifest, file_name); + if (entry) { if (entry->is_deleted) { /* entry is deleted, but has not been flushed to disk yet */ return; @@ -3799,7 +3812,6 @@ PHP_METHOD(Phar, addFile) { zend_string *file_name; zend_string *local_name = NULL; - php_stream *resource; zval zresource; if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|S!", &file_name, &local_name) == FAILURE) { @@ -3813,7 +3825,8 @@ PHP_METHOD(Phar, addFile) RETURN_THROWS(); } - if (!(resource = php_stream_open_wrapper(ZSTR_VAL(file_name), "rb", 0, NULL))) { + php_stream *resource = php_stream_open_wrapper(ZSTR_VAL(file_name), "rb", 0, NULL); + if (!resource) { zend_throw_exception_ex(spl_ce_RuntimeException, 0, "phar error: unable to open file \"%s\" to add to phar archive", ZSTR_VAL(file_name)); RETURN_THROWS(); } @@ -3851,19 +3864,20 @@ PHP_METHOD(Phar, getStub) zend_string *buf; php_stream *fp; php_stream_filter *filter = NULL; - phar_entry_info *stub; ZEND_PARSE_PARAMETERS_NONE(); PHAR_ARCHIVE_OBJECT(); if (phar_obj->archive->is_tar || phar_obj->archive->is_zip) { + const phar_entry_info *stub = zend_hash_str_find_ptr(&(phar_obj->archive->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1); - if (NULL != (stub = zend_hash_str_find_ptr(&(phar_obj->archive->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1))) { + if (stub) { if (phar_obj->archive->fp && !phar_obj->archive->is_brandnew && !(stub->flags & PHAR_ENT_COMPRESSION_MASK)) { fp = phar_obj->archive->fp; } else { - if (!(fp = php_stream_open_wrapper(phar_obj->archive->fname, "rb", 0, NULL))) { + fp = php_stream_open_wrapper(phar_obj->archive->fname, "rb", 0, NULL); + if (!fp) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "phar error: unable to open phar \"%s\"", phar_obj->archive->fname); RETURN_THROWS(); } @@ -4778,7 +4792,6 @@ PHP_METHOD(PharFileInfo, delMetadata) PHP_METHOD(PharFileInfo, getContent) { char *error; - php_stream *fp; phar_entry_info *link; zend_string *str; @@ -4805,7 +4818,8 @@ PHP_METHOD(PharFileInfo, getContent) RETURN_THROWS(); } - if (!(fp = phar_get_efp(link, false))) { + php_stream *fp = phar_get_efp(link, false); + if (!fp) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar error: Cannot retrieve contents of \"%s\" in phar \"%s\"", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname); RETURN_THROWS(); diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 7abb7e6422ea2..ea5f652dd5664 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -163,11 +163,11 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha char *internal_file; char *error; HashTable *pharcontext; - php_url *resource = NULL; php_stream *fpf; zval *pzoption, *metadata; - if ((resource = phar_parse_url(wrapper, path, mode, options)) == NULL) { + php_url *resource = phar_parse_url(wrapper, path, mode, options); + if (!resource) { return NULL; } @@ -320,7 +320,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha } if (!PHAR_G(cwd_init) && (options & STREAM_OPEN_FOR_INCLUDE)) { - char *entry = ZSTR_VAL(idata->internal_file->filename), *cwd; + const char *entry = ZSTR_VAL(idata->internal_file->filename), *cwd; PHAR_G(cwd_init) = 1; if ((idata->phar->is_tar || idata->phar->is_zip) && zend_string_equals_literal(idata->internal_file->filename, ".phar/stub.php")) { @@ -556,13 +556,12 @@ static int phar_stream_stat(php_stream *stream, php_stream_statbuf *ssb) /* {{{ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context) /* {{{ */ { - php_url *resource = NULL; char *internal_file; phar_archive_data *phar; - phar_entry_info *entry; size_t internal_file_len; - if ((resource = phar_parse_url(wrapper, url, "r", flags|PHP_STREAM_URL_STAT_QUIET)) == NULL) { + php_url *resource = phar_parse_url(wrapper, url, "r", flags|PHP_STREAM_URL_STAT_QUIET); + if (!resource) { return FAILURE; } @@ -597,7 +596,8 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f } internal_file_len = strlen(internal_file); /* search through the manifest of files, and if we have an exact match, it's a file */ - if (NULL != (entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len))) { + phar_entry_info *entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len); + if (entry) { phar_dostat(phar, entry, ssb, false); php_url_free(resource); return SUCCESS; @@ -636,7 +636,9 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f goto free_resource; } efree(test); - if (NULL == (entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len))) { + + entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len); + if (!entry) { goto free_resource; } phar_dostat(phar, entry, ssb, false); @@ -656,13 +658,13 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f */ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context) /* {{{ */ { - php_url *resource; char *internal_file, *error; size_t internal_file_len; phar_entry_data *idata; phar_archive_data *pphar; - if ((resource = phar_parse_url(wrapper, url, "rb", options)) == NULL) { + php_url *resource = phar_parse_url(wrapper, url, "rb", options); + if (!resource) { php_stream_wrapper_log_error(wrapper, options, "phar error: unlink failed"); return 0; } @@ -728,16 +730,15 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context) /* {{{ */ { - php_url *resource_from, *resource_to; char *error; phar_archive_data *phar, *pfrom, *pto; - phar_entry_info *entry; bool is_dir = false; bool is_modified = false; error = NULL; - if ((resource_from = phar_parse_url(wrapper, url_from, "wb", options|PHP_STREAM_URL_STAT_QUIET)) == NULL) { + php_url *resource_from = phar_parse_url(wrapper, url_from, "wb", options|PHP_STREAM_URL_STAT_QUIET); + if (!resource_from) { php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"", url_from, url_to, url_from); return 0; } @@ -753,7 +754,8 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from return 0; } - if ((resource_to = phar_parse_url(wrapper, url_to, "wb", options|PHP_STREAM_URL_STAT_QUIET)) == NULL) { + php_url *resource_to = phar_parse_url(wrapper, url_to, "wb", options|PHP_STREAM_URL_STAT_QUIET); + if (!resource_to) { php_url_free(resource_from); php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"", url_from, url_to, url_to); return 0; @@ -822,7 +824,8 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from return 0; } - if (NULL != (entry = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(resource_from->path)+1, ZSTR_LEN(resource_from->path)-1))) { + phar_entry_info *entry = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(resource_from->path)+1, ZSTR_LEN(resource_from->path)-1); + if (entry) { phar_entry_info new, *source; /* perform rename magic */ diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 844f613983f7b..0c042517125c8 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -658,11 +658,9 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l myphar = actual; if (actual_alias) { - phar_archive_data *fd_ptr; - myphar->is_temporary_alias = 0; - - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len))) { + phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len); + if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\", alias is already in use", fname); @@ -674,10 +672,9 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len, myphar); } else { - phar_archive_data *fd_ptr; - if (alias_len) { - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { + phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\", alias is already in use", fname); @@ -909,7 +906,7 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argumen { struct _phar_pass_tar_info *i = (struct _phar_pass_tar_info *)argument; char **error = i->error; - phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv), *metadata, newentry = {0}; + phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv), newentry = {0}; if (zend_string_starts_with_literal(entry->filename, ".phar/.metadata")) { if (zend_string_equals_literal(entry->filename, ".phar/.metadata.bin")) { @@ -937,7 +934,8 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argumen return ZEND_HASH_APPLY_KEEP; } - if (NULL != (metadata = zend_hash_find_ptr(&entry->phar->manifest, lookfor))) { + phar_entry_info *metadata = zend_hash_find_ptr(&entry->phar->manifest, lookfor); + if (metadata) { int ret; ret = phar_tar_setmetadata(&entry->metadata_tracker, metadata, error); zend_string_efree(lookfor); @@ -949,7 +947,8 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argumen newentry.tar_type = TAR_FILE; newentry.is_tar = 1; - if (NULL == (metadata = zend_hash_add_mem(&entry->phar->manifest, lookfor, &newentry, sizeof(phar_entry_info)))) { + metadata = zend_hash_add_mem(&entry->phar->manifest, lookfor, &newentry, sizeof(phar_entry_info)); + if (!metadata) { zend_string_efree(lookfor); spprintf(error, 0, "phar tar error: unable to add magic metadata file to manifest for file \"%s\"", ZSTR_VAL(entry->filename)); return ZEND_HASH_APPLY_STOP; @@ -1104,8 +1103,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze pass.free_ufp = true; if (phar_metadata_tracker_has_data(&phar->metadata_tracker, phar->is_persistent)) { - phar_entry_info *mentry; - if (NULL != (mentry = zend_hash_str_find_ptr(&(phar->manifest), ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1))) { + phar_entry_info *mentry = zend_hash_str_find_ptr(&(phar->manifest), ZEND_STRL(".phar/.metadata.bin")); + if (mentry) { if (ZEND_HASH_APPLY_KEEP != phar_tar_setmetadata(&phar->metadata_tracker, mentry, error)) { if (must_close_old_file) { php_stream_close(oldfile); @@ -1120,7 +1119,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze newentry.tar_type = TAR_FILE; newentry.is_tar = 1; - if (NULL == (mentry = zend_hash_add_mem(&phar->manifest, newentry.filename, &newentry, sizeof(phar_entry_info)))) { + mentry = zend_hash_add_mem(&phar->manifest, newentry.filename, &newentry, sizeof(phar_entry_info)); + if (!mentry) { zend_string_efree(newentry.filename); spprintf(error, 0, "phar tar error: unable to add magic metadata file to manifest for phar archive \"%s\"", phar->fname); if (must_close_old_file) { diff --git a/ext/phar/util.c b/ext/phar/util.c index e0f4dc3da6c70..5cd51c65ba942 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -493,14 +493,16 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, co } really_get_entry: if (allow_dir) { - if ((entry = phar_get_entry_info_dir(phar, path, path_len, allow_dir, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security)) == NULL) { + entry = phar_get_entry_info_dir(phar, path, path_len, allow_dir, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security); + if (!entry) { if (for_create && (!PHAR_G(readonly) || phar->is_data)) { return SUCCESS; } return FAILURE; } } else { - if ((entry = phar_get_entry_info(phar, path, path_len, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security)) == NULL) { + entry = phar_get_entry_info(phar, path, path_len, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security); + if (!entry) { if (for_create && (!PHAR_G(readonly) || phar->is_data)) { return SUCCESS; } @@ -612,7 +614,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, co ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp) /* {{{ */ { phar_archive_data *phar; - phar_entry_info *entry, etemp; + phar_entry_info etemp; phar_entry_data *ret; const char *pcr_error; char is_dir; @@ -682,7 +684,8 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fnam etemp.tar_type = etemp.is_dir ? TAR_DIR : TAR_FILE; } - if (NULL == (entry = zend_hash_add_mem(&phar->manifest, etemp.filename, &etemp, sizeof(phar_entry_info)))) { + phar_entry_info *entry = zend_hash_add_mem(&phar->manifest, etemp.filename, &etemp, sizeof(phar_entry_info)); + if (!entry) { php_stream_close(etemp.fp); spprintf(error, 0, "phar error: unable to add new entry \"%s\" to phar \"%s\"", ZSTR_VAL(etemp.filename), phar->fname); @@ -1001,7 +1004,8 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } if (alias && alias_len) { - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (fd_ptr) { alias_success: if (fname && (fname_len != fd_ptr->fname_len || strncmp(fname, fd_ptr->fname, fname_len))) { if (error) { @@ -1037,7 +1041,8 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz size_t save_len = fname_len; if (fname && fname_len) { - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) { + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len); + if (fd_ptr) { *archive = fd_ptr; fd = fd_ptr; @@ -1089,7 +1094,8 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), save, save_len))) { + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), save, save_len); + if (fd_ptr) { fd = *archive = fd_ptr; PHAR_G(last_phar) = fd; @@ -1127,7 +1133,8 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return FAILURE; } - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) { + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len); + if (fd_ptr) { realpath_success: *archive = fd_ptr; fd = fd_ptr; @@ -1215,7 +1222,6 @@ phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, bool security) /* {{{ */ { const char *pcr_error; - phar_entry_info *entry; bool is_dir; #ifdef PHP_WIN32 @@ -1260,7 +1266,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si path_len--; } - if (NULL != (entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len))) { + phar_entry_info *entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len); + if (entry) { if (entry->is_deleted) { /* entry is deleted, but has not been flushed to disk yet */ return NULL; @@ -1304,7 +1311,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si size_t test_len; php_stream_statbuf ssb; - if (NULL == (entry = zend_hash_find_ptr(&phar->manifest, str_key))) { + entry = zend_hash_find_ptr(&phar->manifest, str_key); + if (!entry) { if (error) { spprintf(error, 4096, "phar internal error: mounted path \"%s\" could not be retrieved from manifest", ZSTR_VAL(str_key)); } @@ -1353,7 +1361,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si efree(test); - if (NULL == (entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len))) { + entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len); + if (!entry) { if (error) { spprintf(error, 4096, "phar error: path \"%s\" exists as file \"%s\" and could not be retrieved after being mounted", path, test); } @@ -1522,17 +1531,22 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s pfp = php_stream_open_wrapper(pfile, "rb", 0, NULL); efree(pfile); - if (!pfp || !(pubkey = php_stream_copy_to_mem(pfp, PHP_STREAM_COPY_ALL, 0)) || !ZSTR_LEN(pubkey)) { - if (pfp) { - php_stream_close(pfp); - } + if (!pfp) { if (error) { *error = estrdup("openssl public key could not be read"); } return FAILURE; } + pubkey = php_stream_copy_to_mem(pfp, PHP_STREAM_COPY_ALL, 0); php_stream_close(pfp); + if (!pubkey || !ZSTR_LEN(pubkey)) { + if (error) { + *error = estrdup("openssl public key could not be read"); + } + return FAILURE; + } + #ifndef PHAR_HAVE_OPENSSL tempsig = sig_len; diff --git a/ext/phar/zip.c b/ext/phar/zip.c index f757adc90c88b..ec23603d9be9e 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -726,7 +726,6 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l zend_hash_str_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len, mydata); if (actual_alias) { - phar_archive_data *fd_ptr; if (!phar_validate_alias(actual_alias, mydata->alias_len)) { if (error) { @@ -739,7 +738,8 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l mydata->is_temporary_alias = 0; - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, mydata->alias_len))) { + phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, mydata->alias_len); + if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with implicit alias, alias is already in use", fname); @@ -758,10 +758,9 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), mydata->alias, mydata->alias_len, mydata); } else { - phar_archive_data *fd_ptr; - if (alias_len) { - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { + phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with explicit alias, alias is already in use", fname);