summaryrefslogtreecommitdiff
path: root/ext/mbstring
diff options
context:
space:
mode:
authorMoriyoshi Koizumi <moriyoshi@php.net>2003-12-18 09:50:20 +0000
committerMoriyoshi Koizumi <moriyoshi@php.net>2003-12-18 09:50:20 +0000
commitb8ea4e6fd218444162ad762000abaabe1cb1b5d1 (patch)
treec800252dcacf070c16a1a28f369a99f568af03e2 /ext/mbstring
parent749cf47ef7e4272f0bda107abe5247dc73f913ef (diff)
downloadphp-git-b8ea4e6fd218444162ad762000abaabe1cb1b5d1.tar.gz
Fix bug #26639 (mb_convert_variables() clutters variables beyond the references)
Diffstat (limited to 'ext/mbstring')
-rw-r--r--ext/mbstring/mbstring.c15
-rw-r--r--ext/mbstring/tests/bug26639.phpt100
2 files changed, 109 insertions, 6 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 991738c2a1..9ac2663241 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -2605,9 +2605,13 @@ detect_end:
string.len = Z_STRLEN_PP(hash_entry);
ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
if (ret != NULL) {
- STR_FREE(Z_STRVAL_PP(hash_entry));
- Z_STRVAL_PP(hash_entry) = (char *)ret->val;
- Z_STRLEN_PP(hash_entry) = ret->len;
+ if ((*hash_entry)->refcount > 1) {
+ ZVAL_DELREF(*hash_entry);
+ MAKE_STD_ZVAL(*hash_entry);
+ } else {
+ zval_dtor(*hash_entry);
+ }
+ ZVAL_STRINGL(*hash_entry, ret->val, ret->len, 0);
}
}
}
@@ -2617,9 +2621,8 @@ detect_end:
string.len = Z_STRLEN_PP(var);
ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
if (ret != NULL) {
- STR_FREE(Z_STRVAL_PP(var));
- Z_STRVAL_PP(var) = (char *)ret->val;
- Z_STRLEN_PP(var) = ret->len;
+ zval_dtor(*var);
+ ZVAL_STRINGL(*var, ret->val, ret->len, 0);
}
}
}
diff --git a/ext/mbstring/tests/bug26639.phpt b/ext/mbstring/tests/bug26639.phpt
new file mode 100644
index 0000000000..651e6f45be
--- /dev/null
+++ b/ext/mbstring/tests/bug26639.phpt
@@ -0,0 +1,100 @@
+--TEST--
+Bug #26639 (mb_convert_variables() clutters variables beyond the references)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$a = "あいうえお";
+$b = $a;
+mb_convert_variables("EUC-JP", "Shift_JIS", $b);
+debug_zval_dump($a);
+debug_zval_dump($b);
+unset($a);
+unset($b);
+
+$a = "あいうえお";
+$b = &$a;
+mb_convert_variables("EUC-JP", "Shift_JIS", $b);
+debug_zval_dump($a);
+debug_zval_dump($b);
+unset($a);
+unset($b);
+
+$a = "あいうえお";
+$b = array($a);
+$c = $b;
+mb_convert_variables("EUC-JP", "Shift_JIS", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = "あいうえお";
+$b = array(&$a);
+$c = $b;
+mb_convert_variables("euc-jp", "shift_jis", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = "あいうえお";
+$b = array($a);
+$c = &$b;
+mb_convert_variables("euc-jp", "shift_jis", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = "あいうえお";
+$b = array(&$a);
+$c = &$b;
+mb_convert_variables("euc-jp", "shift_jis", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+?>
+--EXPECT--
+string(10) "あいうえお" refcount(2)
+string(10) "、「、、、ヲ、ィ、ェ" refcount(2)
+string(10) "、「、、、ヲ、ィ、ェ" refcount(1)
+string(10) "、「、、、ヲ、ィ、ェ" refcount(1)
+array(1) refcount(2){
+ [0]=>
+ string(10) "あいうえお" refcount(2)
+}
+array(1) refcount(2){
+ [0]=>
+ string(10) "、「、、、ヲ、ィ、ェ" refcount(1)
+}
+array(1) refcount(2){
+ [0]=>
+ &string(10) "あいうえお" refcount(2)
+}
+array(1) refcount(2){
+ [0]=>
+ string(10) "、「、、、ヲ、ィ、ェ" refcount(1)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "、「、、、ヲ、ィ、ェ" refcount(2)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "、「、、、ヲ、ィ、ェ" refcount(2)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "、「、、、ヲ、ィ、ェ" refcount(2)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "、「、、、ヲ、ィ、ェ" refcount(2)
+}
+