]> xenbits.xensource.com Git - libvirt.git/commitdiff
cmdQemuMonitorCommandQMPWrap: Reset ignored errors from JSON parsing
authorPeter Krempa <pkrempa@redhat.com>
Tue, 1 Mar 2022 13:24:33 +0000 (14:24 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 25 Jul 2022 10:25:02 +0000 (12:25 +0200)
'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>
tools/virsh-domain.c

index 76d12d2b7019f61f6e39606d1b2d2deaa49befe8..1f995a462adbaac915339fb856d8c0dec93f970e 100644 (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)) {