|
@@ -39,9 +39,9 @@ void json_message_process_token(JSONLexer *lexer, GString *input,
|
|
JSONTokenType type, int x, int y)
|
|
JSONTokenType type, int x, int y)
|
|
{
|
|
{
|
|
JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
|
|
JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
|
|
|
|
+ QObject *json = NULL;
|
|
Error *err = NULL;
|
|
Error *err = NULL;
|
|
JSONToken *token;
|
|
JSONToken *token;
|
|
- QObject *json;
|
|
|
|
|
|
|
|
switch (type) {
|
|
switch (type) {
|
|
case JSON_LCURLY:
|
|
case JSON_LCURLY:
|
|
@@ -72,34 +72,33 @@ void json_message_process_token(JSONLexer *lexer, GString *input,
|
|
g_queue_push_tail(parser->tokens, token);
|
|
g_queue_push_tail(parser->tokens, token);
|
|
|
|
|
|
if (type == JSON_ERROR) {
|
|
if (type == JSON_ERROR) {
|
|
- goto out_emit_bad;
|
|
|
|
- } else if (parser->brace_count < 0 ||
|
|
|
|
|
|
+ goto out_emit;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (parser->brace_count < 0 ||
|
|
parser->bracket_count < 0 ||
|
|
parser->bracket_count < 0 ||
|
|
(parser->brace_count == 0 &&
|
|
(parser->brace_count == 0 &&
|
|
parser->bracket_count == 0)) {
|
|
parser->bracket_count == 0)) {
|
|
|
|
+ json = json_parser_parse(parser->tokens, parser->ap, &err);
|
|
|
|
+ parser->tokens = NULL;
|
|
goto out_emit;
|
|
goto out_emit;
|
|
- } else if (parser->token_size > MAX_TOKEN_SIZE ||
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (parser->token_size > MAX_TOKEN_SIZE ||
|
|
g_queue_get_length(parser->tokens) > MAX_TOKEN_COUNT ||
|
|
g_queue_get_length(parser->tokens) > MAX_TOKEN_COUNT ||
|
|
parser->bracket_count + parser->brace_count > MAX_NESTING) {
|
|
parser->bracket_count + parser->brace_count > MAX_NESTING) {
|
|
/* Security consideration, we limit total memory allocated per object
|
|
/* Security consideration, we limit total memory allocated per object
|
|
* and the maximum recursion depth that a message can force.
|
|
* and the maximum recursion depth that a message can force.
|
|
*/
|
|
*/
|
|
- goto out_emit_bad;
|
|
|
|
|
|
+ goto out_emit;
|
|
}
|
|
}
|
|
|
|
|
|
return;
|
|
return;
|
|
|
|
|
|
-out_emit_bad:
|
|
|
|
- /*
|
|
|
|
- * Clear out token list and tell the parser to emit an error
|
|
|
|
- * indication by passing it a NULL list
|
|
|
|
- */
|
|
|
|
- json_message_free_tokens(parser);
|
|
|
|
out_emit:
|
|
out_emit:
|
|
- /* send current list of tokens to parser and reset tokenizer */
|
|
|
|
parser->brace_count = 0;
|
|
parser->brace_count = 0;
|
|
parser->bracket_count = 0;
|
|
parser->bracket_count = 0;
|
|
- json = json_parser_parse(parser->tokens, parser->ap, &err);
|
|
|
|
|
|
+ json_message_free_tokens(parser);
|
|
parser->tokens = g_queue_new();
|
|
parser->tokens = g_queue_new();
|
|
parser->token_size = 0;
|
|
parser->token_size = 0;
|
|
parser->emit(parser->opaque, json, err);
|
|
parser->emit(parser->opaque, json, err);
|