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);