Skip to content
Permalink
Browse files

Fix segfault in json ignoring of invalid UTF8

  • Loading branch information...
bukka committed Aug 6, 2017
1 parent 6b73b2d commit 41d7621f48d78034755ccd540ade850eedc838c6
Showing with 22 additions and 1 deletion.
  1. +1 −0 ext/json/json_scanner.c
  2. +1 −0 ext/json/json_scanner.re
  3. +20 −1 ext/json/tests/json_decode_invalid_utf8.phpt
@@ -292,6 +292,7 @@ int php_json_scan(php_json_scanner *s)
{
s->str_start = s->cursor;
s->str_esc = 0;
s->utf8_invalid_count = 0;
PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
}
yy16:
@@ -209,6 +209,7 @@ std:
<JS>["] {
s->str_start = s->cursor;
s->str_esc = 0;
s->utf8_invalid_count = 0;
PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
}
<JS>CTRL {
@@ -9,11 +9,17 @@ if (!extension_loaded("json")) print "skip";
function json_decode_invalid_utf8($str) {
var_dump(json_decode($str));
var_dump(json_decode($str, true, 512, JSON_INVALID_UTF8_IGNORE));
var_dump(bin2hex(json_decode($str, true, 512, JSON_INVALID_UTF8_SUBSTITUTE)));
$json = json_decode($str, true, 512, JSON_INVALID_UTF8_SUBSTITUTE);
if (is_array($json)) {
var_dump(array_map(function($item) { return bin2hex($item); }, $json));
} else {
var_dump(bin2hex($json));
}
}
json_decode_invalid_utf8("\"a\xb0b\"");
json_decode_invalid_utf8("\"a\xd0\xf2b\"");
json_decode_invalid_utf8("\"\x61\xf0\x80\x80\x41\"");
json_decode_invalid_utf8("[\"\xc1\xc1\",\"a\"]");
echo "Done\n";
?>
--EXPECT--
@@ -26,4 +32,17 @@ string(16) "61efbfbdefbfbd62"
NULL
string(2) "aA"
string(22) "61efbfbdefbfbdefbfbd41"
NULL
array(2) {
[0]=>
string(0) ""
[1]=>
string(1) "a"
}
array(2) {
[0]=>
string(12) "efbfbdefbfbd"
[1]=>
string(2) "61"
}
Done

0 comments on commit 41d7621

Please sign in to comment.
You can’t perform that action at this time.