qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH v2 06/26] qmp: Drop duplicated QMP command object checks
Date: Sun, 26 Feb 2017 22:43:24 +0100	[thread overview]
Message-ID: <1488145424-14974-7-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1488145424-14974-1-git-send-email-armbru@redhat.com>

qmp_check_input_obj() duplicates qmp_dispatch_check_obj(), except the
latter screws up an error message.  handle_qmp_command() runs first
the former, then the latter via qmp_dispatch(), masking the screwup.

qemu-ga also masks the screwup, because it also duplicates checks,
just differently.

qmp_check_input_obj() exists because handle_qmp_command() needs to
examine the command before dispatching it.  The previous commit got
rid of this need, except for a tracepoint, and a bit of "id" code that
relies on qdict not being null.

Fix up the error message in qmp_dispatch_check_obj(), drop
qmp_check_input_obj() and the tracepoint.  Protect the "id" code with
a conditional.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 monitor.c           | 74 +++++------------------------------------------------
 qapi/qmp-dispatch.c |  3 +--
 trace-events        |  1 -
 3 files changed, 7 insertions(+), 71 deletions(-)

diff --git a/monitor.c b/monitor.c
index e522b6f..97b73ab 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3697,67 +3697,10 @@ static int monitor_can_read(void *opaque)
     return (mon->suspend_cnt == 0) ? 1 : 0;
 }
 
-/*
- * Input object checking rules
- *
- * 1. Input object must be a dict
- * 2. The "execute" key must exist
- * 3. The "execute" key must be a string
- * 4. If the "arguments" key exists, it must be a dict
- * 5. If the "id" key exists, it can be anything (ie. json-value)
- * 6. Any argument not listed above is considered invalid
- */
-static QDict *qmp_check_input_obj(QObject *input_obj, Error **errp)
-{
-    const QDictEntry *ent;
-    int has_exec_key = 0;
-    QDict *input_dict;
-
-    input_dict = qobject_to_qdict(input_obj);
-    if (!input_dict) {
-        error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "object");
-        return NULL;
-    }
-
-
-    for (ent = qdict_first(input_dict); ent; ent = qdict_next(input_dict, ent)){
-        const char *arg_name = qdict_entry_key(ent);
-        const QObject *arg_obj = qdict_entry_value(ent);
-
-        if (!strcmp(arg_name, "execute")) {
-            if (qobject_type(arg_obj) != QTYPE_QSTRING) {
-                error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER,
-                           "execute", "string");
-                return NULL;
-            }
-            has_exec_key = 1;
-        } else if (!strcmp(arg_name, "arguments")) {
-            if (qobject_type(arg_obj) != QTYPE_QDICT) {
-                error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER,
-                           "arguments", "object");
-                return NULL;
-            }
-        } else if (!strcmp(arg_name, "id")) {
-            /* Any string is acceptable as "id", so nothing to check */
-        } else {
-            error_setg(errp, QERR_QMP_EXTRA_MEMBER, arg_name);
-            return NULL;
-        }
-    }
-
-    if (!has_exec_key) {
-        error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "execute");
-        return NULL;
-    }
-
-    return input_dict;
-}
-
 static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
 {
     QObject *req, *rsp = NULL, *id = NULL;
     QDict *qdict = NULL;
-    const char *cmd_name;
     Monitor *mon = cur_mon;
     Error *err = NULL;
 
@@ -3770,17 +3713,12 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
         goto err_out;
     }
 
-    qdict = qmp_check_input_obj(req, &err);
-    if (!qdict) {
-        goto err_out;
-    }
-
-    id = qdict_get(qdict, "id");
-    qobject_incref(id);
-    qdict_del(qdict, "id");
-
-    cmd_name = qdict_get_str(qdict, "execute");
-    trace_handle_qmp_command(mon, cmd_name);
+    qdict = qobject_to_qdict(req);
+    if (qdict) {
+        id = qdict_get(qdict, "id");
+        qobject_incref(id);
+        qdict_del(qdict, "id");
+    } /* else will fail qmp_dispatch() */
 
     rsp = qmp_dispatch(req);
 
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 621922f..4fc1122 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -30,8 +30,7 @@ static QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp)
 
     dict = qobject_to_qdict(request);
     if (!dict) {
-        error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT,
-                   "request is not a dictionary");
+        error_setg(errp, QERR_QMP_BAD_INPUT_OBJECT, "object");
         return NULL;
     }
 
