summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/mbstring/mbstring.c67
-rw-r--r--ext/mbstring/tests/bug76704.phpt21
-rw-r--r--ext/mbstring/tests/bug79149.phpt11
-rw-r--r--ext/mbstring/tests/ini_mbstring_invalid.phpt35
-rw-r--r--ext/mbstring/tests/mb_detect_encoding.phpt13
-rw-r--r--ext/mbstring/tests/mb_detect_order.phpt50
-rw-r--r--ext/mbstring/tests/mb_str_unknown_encoding.phpt5
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