diff options
author | Greg Beaver <cellog@php.net> | 2008-10-12 19:40:11 +0000 |
---|---|---|
committer | Greg Beaver <cellog@php.net> | 2008-10-12 19:40:11 +0000 |
commit | e16636f06932d8cd30857bae33a0086b6da0332d (patch) | |
tree | 52b84ba51b8614a20d37d07cfbd568fe7c92cdf1 /ext/phar/util.c | |
parent | eaf5d4c8b3312cc5c78539b8ad054e2c834e2e39 (diff) | |
download | php-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.c | 16 |
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; + } + } } /* }}} */ |