diff --git a/trace-events b/trace-events
index 7288557..b07a09b 100644
--- a/trace-events
+++ b/trace-events
@@ -65,7 +65,6 @@ xen_remap_bucket(uint64_t index) "index %#"PRIx64
 xen_map_cache_return(void* ptr) "%p"
 
 # monitor.c
-handle_qmp_command(void *mon, const char *cmd_name) "mon %p cmd_name \"%s\""
 monitor_protocol_event_handler(uint32_t event, void *qdict) "event=%d data=%p"
 monitor_protocol_event_emit(uint32_t event, void *data) "event=%d data=%p"
 monitor_protocol_event_queue(uint32_t event, void *qdict, uint64_t rate) "event=%d data=%p rate=%" PRId64
-- 
2.7.4

  parent reply	other threads:[~2017-02-26 21:43 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-26 21:43 [Qemu-devel] [PATCH v2 00/26] qapi: QMP dispatch and input visitor work Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 01/26] qga: Fix crash on non-dictionary QMP argument Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 02/26] libqtest: Work around a "QMP wants a newline" bug Markus Armbruster
2017-02-27 16:36   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 03/26] qmp-test: New, covering basic QMP protocol Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 04/26] qmp: Dumb down how we run QMP command registration Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 05/26] qmp: Clean up how we enforce capability negotiation Markus Armbruster
2017-02-27 16:39   ` Eric Blake
2017-02-26 21:43 ` Markus Armbruster [this message]
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 07/26] qmp: Eliminate silly QERR_QMP_* macros Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 08/26] qmp: Improve QMP dispatch error messages Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 09/26] qapi: Improve a QObject input visitor error message Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 10/26] qapi: Clean up after commit 3d344c2 Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 11/26] qapi: Make QObject input visitor set *list reliably Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 12/26] qapi: Improve qobject input visitor error reporting Markus Armbruster
2017-02-27 16:45   ` Eric Blake
2017-02-28  8:42     ` Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 13/26] qapi: Drop string input visitor method optional() Markus Armbruster
2017-02-27 16:46   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 14/26] qapi: Make string input and opts visitor require non-null input Markus Armbruster
2017-02-27 16:58   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 15/26] qom: Make object_property_set_qobject()'s input visitor strict Markus Armbruster
2017-02-27 19:25   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 16/26] test-qobject-input-visitor: Use strict visitor Markus Armbruster
2017-02-27 22:49   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 17/26] qapi: Drop unused non-strict qobject input visitor Markus Armbruster
2017-02-28 14:56   ` Eric Blake
2017-02-28 17:29     ` Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 18/26] tests-qobject-input-strict: Merge into test-qobject-input-visitor Markus Armbruster
2017-02-28 15:39   ` Eric Blake
2017-02-28 16:57     ` Markus Armbruster
2017-02-28 17:10       ` Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 19/26] test-string-input-visitor: Tear down existing test automatically Markus Armbruster
2017-02-28 15:44   ` Eric Blake
2017-02-28 16:08     ` Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 20/26] test-string-input-visitor: Improve list coverage Markus Armbruster
2017-02-28 15:47   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 21/26] tests: Cover partial input visit of list Markus Armbruster
2017-02-28 15:55   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 22/26] test-qobject-input-visitor: Cover missing nested struct member Markus Armbruster
2017-02-28 16:00   ` Eric Blake
2017-02-28 16:52     ` Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 23/26] qapi: Make input visitors detect unvisited list tails Markus Armbruster
2017-02-28 16:09   ` Eric Blake
2017-02-28 16:55     ` Markus Armbruster
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 24/26] tests: Cover input visit beyond end of list Markus Armbruster
2017-02-28 16:19   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 25/26] qapi: Fix object " Markus Armbruster
2017-02-28 16:20   ` Eric Blake
2017-02-26 21:43 ` [Qemu-devel] [PATCH v2 26/26] qapi: Improve qobject visitor documentation Markus Armbruster
2017-02-28 16:22   ` Eric Blake
2017-02-26 22:23 ` [Qemu-devel] [PATCH v2 00/26] qapi: QMP dispatch and input visitor work no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1488145424-14974-7-git-send-email-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).