Commit a5df3507 authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/armbru/tags/pull-monitor-2015-11-26' into staging



QMP and QObject patches

# gpg: Signature made Thu 26 Nov 2015 09:07:18 GMT using RSA key ID EB918653
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
# gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>"

* remotes/armbru/tags/pull-monitor-2015-11-26:
  qjson: Limit number of tokens in addition to total size
  qjson: surprise, allocating 6 QObjects per token is expensive
  qjson: store tokens in a GQueue
  qjson: Convert to parser to recursive descent
  qjson: replace QString in JSONLexer with GString
  qjson: Inline token_is_escape() and simplify
  qjson: Inline token_is_keyword() and simplify
  qjson: Give each of the six structural chars its own token type
  qjson: Spell out some silent assumptions
  check-qjson: Add test for JSON nesting depth limit
  qjson: Don't crash when input exceeds nesting limit
  qjson: Apply nesting limit more sanely
  monitor: Plug memory leak on QMP error

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 317e4db6 df649835
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -14,11 +14,16 @@
#ifndef QEMU_JSON_LEXER_H
#define QEMU_JSON_LEXER_H

#include "qapi/qmp/qstring.h"
#include "qapi/qmp/qlist.h"
#include "glib-compat.h"

typedef enum json_token_type {
    JSON_OPERATOR = 100,
    JSON_MIN = 100,
    JSON_LCURLY = JSON_MIN,
    JSON_RCURLY,
    JSON_LSQUARE,
    JSON_RSQUARE,
    JSON_COLON,
    JSON_COMMA,
    JSON_INTEGER,
    JSON_FLOAT,
    JSON_KEYWORD,
@@ -30,13 +35,14 @@ typedef enum json_token_type {

typedef struct JSONLexer JSONLexer;

typedef void (JSONLexerEmitter)(JSONLexer *, QString *, JSONTokenType, int x, int y);
typedef void (JSONLexerEmitter)(JSONLexer *, GString *,
                                JSONTokenType, int x, int y);

struct JSONLexer
{
    JSONLexerEmitter *emit;
    int state;
    QString *token;
    GString *token;
    int x, y;
};

+2 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
#include "qapi/qmp/qlist.h"
#include "qapi/error.h"

QObject *json_parser_parse(QList *tokens, va_list *ap);
QObject *json_parser_parse_err(QList *tokens, va_list *ap, Error **errp);
QObject *json_parser_parse(GQueue *tokens, va_list *ap);
QObject *json_parser_parse_err(GQueue *tokens, va_list *ap, Error **errp);

#endif
+12 −4
Original line number Diff line number Diff line
@@ -14,21 +14,29 @@
#ifndef QEMU_JSON_STREAMER_H
#define QEMU_JSON_STREAMER_H

#include "qapi/qmp/qlist.h"
#include <stdint.h>
#include "glib-compat.h"
#include "qapi/qmp/json-lexer.h"

typedef struct JSONToken {
    int type;
    int x;
    int y;
    char str[];
} JSONToken;

typedef struct JSONMessageParser
{
    void (*emit)(struct JSONMessageParser *parser, QList *tokens);
    void (*emit)(struct JSONMessageParser *parser, GQueue *tokens);
    JSONLexer lexer;
    int brace_count;
    int bracket_count;
    QList *tokens;
    GQueue *tokens;
    uint64_t token_size;
} JSONMessageParser;

void json_message_parser_init(JSONMessageParser *parser,
                              void (*func)(JSONMessageParser *, QList *));
                              void (*func)(JSONMessageParser *, GQueue *));

int json_message_parser_feed(JSONMessageParser *parser,
                             const char *buffer, size_t size);
+2 −1
Original line number Diff line number Diff line
@@ -3849,7 +3849,7 @@ static QDict *qmp_check_input_obj(QObject *input_obj, Error **errp)
    return input_dict;
}

static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
{
    Error *local_err = NULL;
    QObject *obj, *data;
@@ -3907,6 +3907,7 @@ static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
err_out:
    monitor_protocol_emitter(mon, data, local_err);
    qobject_decref(data);
    error_free(local_err);
    QDECREF(input);
    QDECREF(args);
}
+1 −1
Original line number Diff line number Diff line
@@ -570,7 +570,7 @@ static void process_command(GAState *s, QDict *req)
}

/* handle requests/control events coming in over the channel */
static void process_event(JSONMessageParser *parser, QList *tokens)
static void process_event(JSONMessageParser *parser, GQueue *tokens)
{
    GAState *s = container_of(parser, GAState, parser);
    QDict *qdict;
Loading