cmdQemuMonitorCommandQMPWrap: Reset ignored errors from JSON parsing

'cmdQemuMonitorCommandQMPWrap' is checking whether the user provided
string is not valid JSON to avoid wrapping it. In cases where it's not
JSON we ignore the error and add the wrapper.

If the caller then reports a different non-libvirt error the error from
the JSON parsing would be printed as well. Reset errors we ignore:

 # virsh qemu-monitor-command cd --pass-fds a asdf
 error: Unable to parse FD number 'a'
 error: internal error: cannot parse json asdf: lexical error: invalid char in json text.
                                        asdf
                      (right here) ------^

In the above case 'asdf' is not valid JSON, but the code did wrap it
into '{"execute":"asdf"}', the only problem is the argument for
--pass-fds.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Peter Krempa 2022-03-01 14:24:33 +01:00
parent 619d825a18
commit 8e2a043c32

View File

@ -9870,7 +9870,7 @@ cmdQemuMonitorCommandQMPWrap(vshControl *ctl,
const vshCmd *cmd)
{
g_autofree char *fullcmd = cmdQemuMonitorCommandConcatCmd(ctl, cmd, NULL);
g_autoptr(virJSONValue) fullcmdjson = virJSONValueFromString(fullcmd);
g_autoptr(virJSONValue) fullcmdjson = NULL;
g_autofree char *fullargs = NULL;
g_autoptr(virJSONValue) fullargsjson = NULL;
const vshCmdOpt *opt = NULL;
@ -9878,6 +9878,11 @@ cmdQemuMonitorCommandQMPWrap(vshControl *ctl,
g_autoptr(virJSONValue) command = NULL;
g_autoptr(virJSONValue) arguments = NULL;
if (!(fullcmdjson = virJSONValueFromString(fullcmd))) {
/* Reset the error before adding wrapping. */
vshResetLibvirtError();
}
/* if we've got a JSON object, pass it through */
if (virJSONValueIsObject(fullcmdjson))
return g_steal_pointer(&fullcmd);
@ -9889,8 +9894,11 @@ cmdQemuMonitorCommandQMPWrap(vshControl *ctl,
commandname = opt->data;
/* now we process arguments similarly to how we've dealt with the full command */
if ((fullargs = cmdQemuMonitorCommandConcatCmd(ctl, cmd, opt)))
fullargsjson = virJSONValueFromString(fullargs);
if ((fullargs = cmdQemuMonitorCommandConcatCmd(ctl, cmd, opt)) &&
!(fullargsjson = virJSONValueFromString(fullargs))) {
/* Reset the error before adding wrapping. */
vshResetLibvirtError();
}
/* for empty args or a valid JSON object we just use that */
if (!fullargs || virJSONValueIsObject(fullargsjson)) {