com php-src: Support for ext/phar (all tests passed): ext/phar/tar.c ext/phar/util.c
| From: | Dmitry Stogov | Date: | Mon, 12 May 2014 18:28:31 +0000 |
| Subject: | com php-src: Support for ext/phar (all tests passed): ext/phar/tar.c ext/phar/util.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-78289@lists.php.net to get a copy of this message | ||
Commit: f29b68306d457ebc157254a7af186e5a4fd6db80
Author: Dmitry Stogov <dmitry@zend.com> Mon, 12 May 2014 22:28:31 +0400
Parents: dda41400105f6c99192d864083aed33818b16e4f
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=f29b68306d457ebc157254a7af186e5a4fd6db80
Log:
Support for ext/phar (all tests passed)
Changed paths:
M ext/phar/tar.c
M ext/phar/util.c
Diff:
diff --git a/ext/phar/tar.c b/ext/phar/tar.c
index 861ae23..6d210cb 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 856a731..1368853 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;