Skip to content

Commit 07062e1

Browse files
committed
Promote some warnings to ValueError in mbstring
Promoted warnings are: * Empty encoding lists * Unknown language * Start and Width out of bound
1 parent bd52b62 commit 07062e1

7 files changed

+152
-45
lines changed

ext/mbstring/mbstring.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,11 +1365,12 @@ PHP_FUNCTION(mb_language)
13651365
} else {
13661366
zend_string *ini_name = zend_string_init("mbstring.language", sizeof("mbstring.language") - 1, 0);
13671367
if (FAILURE == zend_alter_ini_entry(ini_name, name, PHP_INI_USER, PHP_INI_STAGE_RUNTIME)) {
1368-
php_error_docref(NULL, E_WARNING, "Unknown language \"%s\"", ZSTR_VAL(name));
1369-
RETVAL_FALSE;
1370-
} else {
1371-
RETVAL_TRUE;
1368+
zend_argument_value_error(1, "must be a valid language, \"%s\" given", ZSTR_VAL(name));
1369+
zend_string_release_ex(ini_name, 0);
1370+
RETURN_THROWS();
13721371
}
1372+
// TODO Make return void
1373+
RETVAL_TRUE;
13731374
zend_string_release_ex(ini_name, 0);
13741375
}
13751376
}
@@ -1568,8 +1569,8 @@ PHP_FUNCTION(mb_detect_order)
15681569

15691570
if (size == 0) {
15701571
efree(list);
1571-
php_error_docref(NULL, E_WARNING, "Must specify at least one encoding");
1572-
RETURN_FALSE;
1572+
zend_argument_value_error(1, "must specify at least one encoding");
1573+
RETURN_THROWS();
15731574
}
15741575

15751576
if (MBSTRG(current_detect_order_list)) {
@@ -2481,17 +2482,17 @@ PHP_FUNCTION(mb_strimwidth)
24812482
}
24822483

24832484
if (from < 0 || (size_t)from > str_len) {
2484-
php_error_docref(NULL, E_WARNING, "Start position is out of range");
2485-
RETURN_FALSE;
2485+
zend_argument_value_error(2, "is out of range");
2486+
RETURN_THROWS();
24862487
}
24872488

24882489
if (width < 0) {
24892490
width = swidth + width - from;
24902491
}
24912492

24922493
if (width < 0) {
2493-
php_error_docref(NULL, E_WARNING, "Width is out of range");
2494-
RETURN_FALSE;
2494+
zend_argument_value_error(3, "is out of range");
2495+
RETURN_THROWS();
24952496
}
24962497

24972498
if (trimmarker) {
@@ -2721,8 +2722,8 @@ PHP_FUNCTION(mb_convert_encoding)
27212722

27222723
if (!num_from_encodings) {
27232724
efree(from_encodings);
2724-
php_error_docref(NULL, E_WARNING, "Must specify at least one encoding");
2725-
RETURN_FALSE;
2725+
zend_argument_value_error(3, "must specify at least one encoding");
2726+
RETURN_THROWS();
27262727
}
27272728

27282729
if (input_str) {
@@ -2907,8 +2908,8 @@ PHP_FUNCTION(mb_detect_encoding)
29072908

29082909
if (size == 0) {
29092910
efree(elist);
2910-
php_error_docref(NULL, E_WARNING, "Must specify at least one encoding");
2911-
RETURN_FALSE;
2911+
zend_argument_value_error(2, "must specify at least one encoding");
2912+
RETURN_THROWS();
29122913
}
29132914

29142915
if (ZEND_NUM_ARGS() < 3) {
@@ -3301,8 +3302,8 @@ PHP_FUNCTION(mb_convert_variables)
33013302

33023303
if (elistsz == 0) {
33033304
efree(elist);
3304-
php_error_docref(NULL, E_WARNING, "Must specify at least one encoding");
3305-
RETURN_FALSE;
3305+
zend_argument_value_error(2, "must specify at least one encoding");
3306+
RETURN_THROWS();
33063307
}
33073308

33083309
if (elistsz == 1) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Test mb_convert_encoding() function : empty encoding list
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_convert_encoding') or die("skip mb_convert_encoding() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
$string = 'Hello';
12+
13+
try {
14+
var_dump( mb_convert_encoding($string, 'UTF-8', ''));
15+
} catch (\ValueError $e) {
16+
echo $e->getMessage() . \PHP_EOL;
17+
}
18+
try {
19+
var_dump( mb_convert_encoding($string, 'UTF-8', []));
20+
} catch (\ValueError $e) {
21+
echo $e->getMessage() . \PHP_EOL;
22+
}
23+
24+
?>
25+
--EXPECT--
26+
mb_convert_encoding(): Argument #3 ($from) must specify at least one encoding
27+
mb_convert_encoding(): Argument #3 ($from) must specify at least one encoding
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Test mb_convert_variables() function : empty encoding list
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
?>
7+
--FILE--
8+
<?php
9+
10+
$string = 'Hello';
11+
12+
try {
13+
var_dump( mb_convert_variables('UTF-8', '', $string));
14+
} catch (\ValueError $e) {
15+
echo $e->getMessage() . \PHP_EOL;
16+
}
17+
try {
18+
var_dump( mb_convert_variables('UTF-8', [], $string));
19+
} catch (\ValueError $e) {
20+
echo $e->getMessage() . \PHP_EOL;
21+
}
22+
23+
?>
24+
--EXPECT--
25+
mb_convert_variables(): Argument #2 ($from) must specify at least one encoding
26+
mb_convert_variables(): Argument #2 ($from) must specify at least one encoding
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Test mb_detect_encoding() function : empty encoding list
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
?>
7+
--FILE--
8+
<?php
9+
10+
$string = 'Hello';
11+
12+
try {
13+
var_dump( mb_detect_encoding($string, ''));
14+
} catch (\ValueError $e) {
15+
echo $e->getMessage() . \PHP_EOL;
16+
}
17+
try {
18+
var_dump( mb_detect_encoding($string, []));
19+
} catch (\ValueError $e) {
20+
echo $e->getMessage() . \PHP_EOL;
21+
}
22+
23+
?>
24+
--EXPECT--
25+
mb_detect_encoding(): Argument #2 ($encoding_list) must specify at least one encoding
26+
mb_detect_encoding(): Argument #2 ($encoding_list) must specify at least one encoding
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Test mb_detect_order() function : empty encoding list
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
?>
7+
--FILE--
8+
<?php
9+
10+
try {
11+
var_dump( mb_detect_order(''));
12+
} catch (\ValueError $e) {
13+
echo $e->getMessage() . \PHP_EOL;
14+
}
15+
try {
16+
var_dump( mb_detect_order([]));
17+
} catch (\ValueError $e) {
18+
echo $e->getMessage() . \PHP_EOL;
19+
}
20+
21+
?>
22+
--EXPECT--
23+
mb_detect_order(): Argument #1 ($encoding) must specify at least one encoding
24+
mb_detect_order(): Argument #1 ($encoding) must specify at least one encoding

ext/mbstring/tests/mb_language.phpt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ echo "Confirm language was changed:\n";
2020
var_dump(mb_language());
2121

2222
echo "Try changing to a non-existent language:\n";
23-
var_dump(mb_language('Pig Latin'));
23+
try {
24+
var_dump(mb_language('Pig Latin'));
25+
} catch (\ValueError $e) {
26+
echo $e->getMessage() . \PHP_EOL;
27+
}
2428
var_dump(mb_language());
2529
?>
26-
--EXPECTF--
30+
--EXPECT--
2731
Checking default language:
2832
string(7) "neutral"
2933
Checking default language after ini_set:
@@ -33,7 +37,5 @@ bool(true)
3337
Confirm language was changed:
3438
string(7) "English"
3539
Try changing to a non-existent language:
36-
37-
Warning: mb_language(): Unknown language "Pig Latin" in %s on line %d
38-
bool(false)
40+
mb_language(): Argument #1 ($language) must be a valid language, "Pig Latin" given
3941
string(7) "neutral"

ext/mbstring/tests/mb_strimwidth.phpt

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,29 @@ print "5: ". mb_strimwidth($euc_jp, 38, 5,'...','EUC-JP') . "\n";
2121
print "6: ". mb_strimwidth($euc_jp, 38, -25,'...','EUC-JP') . "\n";
2222
print "7: ". mb_strimwidth($euc_jp, -30, -25,'...','EUC-JP') . "\n";
2323

24-
$str = mb_strimwidth($euc_jp, 0, -100,'...','EUC-JP');
25-
($str === FALSE) ? print "10 OK\n" : print "NG: $str\n";
26-
27-
$str = mb_strimwidth($euc_jp, 100, 10,'...','EUC-JP');
28-
($str === FALSE) ? print "11 OK\n" : print "NG: $str\n";
29-
30-
$str = mb_strimwidth($euc_jp, -100, 10,'...','EUC-JP');
31-
($str === FALSE) ? print "12 OK\n" : print "NG: $str\n";
32-
33-
$str = mb_strimwidth($euc_jp, -10, -12,'...','EUC-JP');
34-
($str === FALSE) ? print "13 OK\n" : print "NG: $str\n";
24+
try {
25+
var_dump(mb_strimwidth($euc_jp, 0, -100,'...','EUC-JP'));
26+
} catch (\ValueError $e) {
27+
echo $e->getMessage() . \PHP_EOL;
28+
}
29+
try {
30+
var_dump(mb_strimwidth($euc_jp, 100, 10,'...','EUC-JP'));
31+
} catch (\ValueError $e) {
32+
echo $e->getMessage() . \PHP_EOL;
33+
}
34+
try {
35+
var_dump(mb_strimwidth($euc_jp, -100, 10,'...','EUC-JP'));
36+
} catch (\ValueError $e) {
37+
echo $e->getMessage() . \PHP_EOL;
38+
}
39+
try {
40+
var_dump(mb_strimwidth($euc_jp, -10, -12,'...','EUC-JP'));
41+
} catch (\ValueError $e) {
42+
echo $e->getMessage() . \PHP_EOL;
43+
}
3544

3645
?>
37-
--EXPECTF--
46+
--EXPECT--
3847
String width: 68
3948
1: 0123この文字...
4049
2: 0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。
@@ -43,15 +52,7 @@ String width: 68
4352
5: 。
4453
6: 。
4554
7: 。
46-
47-
Warning: mb_strimwidth(): Width is out of range in %s on line %d
48-
10 OK
49-
50-
Warning: mb_strimwidth(): Start position is out of range in %s on line %d
51-
11 OK
52-
53-
Warning: mb_strimwidth(): Start position is out of range in %s on line %d
54-
12 OK
55-
56-
Warning: mb_strimwidth(): Width is out of range in %s on line %d
57-
13 OK
55+
mb_strimwidth(): Argument #3 ($width) is out of range
56+
mb_strimwidth(): Argument #2 ($start) is out of range
57+
mb_strimwidth(): Argument #2 ($start) is out of range
58+
mb_strimwidth(): Argument #3 ($width) is out of range

0 commit comments

Comments
 (0)