Fix bug #26639 (mb_convert_variables() clutters variables beyond the references)

This commit is contained in:
Moriyoshi Koizumi 2003-12-18 09:50:20 +00:00
parent 749cf47ef7
commit b8ea4e6fd2
2 changed files with 109 additions and 6 deletions

View File

@ -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);
}
}
}

View File

@ -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)
}