Skip to content

Commit

Permalink
decoder: Check trailing content when validating JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
JakubOnderka committed Jan 20, 2025
1 parent efe0225 commit f94e336
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 35 deletions.
8 changes: 7 additions & 1 deletion src/simdjson_decoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,13 @@ PHP_SIMDJSON_API simdjson_php_error_code php_simdjson_validate(simdjson_php_pars
}

SIMDJSON_PHP_TRY(doc.get(value));
return simdjson_ondemand_validate(value, depth);
SIMDJSON_PHP_TRY(simdjson_ondemand_validate(value, depth));

if (UNEXPECTED(!doc.at_end())) {
return simdjson::TRAILING_CONTENT;
}

return simdjson::SUCCESS;
}

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) /* {{{ */ {
Expand Down
74 changes: 40 additions & 34 deletions tests/is_valid.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,60 @@
simdjson_is_valid test
--FILE--
<?php
function validate($input) {
echo "Checking '$input'\n";
var_dump(json_validate($input));
var_dump(\simdjson_is_valid($input));
}

$json = file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'result.json');
$value = \simdjson_is_valid($json);
var_dump($value);

$value = \simdjson_is_valid("true");
var_dump($value);

$value = \simdjson_is_valid("false");
var_dump($value);

$value = \simdjson_is_valid("null");
var_dump($value);

$value = \simdjson_is_valid("[]");
var_dump($value);

$value = \simdjson_is_valid("{}");
var_dump($value);

$value = \simdjson_is_valid("1");
var_dump($value);

$value = \simdjson_is_valid("1.1");
var_dump($value);

$value = \simdjson_is_valid('{"corrupt": true,');
var_dump($value);

$value = \simdjson_is_valid('{"corrupt" true}');
var_dump($value);

$value = \simdjson_is_valid('Invalid JSON string');
var_dump($value);

$value = \simdjson_is_valid('{"value": true} ');
var_dump($value);

validate("true");
validate("false");
validate("null");
validate("[]");
validate("{}");
validate("{}}");
validate("1");
validate('{"corrupt": true,');
validate('{"corrupt" true}');
validate('Invalid JSON string');
validate('{"value": true} ');
?>
--EXPECTF--
--EXPECT--
bool(true)
Checking 'true'
bool(true)
bool(true)
Checking 'false'
bool(true)
bool(true)
Checking 'null'
bool(true)
bool(true)
Checking '[]'
bool(true)
bool(true)
Checking '{}'
bool(true)
bool(true)
Checking '{}}'
bool(false)
bool(false)
Checking '1'
bool(true)
bool(true)
Checking '{"corrupt": true,'
bool(false)
bool(false)
Checking '{"corrupt" true}'
bool(false)
bool(false)
Checking 'Invalid JSON string'
bool(false)
bool(false)
Checking '{"value": true} '
bool(true)
bool(true)

0 comments on commit f94e336

Please # to comment.