diff options
author | George Peter Banyard <girgias@php.net> | 2020-04-01 14:40:15 +0200 |
---|---|---|
committer | George Peter Banyard <girgias@php.net> | 2020-04-03 10:58:46 +0200 |
commit | fa3b8c75fb648ad25d09a478fc1f47ae6c31793f (patch) | |
tree | 9d9c79f31afdef99e96c9a66ad4507125d4af828 /ext/mbstring/mbstring.c | |
parent | 75b01c797eb71398fecb6e75e36b1f33767d3675 (diff) | |
download | php-git-fa3b8c75fb648ad25d09a478fc1f47ae6c31793f.tar.gz |
Promote unknown encoding throws in encoding array/string list
For the string list we emit still emit a warning by comparing arg_num to 0
Closes GH-5337
Diffstat (limited to 'ext/mbstring/mbstring.c')
-rw-r--r-- | ext/mbstring/mbstring.c | 67 |
1 files changed, 37 insertions, 30 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(); } } |