Skip to content

Commit 0aafb9b

Browse files
committed
Final conversion
1 parent 7f62461 commit 0aafb9b

File tree

4 files changed

+40
-22
lines changed

4 files changed

+40
-22
lines changed

ext/mbstring/mbstring.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2693,7 +2693,9 @@ MBSTRING_API char *php_mb_convert_encoding_ex(const char *input, size_t length,
26932693
/* }}} */
26942694

26952695
/* {{{ MBSTRING_API char *php_mb_convert_encoding() */
2696-
MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, const mbfl_encoding *to_encoding, const char *_from_encodings, size_t *output_len)
2696+
MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length,
2697+
const mbfl_encoding *to_encoding, const char *_from_encodings,
2698+
const uint32_t _from_encodings_arg_num, size_t *output_len)
26972699
{
26982700
const mbfl_encoding *from_encoding;
26992701

@@ -2724,7 +2726,9 @@ MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, con
27242726
from_encoding = &mbfl_encoding_pass;
27252727
}
27262728
} else {
2727-
php_error_docref(NULL, E_WARNING, "Illegal character encoding specified");
2729+
zend_argument_value_error(_from_encodings_arg_num, "must provide at least one valid character encoding");
2730+
efree((void *)list);
2731+
return NULL;
27282732
}
27292733
if (list != NULL) {
27302734
efree((void *)list);
@@ -2735,7 +2739,8 @@ MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, con
27352739
}
27362740
/* }}} */
27372741

