]> granicus.if.org Git - php/commitdiff
Fixed bug #20169
authorMoriyoshi Koizumi <moriyoshi@php.net>
Wed, 30 Oct 2002 11:42:51 +0000 (11:42 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Wed, 30 Oct 2002 11:42:51 +0000 (11:42 +0000)
ext/standard/string.c

index b7e42c819c8842c41cd8281274ec88faaf544803..3be7d77b7b82c5a66515c95bbae990c46f45d879 100644 (file)
@@ -848,6 +848,7 @@ PHP_FUNCTION(implode)
 {
        zval **arg1 = NULL, **arg2 = NULL, *delim, *arr;
        int argc = ZEND_NUM_ARGS();
+       int arg1_separated = 0, arg2_separated = 0, delim_needs_dtor = 0;
 
        if (argc < 1 || argc > 2 ||
                zend_get_parameters_ex(argc, &arg1, &arg2) == FAILURE) {
@@ -865,15 +866,19 @@ PHP_FUNCTION(implode)
                ZVAL_STRINGL(delim, _IMPL_EMPTY, sizeof(_IMPL_EMPTY) - 1, 0);
 
                SEPARATE_ZVAL(arg1);
+               arg1_separated = 1;
+               delim_needs_dtor = 1;   
                arr = *arg1;
        } else {
                if (Z_TYPE_PP(arg1) == IS_ARRAY) {
                        SEPARATE_ZVAL(arg1);
+                       arg1_separated = 1;
                        arr = *arg1;
                        convert_to_string_ex(arg2);
                        delim = *arg2;
                } else if (Z_TYPE_PP(arg2) == IS_ARRAY) {
                        SEPARATE_ZVAL(arg2);
+                       arg2_separated = 1;
                        arr = *arg2;
                        convert_to_string_ex(arg1);
                        delim = *arg1;
@@ -884,12 +889,9 @@ PHP_FUNCTION(implode)
        }
 
        php_implode(delim, arr, return_value);
-       zval_ptr_dtor(arg1);
-       if (arg2) {
-               zval_ptr_dtor(arg2);
-       } else {
-               FREE_ZVAL(delim);
-       }
+       if (arg1 != NULL && arg1_separated) zval_ptr_dtor(arg1);
+       if (arg2 != NULL && arg2_separated) zval_ptr_dtor(arg2);
+       if (delim_needs_dtor) FREE_ZVAL(delim);
 }
 /* }}} */