]> granicus.if.org Git - php/commitdiff
SEPARATE_ZVAL does not work for this situation. We always want
authorGreg Beaver <cellog@php.net>
Fri, 8 Feb 2008 03:53:17 +0000 (03:53 +0000)
committerGreg Beaver <cellog@php.net>
Fri, 8 Feb 2008 03:53:17 +0000 (03:53 +0000)
to duplicate and copy, so do it manually and reset refcount to 1

ext/phar/phar_object.c

index ac6bcda79797955b52754f574461ecf0fe9bb499..c15cd5c10386d85c53d9b272399bf49465017f06 100755 (executable)
@@ -1549,7 +1549,20 @@ static void phar_convert_to_other(phar_archive_data *source, int convert, php_ui
                }
                newentry.filename = estrndup(newentry.filename, newentry.filename_len);
                if (newentry.metadata) {
-                       SEPARATE_ZVAL(&(newentry.metadata));
+                       zval *t;
+
+                       t = newentry.metadata;
+                       ALLOC_ZVAL(newentry.metadata);
+                       *newentry.metadata = *t;
+                       zval_copy_ctor(newentry.metadata);
+#if PHP_VERSION_ID < 50300
+                       newentry.metadata.refcount = 1;
+#else
+                       Z_SET_REFCOUNT_P(newentry.metadata, 1);
+#endif
+
+                       newentry.metadata_str.c = NULL;
+                       newentry.metadata_str.len = 0;
                }
                newentry.is_zip = phar.is_zip;
                newentry.is_tar = phar.is_tar;
@@ -2415,7 +2428,18 @@ PHP_METHOD(Phar, copy)
 
        memcpy((void *) &newentry, oldentry, sizeof(phar_entry_info));
        if (newentry.metadata) {
-               SEPARATE_ZVAL(&(newentry.metadata));
+               zval *t;
+
+               t = newentry.metadata;
+               ALLOC_ZVAL(newentry.metadata);
+               *newentry.metadata = *t;
+               zval_copy_ctor(newentry.metadata);
+#if PHP_VERSION_ID < 50300
+               newentry.metadata.refcount = 1;
+#else
+               Z_SET_REFCOUNT_P(newentry.metadata, 1);
+#endif
+
                newentry.metadata_str.c = NULL;
                newentry.metadata_str.len = 0;
        }