Skip to content

Commit 06eb28c

Browse files
committed
decoder: Check trailing content when validating JSON
1 parent 26ecc23 commit 06eb28c

File tree

2 files changed

+63
-36
lines changed

2 files changed

+63
-36
lines changed

src/simdjson_decoder.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,13 @@ PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_validate(simdjson_php_pars
682682
}
683683

684684
SIMDJSON_PHP_TRY(doc.get(value));
685-
return simdjson_ondemand_validate(value, depth);
685+
SIMDJSON_PHP_TRY(simdjson_ondemand_validate(value, depth));
686+
687+
if (UNEXPECTED(!doc.at_end())) {
688+
return simdjson::TRAILING_CONTENT;
689+
}
690+
691+
return simdjson::SUCCESS;
686692
}
687693

688694
PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_parse(simdjson_php_parser* parser, const zend_string *json, zval *return_value, bool associative, size_t depth) /* {{{ */ {

tests/is_valid.phpt

Lines changed: 56 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,76 @@
11
--TEST--
22
simdjson_is_valid test
3+
--SKIPIF--
4+
<?php if (PHP_VERSION_ID < 80300) echo "skip requires php 8.3+ for json_validate method\n";
35
--FILE--
46
<?php
7+
function validate($input) {
8+
echo "Checking '$input'\n";
9+
var_dump(json_validate($input));
10+
var_dump(\simdjson_is_valid($input));
11+
}
12+
513
$json = file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'result.json');
614
$value = \simdjson_is_valid($json);
715
var_dump($value);
816

9-
$value = \simdjson_is_valid("true");
10-
var_dump($value);
11-
12-
$value = \simdjson_is_valid("false");
13-
var_dump($value);
14-
15-
$value = \simdjson_is_valid("null");
16-
var_dump($value);
17-
18-
$value = \simdjson_is_valid("[]");
19-
var_dump($value);
20-
21-
$value = \simdjson_is_valid("{}");
22-
var_dump($value);
23-
24-
$value = \simdjson_is_valid("1");
25-
var_dump($value);
26-
27-
$value = \simdjson_is_valid("1.1");
28-
var_dump($value);
29-
30-
$value = \simdjson_is_valid('{"corrupt": true,');
31-
var_dump($value);
32-
33-
$value = \simdjson_is_valid('{"corrupt" true}');
34-
var_dump($value);
35-
36-
$value = \simdjson_is_valid('Invalid JSON string');
37-
var_dump($value);
38-
39-
$value = \simdjson_is_valid('{"value": true} ');
40-
var_dump($value);
41-
17+
validate("true");
18+
validate("false");
19+
validate("null");
20+
validate("[]");
21+
validate("{}");
22+
validate("{}}");
23+
validate("1");
24+
validate('{"corrupt": true,');
25+
validate('{"corrupt" true}');
26+
validate('Invalid JSON string');
27+
validate('{"value": true} ');
28+
validate("{\"value\": true}\n\t ");
29+
validate('{"value": true}{}');
30+
validate('{"value": true}abc');
4231
?>
43-
--EXPECTF--
32+
--EXPECT--
33+
bool(true)
34+
Checking 'true'
35+
bool(true)
36+
bool(true)
37+
Checking 'false'
38+
bool(true)
39+
bool(true)
40+
Checking 'null'
41+
bool(true)
42+
bool(true)
43+
Checking '[]'
4444
bool(true)
4545
bool(true)
46+
Checking '{}'
4647
bool(true)
4748
bool(true)
49+
Checking '{}}'
50+
bool(false)
51+
bool(false)
52+
Checking '1'
53+
bool(true)
54+
bool(true)
55+
Checking '{"corrupt": true,'
56+
bool(false)
57+
bool(false)
58+
Checking '{"corrupt" true}'
59+
bool(false)
60+
bool(false)
61+
Checking 'Invalid JSON string'
62+
bool(false)
63+
bool(false)
64+
Checking '{"value": true} '
4865
bool(true)
4966
bool(true)
67+
Checking '{"value": true}
68+
'
5069
bool(true)
5170
bool(true)
71+
Checking '{"value": true}{}'
5272
bool(false)
5373
bool(false)
74+
Checking '{"value": true}abc'
5475
bool(false)
55-
bool(true)
76+
bool(false)

0 commit comments

Comments
 (0)