From: Markus Armbruster Date: Tue, 3 Jul 2018 08:53:48 +0000 (+0200) Subject: qmp: De-duplicate error response building X-Git-Tag: v2.12.1~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=08c4a51c65fcde99255d8ab9eabbaefeca5f9250;p=thirdparty%2Fqemu.git qmp: De-duplicate error response building All callers of qmp_build_error_object() duplicate the code to wrap it in a response object. Replace it by qmp_error_response() that captures the duplicated code, including error_free(). Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Message-Id: <20180703085358.13941-23-armbru@redhat.com> (cherry picked from commit cee32796cadc9510ee00f029a933009df7a28ae2) Conflicts: include/qapi/qmp/dispatch.h qapi/qmp-dispatch.c qga/main.c * drop context dep on cb3e7f08ae * prereq for ae7da1e5f6 Signed-off-by: Michael Roth --- diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h index ffb4652f716..2d6b46f1f81 100644 --- a/include/qapi/qmp/dispatch.h +++ b/include/qapi/qmp/dispatch.h @@ -47,7 +47,7 @@ void qmp_enable_command(QmpCommandList *cmds, const char *name); bool qmp_command_is_enabled(const QmpCommand *cmd); const char *qmp_command_name(const QmpCommand *cmd); bool qmp_has_success_response(const QmpCommand *cmd); -QObject *qmp_build_error_object(Error *err); +QDict *qmp_error_response(Error *err); QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp); bool qmp_is_oob(QDict *dict); diff --git a/monitor.c b/monitor.c index 39f8ee17ba7..2a9999e9bbd 100644 --- a/monitor.c +++ b/monitor.c @@ -4036,14 +4036,9 @@ static int monitor_can_read(void *opaque) static void monitor_qmp_respond(Monitor *mon, QObject *rsp, Error *err, QObject *id) { - QDict *qdict = NULL; - if (err) { assert(!rsp); - qdict = qdict_new(); - qdict_put_obj(qdict, "error", qmp_build_error_object(err)); - error_free(err); - rsp = QOBJECT(qdict); + rsp = QOBJECT(qmp_error_response(err)); } if (rsp) { diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index dd059072651..7f078b114d5 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -122,11 +122,15 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request, return ret; } -QObject *qmp_build_error_object(Error *err) +QDict *qmp_error_response(Error *err) { - return qobject_from_jsonf("{ 'class': %s, 'desc': %s }", - QapiErrorClass_str(error_get_class(err)), - error_get_pretty(err)); + QDict *rsp; + + rsp = qdict_from_jsonf_nofail("{ 'error': { 'class': %s, 'desc': %s } }", + QapiErrorClass_str(error_get_class(err)), + error_get_pretty(err)); + error_free(err); + return rsp; } /* @@ -159,15 +163,13 @@ QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request) ret = do_qmp_dispatch(cmds, request, &err); - rsp = qdict_new(); if (err) { - qdict_put_obj(rsp, "error", qmp_build_error_object(err)); - error_free(err); + rsp = qmp_error_response(err); } else if (ret) { + rsp = qdict_new(); qdict_put_obj(rsp, "return", ret); } else { - QDECREF(rsp); - return NULL; + rsp = NULL; } return QOBJECT(rsp); diff --git a/qga/main.c b/qga/main.c index df1888edc13..74765e32b92 100644 --- a/qga/main.c +++ b/qga/main.c @@ -610,15 +610,13 @@ static void process_event(JSONMessageParser *parser, GQueue *tokens) qdict = qobject_to(QDict, json_parser_parse_err(tokens, NULL, &err)); if (err || !qdict) { QDECREF(qdict); - qdict = qdict_new(); if (!err) { g_warning("failed to parse event: unknown error"); error_setg(&err, QERR_JSON_PARSING); } else { g_warning("failed to parse event: %s", error_get_pretty(err)); } - qdict_put_obj(qdict, "error", qmp_build_error_object(err)); - error_free(err); + qdict = qmp_error_response(err); } /* handle host->guest commands */ @@ -627,11 +625,9 @@ static void process_event(JSONMessageParser *parser, GQueue *tokens) } else { if (!qdict_haskey(qdict, "error")) { QDECREF(qdict); - qdict = qdict_new(); g_warning("unrecognized payload format"); error_setg(&err, QERR_UNSUPPORTED); - qdict_put_obj(qdict, "error", qmp_build_error_object(err)); - error_free(err); + qdict = qmp_error_response(err); } ret = send_response(s, QOBJECT(qdict)); if (ret < 0) {