From: Dmitry Stogov Date: Thu, 2 Nov 2017 16:28:34 +0000 (+0300) Subject: Use persistent strings for preloaded phar files X-Git-Tag: php-7.3.0alpha1~1101 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=238916b5c9b7d09a711aad5656710eb4d1a80518;p=php Use persistent strings for preloaded phar files --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 34ba5c692a..0720582334 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -662,6 +662,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char zend_long offset; int sig_len, register_alias = 0, temp_alias = 0; char *signature = NULL; + zend_string *str; if (pphar) { *pphar = NULL; @@ -1173,7 +1174,13 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char /* if signature matched, no need to check CRC32 for each file */ entry.is_crc_checked = (manifest_flags & PHAR_HDR_SIGNATURE ? 1 : 0); phar_set_inode(&entry); - zend_hash_str_add_mem(&mydata->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info)); + if (mydata->is_persistent) { + str = zend_string_init_interned(entry.filename, entry.filename_len, 1); + } else { + str = zend_string_init(entry.filename, entry.filename_len, 0); + } + zend_hash_add_mem(&mydata->manifest, str, (void*)&entry, sizeof(phar_entry_info)); + zend_string_release(str); } snprintf(mydata->version, sizeof(mydata->version), "%u.%u.%u", manifest_ver >> 12, (manifest_ver >> 8) & 0xF, (manifest_ver >> 4) & 0xF); @@ -1221,12 +1228,24 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char } } - zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata); + if (mydata->is_persistent) { + str = zend_string_init_interned(alias, alias_len, 1); + } else { + str = zend_string_init(alias, alias_len, 0); + } + zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), str, mydata); + zend_string_release(str); } else { mydata->is_temporary_alias = 1; } - zend_hash_str_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len, mydata); + if (mydata->is_persistent) { + str = zend_string_init_interned(mydata->fname, fname_len, 1); + } else { + str = zend_string_init(mydata->fname, fname_len, 0); + } + zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), str, mydata); + zend_string_release(str); efree(savebuf); if (pphar) { diff --git a/ext/phar/util.c b/ext/phar/util.c index 64a659d54d..e3133735a2 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1948,10 +1948,22 @@ int phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signat void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, int filename_len) /* {{{ */ { const char *s; + zend_string *str; + zval *ret; while ((s = zend_memrchr(filename, '/', filename_len))) { filename_len = s - filename; - if (!filename_len || NULL == zend_hash_str_add_empty_element(&phar->virtual_dirs, filename, filename_len)) { + if (!filename_len) { + break; + } + if (GC_FLAGS(&phar->virtual_dirs) & GC_PERSISTENT) { + str = zend_string_init_interned(filename, filename_len, 1); + } else { + str = zend_string_init(filename, filename_len, 0); + } + ret = zend_hash_add_empty_element(&phar->virtual_dirs, str); + zend_string_release(str); + if (ret == NULL) { break; } }