]> granicus.if.org Git - php/commitdiff
Fixed implode() bugs
authorDmitry Stogov <dmitry@php.net>
Wed, 17 Aug 2005 07:59:31 +0000 (07:59 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 17 Aug 2005 07:59:31 +0000 (07:59 +0000)
ext/standard/string.c
ext/standard/tests/strings/bug22224.phpt

index d2afc1f2ca07e8f87a91f2ebb10d4c6f9e11be5f..376f6585cef0265cf4d8567381c7de6bd6690483 100644 (file)
@@ -1216,26 +1216,24 @@ PHPAPI void php_implode(zval *delim, zval *arr, zval *retval)
                /* Append elem */
                if (return_type == IS_UNICODE) {
                        Z_USTRVAL_P(retval) = eurealloc(Z_USTRVAL_P(retval),
-                                                                                       Z_USTRLEN_P(retval)+Z_USTRLEN_PP(tmp));
-                       memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), Z_USTRVAL_PP(tmp),
-                                  UBYTES(Z_USTRLEN_PP(tmp)));
+                                                                                       UBYTES(Z_USTRLEN_P(retval)+Z_USTRLEN_PP(tmp)+1));
+                       memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), Z_USTRVAL_PP(tmp), UBYTES(Z_USTRLEN_PP(tmp)+1));
                        Z_USTRLEN_P(retval) += Z_USTRLEN_PP(tmp);
                        if (++i < numelems) { /* Append delim */
                                Z_USTRVAL_P(retval) = eurealloc(Z_USTRVAL_P(retval),
-                                                                                               Z_USTRLEN_P(retval)+Z_USTRLEN_P(delim));
-                               memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), Z_USTRVAL_P(delim),
-                                          UBYTES(Z_USTRLEN_P(delim)));
+                                                                                               UBYTES(Z_USTRLEN_P(retval)+Z_USTRLEN_P(delim)+1));
+                               memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), Z_USTRVAL_P(delim), UBYTES(Z_USTRLEN_P(delim)+1));
                                Z_USTRLEN_P(retval) += Z_USTRLEN_P(delim);
                        }
                } else {
                        Z_STRVAL_P(retval) = (char *)erealloc(Z_STRVAL_P(retval),
-                                                                                                 Z_STRLEN_P(retval)+Z_STRLEN_PP(tmp));
-                       memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+                                                                                                 Z_STRLEN_P(retval)+Z_STRLEN_PP(tmp)+1);
+                       memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)+1);
                        Z_STRLEN_P(retval) += Z_STRLEN_PP(tmp);
                        if (++i < numelems) { /* Append delim */
                                Z_STRVAL_P(retval) = (char *)erealloc(Z_STRVAL_P(retval),
-                                                                                                         Z_STRLEN_P(retval)+Z_STRLEN_P(delim));
-                               memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), Z_STRVAL_P(delim), Z_STRLEN_P(delim));
+                                                                                                         Z_STRLEN_P(retval)+Z_STRLEN_P(delim)+1);
+                               memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), Z_STRVAL_P(delim), Z_STRLEN_P(delim)+1);
                                Z_STRLEN_P(retval) += Z_STRLEN_P(delim);
                        }
                }
@@ -1271,7 +1269,7 @@ PHP_FUNCTION(implode)
                        arr = *arg1;
                        MAKE_STD_ZVAL(delim);
                        if (UG(unicode)) {
-                               ZVAL_UNICODEL(delim, USTR_MAKE(""), sizeof("")-1, 0);
+                               ZVAL_UNICODEL(delim, EMPTY_STR, sizeof("")-1, 0);
                        } else {
                                ZVAL_STRINGL(delim, "", sizeof("")-1, 0);
                        }
@@ -1280,19 +1278,21 @@ PHP_FUNCTION(implode)
                if (Z_TYPE_PP(arg1) == IS_ARRAY) {
                        SEPARATE_ZVAL(arg1);
                        arr = *arg1;
+                       if (Z_TYPE_PP(arg2) != IS_UNICODE && Z_TYPE_PP(arg2) != IS_BINARY && Z_TYPE_PP(arg2) != IS_STRING) {
+                               convert_to_text_ex(arg2);
+                       }
                        delim = *arg2;
                } else if (Z_TYPE_PP(arg2) == IS_ARRAY) {
                        SEPARATE_ZVAL(arg2);
                        arr = *arg2;
+                       if (Z_TYPE_PP(arg1) != IS_UNICODE && Z_TYPE_PP(arg1) != IS_BINARY && Z_TYPE_PP(arg1) != IS_STRING) {
+                               convert_to_text_ex(arg1);
+                       }
                        delim = *arg1;
                } else {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad arguments.");
                        RETURN_FALSE;
                }
-               SEPARATE_ZVAL(&delim);
-               if (Z_TYPE_P(delim) != IS_BINARY) {
-                       convert_to_text_ex(&delim);
-               }
        }
 
        php_implode(delim, arr, return_value);
index d64fc0acfc62b9623b032d7009da678dcce0dc37..b9a1191537b45c92c23912121ee19ef57c035350 100644 (file)
@@ -24,3 +24,13 @@ array(2) {
   &object(foo)#%d (0) {
   }
 }
+--UEXPECTF--
+unicode(13) "Object,Object"
+array(2) {
+  [0]=>
+  &object(foo)#%d (0) {
+  }
+  [1]=>
+  &object(foo)#%d (0) {
+  }
+}