summaryrefslogtreecommitdiff
path: root/ext/mbstring/mbstring.c
diff options
context:
space:
mode:
authorGeorge Peter Banyard <girgias@php.net>2020-04-01 14:40:15 +0200
committerGeorge Peter Banyard <girgias@php.net>2020-04-03 10:58:46 +0200
commitfa3b8c75fb648ad25d09a478fc1f47ae6c31793f (patch)
tree9d9c79f31afdef99e96c9a66ad4507125d4af828 /ext/mbstring/mbstring.c
parent75b01c797eb71398fecb6e75e36b1f33767d3675 (diff)
downloadphp-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.c67
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();
}
}