From 9584939362b182200c2e831636b5fc2c22d3a9b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 4 Mar 2023 14:22:26 +0100 Subject: [PATCH 1/3] remove unuseful comments --- ext/standard/string.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index d9715678a234b..770c84667c949 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -928,9 +928,6 @@ PHP_FUNCTION(explode) } /* }}} */ -/* {{{ An alias for implode */ -/* }}} */ - /* {{{ php_implode */ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return_value) { @@ -1622,9 +1619,6 @@ PHP_FUNCTION(str_ends_with) } /* }}} */ -/* {{{ An alias for strstr */ -/* }}} */ - /* {{{ Finds position of first occurrence of a string within another */ PHP_FUNCTION(strpos) { From 587ae73bb258f6da026ed949131244158faa1d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 4 Mar 2023 14:48:27 +0100 Subject: [PATCH 2/3] Imply UTF8 validity in implode function --- Zend/zend_string.h | 4 +- ext/standard/string.c | 5 +++ .../tests/strings_marked_as_utf8.phpt | 40 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index cc4f0751bec63..cb083601c4187 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -241,7 +241,9 @@ static zend_always_inline zend_string *zend_string_dup(zend_string *s, bool pers if (ZSTR_IS_INTERNED(s)) { return s; } else { - return zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent); + zend_string *res = zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent); + ZSTR_COPY_CONCAT_PROPERTIES(res, s); + return res; } } diff --git a/ext/standard/string.c b/ext/standard/string.c index 770c84667c949..335e6fd897128 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -955,11 +955,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return ptr = strings = do_alloca((sizeof(*strings)) * numelems, use_heap); + uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(glue); + ZEND_HASH_FOREACH_VAL(pieces, tmp) { if (EXPECTED(Z_TYPE_P(tmp) == IS_STRING)) { ptr->str = Z_STR_P(tmp); len += ZSTR_LEN(ptr->str); ptr->lval = 0; + flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(ptr->str); ptr++; } else if (UNEXPECTED(Z_TYPE_P(tmp) == IS_LONG)) { zend_long val = Z_LVAL_P(tmp); @@ -978,12 +981,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return ptr->str = zval_get_string_func(tmp); len += ZSTR_LEN(ptr->str); ptr->lval = 1; + flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(ptr->str); ptr++; } } ZEND_HASH_FOREACH_END(); /* numelems cannot be 0, we checked above */ str = zend_string_safe_alloc(numelems - 1, ZSTR_LEN(glue), len, 0); + GC_ADD_FLAGS(str, flags); cptr = ZSTR_VAL(str) + ZSTR_LEN(str); *cptr = 0; diff --git a/ext/zend_test/tests/strings_marked_as_utf8.phpt b/ext/zend_test/tests/strings_marked_as_utf8.phpt index 1519459f1dad1..9eaa43e63902c 100644 --- a/ext/zend_test/tests/strings_marked_as_utf8.phpt +++ b/ext/zend_test/tests/strings_marked_as_utf8.phpt @@ -115,6 +115,33 @@ $string = "\xff"; $string_concat = str_repeat($string, 100); var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +echo "implode:\n"; +$arr = ['a', 'b']; +$string_concat = implode('', $arr); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('|', $arr); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', ['c', ...$arr]); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', [...$arr, 'c']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', ["\xff", ...$arr]); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', [...$arr, "\xff"]); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode("\xff", $arr); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', []); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode("\xff", []); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', ['a']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode("\xff", ['a']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); +$string_concat = implode('', [1, 1.0, 'a']); +var_dump(zend_test_is_string_marked_as_valid_utf8($string_concat)); + ?> --EXPECT-- Empty strings: @@ -159,3 +186,16 @@ bool(true) str_repeat: bool(true) bool(false) +implode: +bool(true) +bool(true) +bool(true) +bool(true) +bool(false) +bool(false) +bool(false) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) From 942b84523022e15776a589b4166341e6ae09e36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Sat, 4 Mar 2023 21:29:29 +0100 Subject: [PATCH 3/3] revert zend_string_dup change --- Zend/zend_string.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index cb083601c4187..cc4f0751bec63 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -241,9 +241,7 @@ static zend_always_inline zend_string *zend_string_dup(zend_string *s, bool pers if (ZSTR_IS_INTERNED(s)) { return s; } else { - zend_string *res = zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent); - ZSTR_COPY_CONCAT_PROPERTIES(res, s); - return res; + return zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent); } }