mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
qmp: Don't let malformed in-band commands jump the queue
handle_qmp_command() reports certain errors right away. This is wrong when OOB is enabled, because the errors can "jump the queue" then, as the previous commit demonstrates. To fix, we need to delay errors until dispatch. Do that for semantic errors, mostly by reverting ill-advised parts of commitcf869d5317
"qmp: support out-of-band (oob) execution". Bonus: doesn't run qmp_dispatch_check_obj() twice, once in handle_qmp_command(), and again in do_qmp_dispatch(). That's also due to commitcf869d5317
. The next commit will fix queue jumping for syntax errors. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20180703085358.13941-18-armbru@redhat.com>
This commit is contained in:
parent
e8f4a22168
commit
69240fe62d
4 changed files with 30 additions and 67 deletions
|
@ -20,8 +20,8 @@
|
|||
#include "qapi/qmp/qbool.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
||||
QDict *qmp_dispatch_check_obj(const QObject *request, bool allow_oob,
|
||||
Error **errp)
|
||||
static QDict *qmp_dispatch_check_obj(const QObject *request, bool allow_oob,
|
||||
Error **errp)
|
||||
{
|
||||
const char *exec_key = NULL;
|
||||
const QDictEntry *ent;
|
||||
|
@ -78,6 +78,7 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
|
|||
bool allow_oob, Error **errp)
|
||||
{
|
||||
Error *local_err = NULL;
|
||||
bool oob;
|
||||
const char *command;
|
||||
QDict *args, *dict;
|
||||
QmpCommand *cmd;
|
||||
|
@ -89,9 +90,11 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
|
|||
}
|
||||
|
||||
command = qdict_get_try_str(dict, "execute");
|
||||
oob = false;
|
||||
if (!command) {
|
||||
assert(allow_oob);
|
||||
command = qdict_get_str(dict, "exec-oob");
|
||||
oob = true;
|
||||
}
|
||||
cmd = qmp_find_command(cmds, command);
|
||||
if (cmd == NULL) {
|
||||
|
@ -104,6 +107,11 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
|
|||
command);
|
||||
return NULL;
|
||||
}
|
||||
if (oob && !(cmd->options & QCO_ALLOW_OOB)) {
|
||||
error_setg(errp, "The command %s does not support OOB",
|
||||
command);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (runstate_check(RUN_STATE_PRECONFIG) &&
|
||||
!(cmd->options & QCO_ALLOW_PRECONFIG)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue