Skip to content

Promote unknown encoding warning to ValueError in Mbstring extension #5317

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 69 additions & 65 deletions ext/mbstring/mbstring.c

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions ext/mbstring/php_mbregex.c
Original file line number Diff line number Diff line change
Expand Up @@ -855,8 +855,8 @@ PHP_FUNCTION(mb_regex_encoding)
mbctype = _php_mb_regex_name2mbctype(encoding);

if (mbctype == ONIG_ENCODING_UNDEF) {
php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", encoding);
RETURN_FALSE;
zend_argument_value_error(1, "must be a valid encoding, \"%s\" given", encoding);
RETURN_THROWS();
}

MBREX(current_mbctype) = mbctype;
Expand Down
59 changes: 24 additions & 35 deletions ext/mbstring/tests/bug43998.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -22,49 +22,38 @@ $sourcestring = 'Hello, World';
$inputs = array(12345, 12.3456789000E-10, true, false, "");
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
var_dump( mb_strtolower($sourcestring, $input) );
var_dump( mb_strtoupper($sourcestring, $input) );
echo "\n-- Iteration $iterator --\n";
try {
var_dump( mb_strtolower($sourcestring, $input) );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump( mb_strtoupper($sourcestring, $input) );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
$iterator++;
};
}

?>
--EXPECTF--
--EXPECT--
-- Iteration 1 --

Warning: mb_strtolower(): Unknown encoding "12345" in %s on line %d
bool(false)

Warning: mb_strtoupper(): Unknown encoding "12345" in %s on line %d
bool(false)
mb_strtolower(): Argument #2 ($encoding) must be a valid encoding, "12345" given
mb_strtoupper(): Argument #2 ($encoding) must be a valid encoding, "12345" given

-- Iteration 2 --

Warning: mb_strtolower(): Unknown encoding "1.23456789E-9" in %s on line %d
bool(false)

Warning: mb_strtoupper(): Unknown encoding "1.23456789E-9" in %s on line %d
bool(false)
mb_strtolower(): Argument #2 ($encoding) must be a valid encoding, "1.23456789E-9" given
mb_strtoupper(): Argument #2 ($encoding) must be a valid encoding, "1.23456789E-9" given

-- Iteration 3 --

Warning: mb_strtolower(): Unknown encoding "1" in %s on line %d
bool(false)

Warning: mb_strtoupper(): Unknown encoding "1" in %s on line %d
bool(false)
mb_strtolower(): Argument #2 ($encoding) must be a valid encoding, "1" given
mb_strtoupper(): Argument #2 ($encoding) must be a valid encoding, "1" given

-- Iteration 4 --

Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
bool(false)

Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
bool(false)
mb_strtolower(): Argument #2 ($encoding) must be a valid encoding, "" given
mb_strtoupper(): Argument #2 ($encoding) must be a valid encoding, "" given

-- Iteration 5 --

Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
bool(false)

Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
bool(false)
mb_strtolower(): Argument #2 ($encoding) must be a valid encoding, "" given
mb_strtoupper(): Argument #2 ($encoding) must be a valid encoding, "" given
19 changes: 16 additions & 3 deletions ext/mbstring/tests/bug79149.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,22 @@ if (!extension_loaded('mbstring')) die('skip mbstring extension not available');
?>
--FILE--
<?php
var_dump(mb_convert_encoding("", "UTF-8", [0]));
var_dump(mb_convert_encoding('foo', 'UTF-8', array(['bar'], ['baz'])));
var_dump(mb_convert_encoding('foo', 'UTF-8', array("foo\0bar")));
try {
var_dump(mb_convert_encoding("", "UTF-8", [0]));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump(mb_convert_encoding('foo', 'UTF-8', array(['bar'], ['baz'])));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump(mb_convert_encoding('foo', 'UTF-8', array("foo\0bar")));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}

?>
--EXPECTF--
Warning: mb_convert_encoding(): Unknown encoding "0" in %s on line %d
Expand Down
43 changes: 30 additions & 13 deletions ext/mbstring/tests/mb_chr.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,48 @@ var_dump(
);

// Invalid
var_dump(
mb_chr(0xd800, "typo"),
mb_chr(0xd800, "pass"),
mb_chr(0xd800, "jis"),
mb_chr(0xd800, "cp50222"),
mb_chr(0xd800, "utf-7")
);
try {
var_dump( mb_chr(0xd800, "typo") );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump( mb_chr(0xd800, "pass") );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump( mb_chr(0xd800, "jis") );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump( mb_chr(0xd800, "cp50222") );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump( mb_chr(0xd800, "utf-7") );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}

?>
--EXPECTF--
bool(true)
bool(true)
bool(true)
bool(true)

Warning: mb_chr(): Unknown encoding "typo" in %s on line %d
mb_chr(): Argument #2 ($encoding) must be a valid encoding, "typo" given

Warning: mb_chr(): Unsupported encoding "pass" in %s on line %d
bool(false)

Warning: mb_chr(): Unsupported encoding "jis" in %s on line %d
bool(false)

Warning: mb_chr(): Unsupported encoding "cp50222" in %s on line %d
bool(false)

Warning: mb_chr(): Unsupported encoding "utf-7" in %s on line %d
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
13 changes: 7 additions & 6 deletions ext/mbstring/tests/mb_convert_encoding.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,14 @@ $s = mb_convert_encoding('', 'EUC-JP');
print("EUC-JP: $s\n"); // SJIS

