From f29b68306d457ebc157254a7af186e5a4fd6db80 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 12 May 2014 22:28:31 +0400 Subject: [PATCH] Support for ext/phar (all tests passed) --- ext/phar/tar.c | 2 -- ext/phar/util.c | 21 ++++++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 861ae23409b..6d210cbf5da 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -180,7 +180,6 @@ static int phar_tar_process_metadata(phar_entry_info *entry, php_stream *fp TSRM if (entry->filename_len == sizeof(".phar/.metadata.bin")-1 && !memcmp(entry->filename, ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1)) { entry->phar->metadata = entry->metadata; ZVAL_UNDEF(&entry->metadata); -// ??? len ??? } else if (entry->filename_len >= sizeof(".phar/.metadata/") + sizeof("/.metadata.bin") - 1 && NULL != (mentry = zend_hash_str_find_ptr(&(entry->phar->manifest), entry->filename + sizeof(".phar/.metadata/") - 1, entry->filename_len - (sizeof("/.metadata.bin") - 1 + sizeof(".phar/.metadata/") - 1)))) { /* transfer this metadata to the entry it refers */ mentry->metadata = entry->metadata; @@ -878,7 +877,6 @@ static int phar_tar_setupmetadata(zval *zv, void *argument TSRMLS_DC) /* {{{ */ return phar_tar_setmetadata(&entry->phar->metadata, entry, error TSRMLS_CC); } /* search for the file this metadata entry references */ -//??? len ??? if (entry->filename_len >= sizeof(".phar/.metadata/") + sizeof("/.metadata.bin") - 1 && !zend_hash_str_exists(&(entry->phar->manifest), entry->filename + sizeof(".phar/.metadata/") - 1, entry->filename_len - (sizeof("/.metadata.bin") - 1 + sizeof(".phar/.metadata/") - 1))) { /* this is orphaned metadata, erase it */ return ZEND_HASH_APPLY_REMOVE; diff --git a/ext/phar/util.c b/ext/phar/util.c index 856a7312902..1368853d66a 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1398,6 +1398,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, ZVAL_STRINGL(&openssl, is_sign ? "openssl_sign" : "openssl_verify", is_sign ? sizeof("openssl_sign")-1 : sizeof("openssl_verify")-1); ZVAL_STRINGL(&zp[1], *signature, *signature_len); ZVAL_STRINGL(&zp[2], key, key_len); + php_stream_rewind(fp); str = php_stream_copy_to_mem(fp, (size_t) end, 0); if (str) { ZVAL_STR(&zp[0], str); @@ -1452,7 +1453,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_DELREF(zp[2]); zval_dtor(&zp[0]); - zval_dtor(&zp[1]); + zval_dtor(&zp[2]); switch (Z_TYPE(retval)) { default: @@ -1970,6 +1971,14 @@ static int phar_update_cached_entry(zval *data, void *argument) /* {{{ */ } /* }}} */ +static void phar_manifest_copy_ctor(zval *zv) /* {{{ */ +{ + phar_entry_info *info = emalloc(sizeof(phar_entry_info)); + memcpy(info, Z_PTR_P(zv), sizeof(phar_entry_info)); + Z_PTR_P(zv) = info; +} +/* }}} */ + static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { phar_archive_data *phar; @@ -2005,8 +2014,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ zend_hash_init(&newmanifest, sizeof(phar_entry_info), zend_get_hash_value, destroy_phar_manifest_entry, 0); -//??? zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL, NULL, sizeof(phar_entry_info)); - zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL); + zend_hash_copy(&newmanifest, &(*pphar)->manifest, phar_manifest_copy_ctor); zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar TSRMLS_CC); phar->manifest = newmanifest; zend_hash_init(&phar->mounted_dirs, sizeof(char *), @@ -2027,13 +2035,16 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ int phar_copy_on_write(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { + zval zv, *pzv; phar_archive_data *newpphar; - if (NULL == (newpphar = zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_fname_map), (*pphar)->fname, (*pphar)->fname_len, *pphar))) { + ZVAL_PTR(&zv, *pphar); + if (NULL == (pzv = zend_hash_str_add(&(PHAR_GLOBALS->phar_fname_map), (*pphar)->fname, (*pphar)->fname_len, &zv))) { return FAILURE; } - phar_copy_cached_phar(&newpphar TSRMLS_CC); + phar_copy_cached_phar(&Z_PTR_P(pzv) TSRMLS_CC); + newpphar = Z_PTR_P(pzv); /* invalidate phar cache */ PHAR_G(last_phar) = NULL; PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;