[libvirt] [PATCH 01/11] qemu: monitor: Extract handling of JSON block job error codes
John Ferlan
jferlan at redhat.com
Wed Apr 8 14:25:36 UTC 2015
On 04/01/2015 01:20 PM, Peter Krempa wrote:
> My intention is to split qemuMonitorJSONBlockJob() into simpler separate
> functions for every block job type. Since the error handling code is the
> same for all block jobs, this patch extracts the code into a separate
> function that will later be reused in more places.
> ---
> src/qemu/qemu_monitor_json.c | 64 +++++++++++++++++++++++++++-----------------
> 1 file changed, 39 insertions(+), 25 deletions(-)
>
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index aa844ca..edd0a3f 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -4252,6 +4252,39 @@ qemuMonitorJSONBlockJobInfo(qemuMonitorPtr mon,
> }
>
>
> +static int
> +qemuMonitorJSONBlockJobError(virJSONValuePtr reply,
> + const char *cmd_name,
> + const char *device)
> +{
> + if (!virJSONValueObjectHasKey(reply, "error"))
> + return 0;
> +
> + if (qemuMonitorJSONHasError(reply, "DeviceNotActive")) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("No active operation on device: %s"), device);
> + } else if (qemuMonitorJSONHasError(reply, "DeviceInUse")) {
> + virReportError(VIR_ERR_OPERATION_FAILED,
> + _("Device %s in use"), device);
> + } else if (qemuMonitorJSONHasError(reply, "NotSupported")) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("Operation is not supported for device: %s"), device);
> + } else if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("Command '%s' is not found"), cmd_name);
> + } else {
> + virJSONValuePtr error = virJSONValueObjectGet(reply, "error");
Because you touched it - Coverity whines that 'error' is not checked for
NULL:
(8) Event returned_null: "virJSONValueObjectGet" returns null (checked
96 out of 99 times). [details]
(16) Event var_assigned: Assigning: "error" = null return value from
"virJSONValueObjectGet".
Also see events:
(17) Event dereference: Dereferencing a pointer that might be null
"error" when calling "virJSONValueObjectGetString". [details]
There's many examples (96) of checking...
ACK with the check
John
> +
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unexpected error: (%s) '%s'"),
> + NULLSTR(virJSONValueObjectGetString(error, "class")),
> + NULLSTR(virJSONValueObjectGetString(error, "desc")));
> + }
> +
> + return -1;
> +}
> +
> +
> /* speed is in bytes/sec */
> int
> qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
> @@ -4322,34 +4355,15 @@ qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
> if (!cmd)
> return -1;
>
> - ret = qemuMonitorJSONCommand(mon, cmd, &reply);
> + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
> + goto cleanup;
>
> - if (ret == 0 && virJSONValueObjectHasKey(reply, "error")) {
> - ret = -1;
> - if (qemuMonitorJSONHasError(reply, "DeviceNotActive")) {
> - virReportError(VIR_ERR_OPERATION_INVALID,
> - _("No active operation on device: %s"),
> - device);
> - } else if (qemuMonitorJSONHasError(reply, "DeviceInUse")) {
> - virReportError(VIR_ERR_OPERATION_FAILED,
> - _("Device %s in use"), device);
> - } else if (qemuMonitorJSONHasError(reply, "NotSupported")) {
> - virReportError(VIR_ERR_OPERATION_INVALID,
> - _("Operation is not supported for device: %s"),
> - device);
> - } else if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
> - virReportError(VIR_ERR_OPERATION_INVALID,
> - _("Command '%s' is not found"), cmd_name);
> - } else {
> - virJSONValuePtr error = virJSONValueObjectGet(reply, "error");
> + if (qemuMonitorJSONBlockJobError(reply, cmd_name, device) < 0)
> + goto cleanup;
>
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Unexpected error: (%s) '%s'"),
> - NULLSTR(virJSONValueObjectGetString(error, "class")),
> - NULLSTR(virJSONValueObjectGetString(error, "desc")));
> - }
> - }
> + ret = 0;
>
> + cleanup:
> virJSONValueFree(cmd);
> virJSONValueFree(reply);
> return ret;
>
More information about the libvir-list
mailing list