]> granicus.if.org Git - php/commitdiff
Use persistent strings for preloaded phar files
authorDmitry Stogov <dmitry@zend.com>
Thu, 2 Nov 2017 16:28:34 +0000 (19:28 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 2 Nov 2017 16:28:34 +0000 (19:28 +0300)
ext/phar/phar.c
ext/phar/util.c

index 34ba5c692a9b99848e928f3ce6ad4ae699430a86..07205823340ce100d1ab7b2307dffc6dc86bf199 100644 (file)
@@ -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) {
index 64a659d54d07676fa20ca572f9cd87b7f0f03648..e3133735a25c1a83f9f0c4853fd5b442c3c1eca0 100644 (file)
@@ -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;
                }
        }