$s = $euc_jp;
$s = mb_convert_encoding($s, 'BAD');
print("BAD: $s\n"); // BAD
try {
var_dump( mb_convert_encoding($s, 'BAD') );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}

?>
--EXPECTF--
--EXPECT--
== BASIC TEST ==
EUC-JP: ���ܸ�ƥ����ȤǤ���01234������������
EUC-JP: ���ܸ�ƥ����ȤǤ���01234������������
Expand All @@ -121,6 +124,4 @@ JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== INVALID PARAMETER ==
INT: 1234
EUC-JP:

Warning: mb_convert_encoding(): Unknown encoding "BAD" in %s on line %d
BAD:
mb_convert_encoding(): Argument #2 ($to) must be a valid encoding, "BAD" given
13 changes: 8 additions & 5 deletions ext/mbstring/tests/mb_encoding_aliases.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,14 @@ sort($list);
var_dump($list);
var_dump(mb_encoding_aliases("7bit"));
var_dump(mb_encoding_aliases("8bit"));
var_dump(mb_encoding_aliases("BAD"));

try {
var_dump(mb_encoding_aliases("BAD"));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
?>
--EXPECTF--
--EXPECT--
array(11) {
[0]=>
string(14) "ANSI_X3.4-1968"
Expand Down Expand Up @@ -42,6 +47,4 @@ array(1) {
[0]=>
string(6) "binary"
}

Warning: mb_encoding_aliases(): Unknown encoding "BAD" in %s on line %d
bool(false)
mb_encoding_aliases(): Argument #1 ($encoding) must be a valid encoding, "BAD" given
16 changes: 9 additions & 7 deletions ext/mbstring/tests/mb_http_output.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,18 @@ print "$enc\n";
// Invalid parameters
print "== INVALID PARAMETER ==\n";

// Note: Bad string raise Warning. Bad Type raise Notice (Type Conversion) and Warning....
$r = mb_http_output('BAD_NAME');
($r === FALSE) ? print "OK_BAD_SET\n" : print "NG_BAD_SET\n";
// Note: Bad string raise ValueError. Bad Type raise Notice (Type Conversion) and ValueError
try {
$r = mb_http_output('BAD_NAME');
print 'NG_BAD_SET' . \PHP_EOL;
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
$enc = mb_http_output();
print "$enc\n";

?>
--EXPECTF--
--EXPECT--
OK_ASCII_SET
ASCII
OK_SJIS_SET
Expand All @@ -60,7 +64,5 @@ UTF-8
OK_EUC-JP_SET
EUC-JP
== INVALID PARAMETER ==

Warning: mb_http_output(): Unknown encoding "BAD_NAME" in %s on line %d
OK_BAD_SET
mb_http_output(): Argument #1 ($encoding) must be a valid encoding, "BAD_NAME" given
EUC-JP
15 changes: 9 additions & 6 deletions ext/mbstring/tests/mb_internal_encoding.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,24 @@ print "$enc\n";
print "== INVALID PARAMETER ==\n";

// Note: Other than string type, PHP raises Warning
$r = mb_internal_encoding('BAD');
($r === false) ? print "OK_BAD_SET\n" : print "NG_BAD_SET\n";
try {
$r = mb_internal_encoding('BAD_NAME');
print 'NG_BAD_SET' . \PHP_EOL;
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}

$enc = mb_internal_encoding();
print "$enc\n";

?>
--EXPECTF--
--EXPECT--
OK_EUC-JP_SET
EUC-JP
OK_UTF-8_SET
UTF-8
OK_ASCII_SET
ASCII
== INVALID PARAMETER ==

Warning: mb_internal_encoding(): Unknown encoding "BAD" in %s on line %d
OK_BAD_SET
mb_internal_encoding(): Argument #1 ($encoding) must be a valid encoding, "BAD_NAME" given
ASCII
14 changes: 7 additions & 7 deletions ext/mbstring/tests/mb_internal_encoding_error2.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ function_exists('mb_internal_encoding') or die("skip mb_internal_encoding() is n

echo "*** Testing mb_internal_encoding() : error conditions ***\n";

var_dump(mb_internal_encoding('unknown-encoding'));
try {
var_dump(mb_internal_encoding('unknown-encoding'));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}

echo "Done";
?>
--EXPECTF--
--EXPECT--
*** Testing mb_internal_encoding() : error conditions ***

Warning: mb_internal_encoding(): Unknown encoding "unknown-encoding" in %s on line %d
bool(false)
Done
mb_internal_encoding(): Argument #1 ($encoding) must be a valid encoding, "unknown-encoding" given
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
--TEST--
Test INI mbstring.internal_encoding basic - invalid encoding specified in INI
--SKIPIF--
<?php
extension_loaded('mbstring') or die('skip');
function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
?>
--INI--
mbstring.internal_encoding=BAD
--FILE--
<?php

echo "*** Testing INI mbstring.internal_encoding: invalid encoding specified in INI ***\n";

echo mb_internal_encoding()."\n";
echo ini_get('mbstring.internal_encoding')."\n";
mb_internal_encoding('UTF-8');
echo mb_internal_encoding()."\n";
echo ini_get('mbstring.internal_encoding')."\n";

?>
--EXPECT--
PHP Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
*** Testing INI mbstring.internal_encoding: invalid encoding specified in INI ***
UTF-8
BAD
UTF-8
BAD
Loading