2738-
MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, const mbfl_encoding *to_encoding, const char *_from_encodings)
2742+
MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, const mbfl_encoding *to_encoding,
2743+
const char *_from_encodings, const uint32_t _from_encodings_arg_num)
27392744
{
27402745
HashTable *output, *chash;
27412746
zend_long idx;
@@ -2758,15 +2763,17 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
27582763
ZEND_HASH_FOREACH_KEY_VAL(input, idx, key, entry) {
27592764
/* convert key */
27602765
if (key) {
2761-
ckey = php_mb_convert_encoding(ZSTR_VAL(key), ZSTR_LEN(key), to_encoding, _from_encodings, &ckey_len);
2766+
ckey = php_mb_convert_encoding(ZSTR_VAL(key), ZSTR_LEN(key), to_encoding, _from_encodings,
2767+
_from_encodings_arg_num, &ckey_len);
27622768
key = zend_string_init(ckey, ckey_len, 0);
27632769
efree(ckey);
27642770
}
27652771
/* convert value */
27662772
ZEND_ASSERT(entry);
27672773
switch(Z_TYPE_P(entry)) {
27682774
case IS_STRING:
2769-
cval = php_mb_convert_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), to_encoding, _from_encodings, &cval_len);
2775+
cval = php_mb_convert_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), to_encoding, _from_encodings,
2776+
_from_encodings_arg_num, &cval_len);
27702777
ZVAL_STRINGL(&entry_tmp, cval, cval_len);
27712778
efree(cval);
27722779
break;
@@ -2778,7 +2785,8 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
27782785
ZVAL_COPY(&entry_tmp, entry);
27792786
break;
27802787
case IS_ARRAY:
2781-
chash = php_mb_convert_encoding_recursive(Z_ARRVAL_P(entry), to_encoding, _from_encodings);
2788+
chash = php_mb_convert_encoding_recursive(Z_ARRVAL_P(entry), to_encoding, _from_encodings,
2789+
_from_encodings_arg_num);
27822790
if (chash) {
27832791
ZVAL_ARR(&entry_tmp, chash);
27842792
} else {
@@ -2817,6 +2825,7 @@ PHP_FUNCTION(mb_convert_encoding)
28172825
char *_from_encodings = NULL, *ret, *s_free = NULL;
28182826
zend_string *to_encoding_name;
28192827
const mbfl_encoding *to_encoding;
2828+
#define FROM_ENCODING_ARG_NUM 3
28202829

28212830
zval *hash_entry;
28222831
HashTable *target_hash;
@@ -2881,7 +2890,8 @@ PHP_FUNCTION(mb_convert_encoding)
28812890

28822891
if (Z_TYPE_P(input) == IS_STRING) {
28832892
/* new encoding */
2884-
ret = php_mb_convert_encoding(Z_STRVAL_P(input), Z_STRLEN_P(input), to_encoding, _from_encodings, &size);
2893+
ret = php_mb_convert_encoding(Z_STRVAL_P(input), Z_STRLEN_P(input), to_encoding, _from_encodings,
2894+
FROM_ENCODING_ARG_NUM, &size);
28852895
if (ret != NULL) {
28862896
// TODO: avoid reallocation ???
28872897
RETVAL_STRINGL(ret, size); /* the string is already strdup()'ed */
@@ -2894,7 +2904,7 @@ PHP_FUNCTION(mb_convert_encoding)
28942904
}
28952905
} else {
28962906
HashTable *tmp;
2897-
tmp = php_mb_convert_encoding_recursive(Z_ARRVAL_P(input), to_encoding, _from_encodings);
2907+
tmp = php_mb_convert_encoding_recursive(Z_ARRVAL_P(input), to_encoding, _from_encodings, FROM_ENCODING_ARG_NUM);
28982908
RETURN_ARR(tmp);
28992909
}
29002910

ext/mbstring/mbstring.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ MBSTRING_API char *php_mb_convert_encoding_ex(
120120
MBSTRING_API char * php_mb_convert_encoding(const char *input, size_t length,
121121
const mbfl_encoding *to_encoding,
122122
const char *_from_encodings,
123+
const uint32_t _from_encodings_arg_num,
123124
size_t *output_len);
124125

125126
MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc);

ext/mbstring/tests/bug79149.phpt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,28 @@ if (!extension_loaded('mbstring')) die('skip mbstring extension not available');
66
?>
77
--FILE--
88
<?php
9-
var_dump(mb_convert_encoding("", "UTF-8", [0]));
10-
var_dump(mb_convert_encoding('foo', 'UTF-8', array(['bar'], ['baz'])));
11-
var_dump(mb_convert_encoding('foo', 'UTF-8', array("foo\0bar")));
9+
try {
10+
var_dump(mb_convert_encoding("", "UTF-8", [0]));
11+
} catch (\ValueError $e) {
12+
echo $e->getMessage() . \PHP_EOL;
13+
}
14+
try {
15+
var_dump(mb_convert_encoding('foo', 'UTF-8', array(['bar'], ['baz'])));
16+
} catch (\ValueError $e) {
17+
echo $e->getMessage() . \PHP_EOL;
18+
}
19+
try {
20+
var_dump(mb_convert_encoding('foo', 'UTF-8', array("foo\0bar")));
21+
} catch (\ValueError $e) {
22+
echo $e->getMessage() . \PHP_EOL;
23+
}
24+
1225
?>
1326
--EXPECTF--
14-
Warning: mb_convert_encoding(): Illegal character encoding specified in %s on line %d
15-
string(0) ""
27+
mb_convert_encoding(): Argument #3 ($from) must provide at least one valid character encoding
1628

1729
Warning: Array to string conversion in %s on line %d
1830

1931
Warning: Array to string conversion in %s on line %d
20-
21-
Warning: mb_convert_encoding(): Illegal character encoding specified in %s on line %d
22-
string(3) "foo"
23-
24-
Warning: mb_convert_encoding(): Illegal character encoding specified in %s on line %d
25-
string(3) "foo"
32+
mb_convert_encoding(): Argument #3 ($from) must provide at least one valid character encoding
33+
mb_convert_encoding(): Argument #3 ($from) must provide at least one valid character encoding

ext/mbstring/tests/mb_str_unknown_encoding.phpt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,10 @@ try {
141141
}
142142

143143
?>
144-
--EXPECTF--
144+
--EXPECT--
145145
mb_chr(): Argument #2 ($encoding) must be a valid encoding, encoding "UTF-0" is unknown
146146
mb_convert_case(): Argument #3 ($encoding) must be a valid encoding, encoding "UTF-0" is unknown
147-
148-
Warning: mb_convert_encoding(): Illegal character encoding specified in %s on line %d
147+
mb_convert_encoding(): Argument #3 ($from) must provide at least one valid character encoding
149148
mb_convert_kana(): Argument #3 ($encoding) must be a valid encoding, encoding "UTF-0" is unknown
150149
mb_decode_numericentity(): Argument #3 ($encoding) must be a valid encoding, encoding "UTF-0" is unknown
151150
mb_ord(): Argument #2 ($encoding) must be a valid encoding, encoding "UTF-0" is unknown

0 commit comments

Comments
 (0)