diff options
-rw-r--r-- | ext/mbstring/mbstring.c | 67 | ||||
-rw-r--r-- | ext/mbstring/tests/bug76704.phpt | 21 | ||||
-rw-r--r-- | ext/mbstring/tests/bug79149.phpt | 11 | ||||
-rw-r--r-- | ext/mbstring/tests/ini_mbstring_invalid.phpt | 35 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_detect_encoding.phpt | 13 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_detect_order.phpt | 50 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_str_unknown_encoding.phpt | 5 |
7 files changed, 132 insertions, 70 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 16452b0a5b..74a815c036 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -351,9 +351,10 @@ static const mbfl_encoding *php_mb_get_encoding(zend_string *encoding_name, uint /* {{{ static int php_mb_parse_encoding_list() * Return FAILURE if input contains any illegal encoding, otherwise SUCCESS. + * Emits a ValueError in function context and a warning in INI context, in INI context arg_num must be 0. */ -static int -php_mb_parse_encoding_list(const char *value, size_t value_length, const mbfl_encoding ***return_list, size_t *return_size, int persistent) +static int php_mb_parse_encoding_list(const char *value, size_t value_length, + const mbfl_encoding ***return_list, size_t *return_size, int persistent, uint32_t arg_num) { if (value == NULL || value_length == 0) { *return_list = NULL; @@ -416,15 +417,20 @@ php_mb_parse_encoding_list(const char *value, size_t value_length, const mbfl_en } } else { const mbfl_encoding *encoding = mbfl_name2encoding(p1); - if (encoding) { - *entry++ = encoding; - n++; - } else { - php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", p1); + if (!encoding) { + /* Called from an INI setting modification */ + if (arg_num == 0) { + php_error_docref("ref.mbstring", E_WARNING, "INI setting contains invalid encoding \"%s\"", p1); + } else { + zend_argument_value_error(arg_num, "contains invalid encoding \"%s\"", p1); + } efree(tmpstr); pefree(list, persistent); return FAILURE; } + + *entry++ = encoding; + n++; } p1 = p2 + 1; } while (n < size && p2 != NULL); @@ -439,9 +445,10 @@ php_mb_parse_encoding_list(const char *value, size_t value_length, const mbfl_en /* {{{ static int php_mb_parse_encoding_array() * Return FAILURE if input contains any illegal encoding, otherwise SUCCESS. + * Emits a ValueError in function context and a warning in INI context, in INI context arg_num must be 0. */ -static int -php_mb_parse_encoding_array(HashTable *target_hash, const mbfl_encoding ***return_list, size_t *return_size) +static int php_mb_parse_encoding_array(HashTable *target_hash, const mbfl_encoding ***return_list, + size_t *return_size, uint32_t arg_num) { /* Allocate enough space to include the default detect order if "auto" is used. */ size_t size = zend_hash_num_elements(target_hash) + MBSTRG(default_detect_order_list_size); @@ -475,8 +482,7 @@ php_mb_parse_encoding_array(HashTable *target_hash, const mbfl_encoding ***retur *entry++ = encoding; n++; } else { - php_error_docref(NULL, E_WARNING, - "Unknown encoding \"%s\"", ZSTR_VAL(encoding_str)); + zend_argument_value_error(arg_num, "contains invalid encoding \"%s\"", ZSTR_VAL(encoding_str)); zend_string_release(encoding_str); efree(list); return FAILURE; @@ -576,7 +582,7 @@ static size_t php_mb_zend_encoding_converter(unsigned char **to, size_t *to_leng static int php_mb_zend_encoding_list_parser(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, int persistent) { - return php_mb_parse_encoding_list(encoding_list, encoding_list_len, (const mbfl_encoding ***)return_list, return_size, persistent); + return php_mb_parse_encoding_list(encoding_list, encoding_list_len, (const mbfl_encoding ***)return_list, return_size, persistent, 0); } static const zend_encoding *php_mb_zend_internal_encoding_getter(void) @@ -869,7 +875,7 @@ static PHP_INI_MH(OnUpdate_mbstring_detect_order) return SUCCESS; } - if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &list, &size, 1) || size == 0) { + if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &list, &size, 1, 0) || size == 0) { return FAILURE; } @@ -885,7 +891,7 @@ static PHP_INI_MH(OnUpdate_mbstring_detect_order) static int _php_mb_ini_mbstring_http_input_set(const char *new_value, size_t new_value_length) { const mbfl_encoding **list; size_t size; - if (FAILURE == php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1) || size == 0) { + if (FAILURE == php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1, 0) || size == 0) { return FAILURE; } if (MBSTRG(http_input_list)) { @@ -1551,12 +1557,12 @@ PHP_FUNCTION(mb_detect_order) const mbfl_encoding **list; size_t size; if (order_ht) { - if (FAILURE == php_mb_parse_encoding_array(order_ht, &list, &size)) { - RETURN_FALSE; + if (FAILURE == php_mb_parse_encoding_array(order_ht, &list, &size, 1)) { + RETURN_THROWS(); } } else { - if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(order_str), ZSTR_LEN(order_str), &list, &size, 0)) { - RETURN_FALSE; + if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(order_str), ZSTR_LEN(order_str), &list, &size, 0, 1)) { + RETURN_THROWS(); } } @@ -2699,13 +2705,14 @@ PHP_FUNCTION(mb_convert_encoding) } if (from_encodings_ht) { - if (php_mb_parse_encoding_array(from_encodings_ht, &from_encodings, &num_from_encodings) == FAILURE) { - RETURN_FALSE; + if (php_mb_parse_encoding_array(from_encodings_ht, &from_encodings, &num_from_encodings, 3) == FAILURE) { + RETURN_THROWS(); } free_from_encodings = 1; } else if (from_encodings_str) { - if (php_mb_parse_encoding_list(ZSTR_VAL(from_encodings_str), ZSTR_LEN(from_encodings_str), &from_encodings, &num_from_encodings, 0) == FAILURE) { - RETURN_FALSE; + if (php_mb_parse_encoding_list(ZSTR_VAL(from_encodings_str), ZSTR_LEN(from_encodings_str), + &from_encodings, &num_from_encodings, 0, 3) == FAILURE) { + RETURN_THROWS(); } free_from_encodings = 1; } else { @@ -2885,13 +2892,13 @@ PHP_FUNCTION(mb_detect_encoding) /* make encoding list */ if (encoding_ht) { - if (FAILURE == php_mb_parse_encoding_array(encoding_ht, &elist, &size)) { - RETURN_FALSE; + if (FAILURE == php_mb_parse_encoding_array(encoding_ht, &elist, &size, 2)) { + RETURN_THROWS(); } free_elist = 1; } else if (encoding_str) { - if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(encoding_str), ZSTR_LEN(encoding_str), &elist, &size, 0)) { - RETURN_FALSE; + if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(encoding_str), ZSTR_LEN(encoding_str), &elist, &size, 0, 2)) { + RETURN_THROWS(); } free_elist = 1; } else { @@ -3285,12 +3292,12 @@ PHP_FUNCTION(mb_convert_variables) /* pre-conversion encoding */ if (from_enc_ht) { - if (php_mb_parse_encoding_array(from_enc_ht, &elist, &elistsz) == FAILURE) { - RETURN_FALSE; + if (php_mb_parse_encoding_array(from_enc_ht, &elist, &elistsz, 2) == FAILURE) { + RETURN_THROWS(); } } else { - if (php_mb_parse_encoding_list(ZSTR_VAL(from_enc_str), ZSTR_LEN(from_enc_str), &elist, &elistsz, 0) == FAILURE) { - RETURN_FALSE; + if (php_mb_parse_encoding_list(ZSTR_VAL(from_enc_str), ZSTR_LEN(from_enc_str), &elist, &elistsz, 0, 2) == FAILURE) { + RETURN_THROWS(); } } diff --git a/ext/mbstring/tests/bug76704.phpt b/ext/mbstring/tests/bug76704.phpt index b34d56d061..5a58f9ff20 100644 --- a/ext/mbstring/tests/bug76704.phpt +++ b/ext/mbstring/tests/bug76704.phpt @@ -6,12 +6,17 @@ if (!extension_loaded('mbstring')) die('skip mbstring extension not available'); ?> --FILE-- <?php -var_dump(mb_detect_order('Foo, UTF-8')); -var_dump(mb_detect_order(['Foo', 'UTF-8'])) +try { + var_dump(mb_detect_order('Foo, UTF-8')); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +try { + var_dump(mb_detect_order(['Foo', 'UTF-8'])); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> ---EXPECTF-- -Warning: mb_detect_order(): Unknown encoding "Foo" in %s on line %d -bool(false) - -Warning: mb_detect_order(): Unknown encoding "Foo" in %s on line %d -bool(false) +--EXPECT-- +mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "Foo" +mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "Foo" diff --git a/ext/mbstring/tests/bug79149.phpt b/ext/mbstring/tests/bug79149.phpt index 9d991718e1..c057ed0ad7 100644 --- a/ext/mbstring/tests/bug79149.phpt +++ b/ext/mbstring/tests/bug79149.phpt @@ -24,13 +24,8 @@ try { ?> --EXPECTF-- -Warning: mb_convert_encoding(): Unknown encoding "0" in %s on line %d -bool(false) +mb_convert_encoding(): Argument #3 ($from) contains invalid encoding "0" Warning: Array to string conversion in %s on line %d - -Warning: mb_convert_encoding(): Unknown encoding "Array" in %s on line %d -bool(false) - -Warning: mb_convert_encoding(): Unknown encoding "foo" in %s on line %d -bool(false) +mb_convert_encoding(): Argument #3 ($from) contains invalid encoding "Array" +mb_convert_encoding(): Argument #3 ($from) contains invalid encoding "foo" diff --git a/ext/mbstring/tests/ini_mbstring_invalid.phpt b/ext/mbstring/tests/ini_mbstring_invalid.phpt new file mode 100644 index 0000000000..57f2404fc7 --- /dev/null +++ b/ext/mbstring/tests/ini_mbstring_invalid.phpt @@ -0,0 +1,35 @@ +--TEST-- +Invalid values for MBString INI settings +--SKIPIF-- +<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> +--INI-- +mbstring.language=UNKNOWN_LANGUAGE +mbstring.internal_encoding=UNKNOWN_ENCODING +mbstring.detect_order=UTF-8,DETECT_ORDER,ASCII +mbstring.http_input=UTF-8,HTTP_INPUT,ASCII +mbstring.http_output=HTTP_OUTPUT +mbstring.http_output_conv_mimetypes=UNKNOWN_MIME_TYPE_OUTPUT +mbstring.substitute_character=U+3000,NON_EXISTING_CHARACTER,JIS+7E7E +mbstring.func_overload=BOOL_OVERLOAD +mbstring.encoding_translation=BOOL_TRANSLATION +mbstring.strict_detection=BOOL_STRICT_DETECTION +--FILE-- +<?php +// Empty as we are only testing INI settings +?> +--EXPECT-- +PHP Warning: PHP Startup: INI setting contains invalid encoding "DETECT_ORDER" in Unknown on line 0 +PHP Deprecated: PHP Startup: Use of mbstring.http_input is deprecated in Unknown on line 0 +PHP Warning: PHP Startup: INI setting contains invalid encoding "HTTP_INPUT" in Unknown on line 0 +PHP Deprecated: PHP Startup: Use of mbstring.http_output is deprecated in Unknown on line 0 +PHP Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0 + +Warning: PHP Startup: INI setting contains invalid encoding "DETECT_ORDER" in Unknown on line 0 + +Deprecated: PHP Startup: Use of mbstring.http_input is deprecated in Unknown on line 0 + +Warning: PHP Startup: INI setting contains invalid encoding "HTTP_INPUT" in Unknown on line 0 + +Deprecated: PHP Startup: Use of mbstring.http_output is deprecated in Unknown on line 0 + +Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0 diff --git a/ext/mbstring/tests/mb_detect_encoding.phpt b/ext/mbstring/tests/mb_detect_encoding.phpt index b1780a3011..22f64fcfa5 100644 --- a/ext/mbstring/tests/mb_detect_encoding.phpt +++ b/ext/mbstring/tests/mb_detect_encoding.phpt @@ -84,11 +84,14 @@ $s = mb_detect_encoding('', 'EUC-JP'); print("EUC-JP: $s\n"); // SJIS $s = $euc_jp; -$s = mb_detect_encoding($s, 'BAD'); -print("BAD: $s\n"); // BAD +try { + var_dump(mb_detect_encoding($s, 'BAD')); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} ?> ---EXPECTF-- +--EXPECT-- == BASIC TEST == SJIS: SJIS JIS: JIS @@ -105,6 +108,4 @@ SJIS: SJIS == INVALID PARAMETER == INT: EUC-JP EUC-JP: EUC-JP - -Warning: mb_detect_encoding(): Unknown encoding "BAD" in %s on line %d -BAD: +mb_detect_encoding(): Argument #2 ($encoding_list) contains invalid encoding "BAD" diff --git a/ext/mbstring/tests/mb_detect_order.phpt b/ext/mbstring/tests/mb_detect_order.phpt index 8356b8376f..94f7fadfda 100644 --- a/ext/mbstring/tests/mb_detect_order.phpt +++ b/ext/mbstring/tests/mb_detect_order.phpt @@ -35,17 +35,23 @@ print implode(', ', mb_detect_order()) . "\n"; // Set invalid encoding. Should fail. print "== INVALID PARAMETER ==\n"; -$r = mb_detect_order('BAD_NAME'); -($r === FALSE) ? print "OK_BAD_STR\n" : print "NG_BAD_STR\n"; -print implode(', ', mb_detect_order()) . "\n"; +try { + var_dump(mb_detect_order('BAD_NAME')); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +var_dump(mb_detect_order()); $a[] = 'BAD_NAME'; -$r = mb_detect_order($a); -($r === FALSE) ? print "OK_BAD_ARRAY\n" : print "NG_BAD_ARRAY\n"; -print implode(', ', mb_detect_order()) . "\n"; +try { + var_dump(mb_detect_order($a)); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} +var_dump(mb_detect_order()); ?> ---EXPECTF-- +--EXPECT-- OK_AUTO ASCII, JIS, UTF-8, EUC-JP, SJIS OK_STR @@ -53,11 +59,25 @@ SJIS, EUC-JP, JIS, UTF-8 OK_ARRAY ASCII, JIS, EUC-JP, UTF-8 == INVALID PARAMETER == - -Warning: mb_detect_order(): Unknown encoding "BAD_NAME" in %s on line %d -OK_BAD_STR -ASCII, JIS, EUC-JP, UTF-8 - -Warning: mb_detect_order(): Unknown encoding "BAD_NAME" in %s on line %d -OK_BAD_ARRAY -ASCII, JIS, EUC-JP, UTF-8 +mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "BAD_NAME" +array(4) { + [0]=> + string(5) "ASCII" + [1]=> + string(3) "JIS" + [2]=> + string(6) "EUC-JP" + [3]=> + string(5) "UTF-8" +} +mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "BAD_NAME" +array(4) { + [0]=> + string(5) "ASCII" + [1]=> + string(3) "JIS" + [2]=> + string(6) "EUC-JP" + [3]=> + string(5) "UTF-8" +} diff --git a/ext/mbstring/tests/mb_str_unknown_encoding.phpt b/ext/mbstring/tests/mb_str_unknown_encoding.phpt index e1c4069826..5c07c3521c 100644 --- a/ext/mbstring/tests/mb_str_unknown_encoding.phpt +++ b/ext/mbstring/tests/mb_str_unknown_encoding.phpt @@ -141,11 +141,10 @@ try { } ?> ---EXPECTF-- +--EXPECT-- mb_chr(): Argument #2 ($encoding) must be a valid encoding, "UTF-0" given mb_convert_case(): Argument #3 ($encoding) must be a valid encoding, "UTF-0" given - -Warning: mb_convert_encoding(): Unknown encoding "UTF-0" in %s on line %d +mb_convert_encoding(): Argument #3 ($from) contains invalid encoding "UTF-0" mb_convert_kana(): Argument #3 ($encoding) must be a valid encoding, "UTF-0" given mb_decode_numericentity(): Argument #3 ($encoding) must be a valid encoding, "UTF-0" given mb_ord(): Argument #2 ($encoding) must be a valid encoding, "UTF-0" given |