From f1e123152939e65cb1bc9d65bd3c35666e521d0c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 9 May 2014 15:14:27 +0200 Subject: [PATCH] Fix strtr() segfault --- ext/standard/string.c | 24 +++++-------------- .../tests/strings/strtr_with_reference.phpt | 12 ++++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 ext/standard/tests/strings/strtr_with_reference.phpt diff --git a/ext/standard/string.c b/ext/standard/string.c index ebd667956a..bd1dc1ee74 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2855,17 +2855,11 @@ static void php_strtr_array(zval *return_value, char *str, int slen, HashTable * if (len > slen - pos) continue; entry = zend_hash_str_find(pats, key, len); if (entry != NULL) { - if (UNEXPECTED(Z_TYPE_P(entry) != IS_STRING)) { - ZVAL_DUP(&tmp, entry); - convert_to_string(&tmp); - entry = &tmp; - } - smart_str_appendl(&result, Z_STRVAL_P(entry), Z_STRLEN_P(entry)); + zend_string *str = zval_get_string(entry); + smart_str_appendl(&result, str->val, str->len); pos += len; - if (entry == &tmp) { - zval_dtor(&tmp); - } found = 1; + STR_RELEASE(str); break; } } ZEND_HASH_FOREACH_END(); @@ -2886,17 +2880,11 @@ static void php_strtr_array(zval *return_value, char *str, int slen, HashTable * for (len = maxlen; len >= minlen; len--) { entry = zend_hash_str_find(pats, key, len); if (entry != NULL) { - if (UNEXPECTED(Z_TYPE_P(entry) != IS_STRING)) { - ZVAL_DUP(&tmp, entry); - convert_to_string(&tmp); - entry = &tmp; - } - smart_str_appendl(&result, Z_STRVAL_P(entry), Z_STRLEN_P(entry)); + zend_string *str = zval_get_string(entry); + smart_str_appendl(&result, str->val, str->len); pos += len; - if (entry == &tmp) { - zval_dtor(&tmp); - } found = 1; + STR_RELEASE(str); break; } } diff --git a/ext/standard/tests/strings/strtr_with_reference.phpt b/ext/standard/tests/strings/strtr_with_reference.phpt new file mode 100644 index 0000000000..a28d1e7be9 --- /dev/null +++ b/ext/standard/tests/strings/strtr_with_reference.phpt @@ -0,0 +1,12 @@ +--TEST-- +strtr() with references +--FILE-- + &$foo]; +var_dump(strtr('foobar', $arr)); + +?> +--EXPECT-- +string(6) "foofoo" -- 2.50.1