Fix json_validate double free in parser when discarding lookahead (#9696)

This commit is contained in:
Ilija Tovilo 2022-10-09 21:03:06 +01:00 committed by GitHub
parent 3e9fcb5a9e
commit 08e886235a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -280,13 +280,17 @@ static int php_json_parser_object_update_validate(php_json_parser *parser, zval
static int php_json_yylex(union YYSTYPE *value, php_json_parser *parser) static int php_json_yylex(union YYSTYPE *value, php_json_parser *parser)
{ {
int token = php_json_scan(&parser->scanner); int token = php_json_scan(&parser->scanner);
value->value = parser->scanner.value;
if (parser->methods.array_create == php_json_parser_array_create_validate bool validate = parser->methods.array_create == php_json_parser_array_create_validate
&& parser->methods.array_append == php_json_parser_array_append_validate && parser->methods.array_append == php_json_parser_array_append_validate
&& parser->methods.object_create == php_json_parser_object_create_validate && parser->methods.object_create == php_json_parser_object_create_validate
&& parser->methods.object_update == php_json_parser_object_update_validate) { && parser->methods.object_update == php_json_parser_object_update_validate;
if (validate) {
zval_ptr_dtor_str(&(parser->scanner.value)); zval_ptr_dtor_str(&(parser->scanner.value));
ZVAL_UNDEF(&value->value);
} else {
value->value = parser->scanner.value;
} }
return token; return token;