Skip to content

Commit 2582710

Browse files
authored
ext/phar: refactor phar_copy_cached_phar() to return allocated pointer (#21978)
Rather than changing the pointer to another phar, something extremely confusing
1 parent f777ce3 commit 2582710

1 file changed

Lines changed: 12 additions & 20 deletions

File tree

ext/phar/util.c

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,14 +2008,13 @@ static void phar_manifest_copy_ctor(zval *zv) /* {{{ */
20082008
}
20092009
/* }}} */
20102010

2011-
static void phar_copy_cached_phar(phar_archive_data **pphar) /* {{{ */
2011+
static phar_archive_data* phar_copy_cached_phar(const phar_archive_data *persistent_phar) /* {{{ */
20122012
{
2013-
phar_archive_data *phar;
20142013
HashTable newmanifest;
20152014
phar_archive_object *objphar;
20162015

2017-
phar = (phar_archive_data *) emalloc(sizeof(phar_archive_data));
2018-
*phar = **pphar;
2016+
phar_archive_data *phar = emalloc(sizeof(phar_archive_data));
2017+
*phar = *persistent_phar;
20192018
phar->is_persistent = 0;
20202019
zend_string_addref(phar->fname);
20212020

@@ -2029,47 +2028,40 @@ static void phar_copy_cached_phar(phar_archive_data **pphar) /* {{{ */
20292028

20302029
phar_metadata_tracker_clone(&phar->metadata_tracker);
20312030

2032-
zend_hash_init(&newmanifest, sizeof(phar_entry_info),
2033-
zend_get_hash_value, destroy_phar_manifest_entry, 0);
2034-
zend_hash_copy(&newmanifest, &(*pphar)->manifest, phar_manifest_copy_ctor);
2031+
zend_hash_init(&newmanifest, sizeof(phar_entry_info), NULL, destroy_phar_manifest_entry, 0);
2032+
zend_hash_copy(&newmanifest, &persistent_phar->manifest, phar_manifest_copy_ctor);
20352033
zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar);
20362034
phar->manifest = newmanifest;
2037-
zend_hash_init(&phar->mounted_dirs, sizeof(char *),
2038-
zend_get_hash_value, NULL, 0);
2039-
zend_hash_init(&phar->virtual_dirs, sizeof(char *),
2040-
zend_get_hash_value, NULL, 0);
2041-
zend_hash_copy(&phar->virtual_dirs, &(*pphar)->virtual_dirs, NULL);
2042-
*pphar = phar;
2035+
zend_hash_init(&phar->mounted_dirs, sizeof(char *), NULL, NULL, 0);
2036+
zend_hash_init(&phar->virtual_dirs, sizeof(char *), NULL, NULL, 0);
2037+
zend_hash_copy(&phar->virtual_dirs, &persistent_phar->virtual_dirs, NULL);
20432038

20442039
/* now, scan the list of persistent Phar objects referencing this phar and update the pointers */
20452040
ZEND_HASH_MAP_FOREACH_PTR(&PHAR_G(phar_persist_map), objphar) {
20462041
if (zend_string_equals(objphar->archive->fname, phar->fname)) {
20472042
objphar->archive = phar;
20482043
}
20492044
} ZEND_HASH_FOREACH_END();
2045+
return phar;
20502046
}
20512047
/* }}} */
20522048

20532049
zend_result phar_copy_on_write(phar_archive_data **pphar) /* {{{ */
20542050
{
2055-
zval zv, *pzv;
2056-
phar_archive_data *newpphar;
2051+
phar_archive_data *newpphar = phar_copy_cached_phar(*pphar);
20572052

2058-
ZVAL_PTR(&zv, *pphar);
2059-
pzv = zend_hash_add(&(PHAR_G(phar_fname_map)), (*pphar)->fname, &zv);
2053+
zval *pzv = zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), newpphar->fname, newpphar);
20602054
if (!pzv) {
20612055
return FAILURE;
20622056
}
20632057

2064-
phar_copy_cached_phar((phar_archive_data **)&Z_PTR_P(pzv));
2065-
newpphar = Z_PTR_P(pzv);
20662058
/* invalidate phar cache */
20672059
PHAR_G(last_phar) = NULL;
20682060
PHAR_G(last_alias) = NULL;
20692061
PHAR_G(last_phar_name) = NULL;
20702062

20712063
if (newpphar->alias_len && NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), newpphar->alias, newpphar->alias_len, newpphar)) {
2072-
zend_hash_del(&(PHAR_G(phar_fname_map)), (*pphar)->fname);
2064+
zend_hash_del(&(PHAR_G(phar_fname_map)), newpphar->fname);
20732065
return FAILURE;
20742066
}
20752067

0 commit comments

Comments
 (0)