From: Nikita Popov Date: Mon, 24 Jun 2019 15:11:21 +0000 (+0200) Subject: Avoid confusing gotos in phar_split_cache_list X-Git-Tag: php-7.4.0alpha2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=43dd1ac5709d92b2a96374e9bbe9de2f0c1cbf63;p=php Avoid confusing gotos in phar_split_cache_list --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 25bb2c9e4a..109ec24afa 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -130,37 +130,33 @@ static void phar_split_cache_list(void) /* {{{ */ for (key = php_strtok_r(tmp, ds, &lasts); key; key = php_strtok_r(NULL, ds, &lasts)) { + size_t len; end = strchr(key, DEFAULT_DIR_SEPARATOR); - if (end) { - if (SUCCESS == phar_open_from_filename(key, end - key, NULL, 0, 0, &phar, NULL)) { -finish_up: - phar->phar_pos = i++; - php_stream_close(phar->fp); - phar->fp = NULL; - } else { -finish_error: - PHAR_G(persist) = 0; - PHAR_G(manifest_cached) = 0; - efree(tmp); - zend_hash_destroy(&(PHAR_G(phar_fname_map))); - HT_INVALIDATE(&PHAR_G(phar_fname_map)); - zend_hash_destroy(&(PHAR_G(phar_alias_map))); - HT_INVALIDATE(&PHAR_G(phar_alias_map)); - zend_hash_destroy(&cached_phars); - zend_hash_destroy(&cached_alias); - zend_hash_graceful_reverse_destroy(&EG(regular_list)); - memset(&EG(regular_list), 0, sizeof(HashTable)); - /* free cached manifests */ - PHAR_G(request_init) = 0; - return; - } + len = end - key; } else { - if (SUCCESS == phar_open_from_filename(key, strlen(key), NULL, 0, 0, &phar, NULL)) { - goto finish_up; - } else { - goto finish_error; - } + len = strlen(key); + } + + if (SUCCESS == phar_open_from_filename(key, len, NULL, 0, 0, &phar, NULL)) { + phar->phar_pos = i++; + php_stream_close(phar->fp); + phar->fp = NULL; + } else { + PHAR_G(persist) = 0; + PHAR_G(manifest_cached) = 0; + efree(tmp); + zend_hash_destroy(&(PHAR_G(phar_fname_map))); + HT_INVALIDATE(&PHAR_G(phar_fname_map)); + zend_hash_destroy(&(PHAR_G(phar_alias_map))); + HT_INVALIDATE(&PHAR_G(phar_alias_map)); + zend_hash_destroy(&cached_phars); + zend_hash_destroy(&cached_alias); + zend_hash_graceful_reverse_destroy(&EG(regular_list)); + memset(&EG(regular_list), 0, sizeof(HashTable)); + /* free cached manifests */ + PHAR_G(request_init) = 0; + return; } }