summaryrefslogtreecommitdiff
path: root/ext/phar/util.c
diff options
context:
space:
mode:
authorGreg Beaver <cellog@php.net>2008-10-12 19:40:11 +0000
committerGreg Beaver <cellog@php.net>2008-10-12 19:40:11 +0000
commite16636f06932d8cd30857bae33a0086b6da0332d (patch)
tree52b84ba51b8614a20d37d07cfbd568fe7c92cdf1 /ext/phar/util.c
parenteaf5d4c8b3312cc5c78539b8ad054e2c834e2e39 (diff)
downloadphp-git-e16636f06932d8cd30857bae33a0086b6da0332d.tar.gz
add tests for copy-on-write support
- fix metadata handling with cached phars - fix virtual_dirs with rmdir - ensure that after copy-on-write, all existing Phar objects link to the newly copied phar data
Diffstat (limited to 'ext/phar/util.c')
-rw-r--r--ext/phar/util.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/ext/phar/util.c b/ext/phar/util.c
index 224b7e778b..c6d734981c 100644
--- a/ext/phar/util.c
+++ b/ext/phar/util.c
@@ -2219,8 +2219,10 @@ static void phar_update_cached_entry(void *data, void *argument) /* {{{ */
if (entry->metadata) {
if (entry->metadata_len) {
+ char *buf = estrndup((char *) entry->metadata, entry->metadata_len);
/* assume success, we would have failed before */
phar_parse_metadata((char **) &entry->metadata, &entry->metadata, entry->metadata_len TSRMLS_CC);
+ efree(buf);
} else {
zval *t;
@@ -2245,6 +2247,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
phar_archive_data *phar;
HashTable newmanifest;
char *fname;
+ phar_archive_object **objphar;
phar = (phar_archive_data *) emalloc(sizeof(phar_archive_data));
*phar = **pphar;
@@ -2264,7 +2267,9 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
if (phar->metadata) {
/* assume success, we would have failed before */
if (phar->metadata_len) {
- phar_parse_metadata((char **) &phar->metadata, &phar->metadata, phar->metadata_len TSRMLS_CC);
+ char *buf = estrndup((char *) phar->metadata, phar->metadata_len);
+ phar_parse_metadata(&buf, &phar->metadata, phar->metadata_len TSRMLS_CC);
+ efree(buf);
} else {
zval *t;
@@ -2291,6 +2296,15 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
zend_get_hash_value, NULL, 0);
zend_hash_copy(&phar->virtual_dirs, &(*pphar)->virtual_dirs, NULL, NULL, sizeof(void *));
*pphar = phar;
+
+ /* now, scan the list of persistent Phar objects referencing this phar and update the pointers */
+ for (zend_hash_internal_pointer_reset(&PHAR_GLOBALS->phar_persist_map);
+ SUCCESS == zend_hash_get_current_data(&PHAR_GLOBALS->phar_persist_map, (void **) &objphar);
+ zend_hash_move_forward(&PHAR_GLOBALS->phar_persist_map)) {
+ if (objphar[0]->arc.archive->fname_len == phar->fname_len && !memcmp(objphar[0]->arc.archive->fname, phar->fname, phar->fname_len)) {
+ objphar[0]->arc.archive = phar;
+ }
+ }
}
/* }}} */