Diff for /qemu/json-streamer.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2018/04/24 18:24:35 version 1.1.1.3, 2018/04/24 18:56:39
Line 18 Line 18
 #include "json-lexer.h"  #include "json-lexer.h"
 #include "json-streamer.h"  #include "json-streamer.h"
   
   #define MAX_TOKEN_SIZE (64ULL << 20)
   #define MAX_NESTING (1ULL << 10)
   
 static void json_message_process_token(JSONLexer *lexer, QString *token, JSONTokenType type, int x, int y)  static void json_message_process_token(JSONLexer *lexer, QString *token, JSONTokenType type, int x, int y)
 {  {
     JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);      JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
Line 49  static void json_message_process_token(J Line 52  static void json_message_process_token(J
     qdict_put(dict, "x", qint_from_int(x));      qdict_put(dict, "x", qint_from_int(x));
     qdict_put(dict, "y", qint_from_int(y));      qdict_put(dict, "y", qint_from_int(y));
   
       parser->token_size += token->length;
   
     qlist_append(parser->tokens, dict);      qlist_append(parser->tokens, dict);
   
     if (parser->brace_count == 0 &&      if (type == JSON_ERROR) {
         parser->bracket_count == 0) {          goto out_emit_bad;
         parser->emit(parser, parser->tokens);      } else if (parser->brace_count < 0 ||
           parser->bracket_count < 0 ||
           (parser->brace_count == 0 &&
            parser->bracket_count == 0)) {
           goto out_emit;
       } else if (parser->token_size > MAX_TOKEN_SIZE ||
                  parser->bracket_count > MAX_NESTING ||
                  parser->brace_count > MAX_NESTING) {
           /* Security consideration, we limit total memory allocated per object
            * and the maximum recursion depth that a message can force.
            */
           goto out_emit;
       }
   
       return;
   
   out_emit_bad:
       /* clear out token list and tell the parser to emit and error
        * indication by passing it a NULL list
        */
       QDECREF(parser->tokens);
       parser->tokens = NULL;
   out_emit:
       /* send current list of tokens to parser and reset tokenizer */
       parser->brace_count = 0;
       parser->bracket_count = 0;
       parser->emit(parser, parser->tokens);
       if (parser->tokens) {
         QDECREF(parser->tokens);          QDECREF(parser->tokens);
         parser->tokens = qlist_new();  
     }      }
       parser->tokens = qlist_new();
       parser->token_size = 0;
 }  }
   
 void json_message_parser_init(JSONMessageParser *parser,  void json_message_parser_init(JSONMessageParser *parser,
Line 66  void json_message_parser_init(JSONMessag Line 99  void json_message_parser_init(JSONMessag
     parser->brace_count = 0;      parser->brace_count = 0;
     parser->bracket_count = 0;      parser->bracket_count = 0;
     parser->tokens = qlist_new();      parser->tokens = qlist_new();
       parser->token_size = 0;
   
     json_lexer_init(&parser->lexer, json_message_process_token);      json_lexer_init(&parser->lexer, json_message_process_token);
 }  }

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


unix.superglobalmegacorp.com