]> granicus.if.org Git - php/commitdiff
Support for ext/phar (all tests passed)
authorDmitry Stogov <dmitry@zend.com>
Mon, 12 May 2014 18:28:31 +0000 (22:28 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 12 May 2014 18:28:31 +0000 (22:28 +0400)
ext/phar/tar.c
ext/phar/util.c

index 861ae23409b7a246d58f3a07c37b195ac9762203..6d210cbf5da7debbafc767736fc092b45b352128 100644 (file)
@@ -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;
index 856a73129021aaef0aaef2ae578303ac223ce61e..1368853d66ad4605fbb4eab5697ea14916b4435d 100644 (file)
@@ -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;