[libvirt] [PATCH 04/24] maint: improve error condition style in public API

John Ferlan jferlan at redhat.com
Thu Jan 2 18:16:07 UTC 2014



On 12/28/2013 11:11 AM, Eric Blake wrote:
> While auditing error messages in libvirt.c, I found a couple
> instances that had not been converted to modern error styles,
> and a few places that failed to dispatch the error through
> the known-good connection.
> 
> * src/libvirt.c (virDomainPinEmulator, virDomainGetDiskErrors)
> (virDomainSendKey, virDomainGetSecurityLabelList)
> (virDomainGetEmulatorPinInfo): Use typical error reporting.
> (virConnectGetCPUModelNames, virConnectRegisterCloseCallback)
> (virConnectUnregisterCloseCallback, virDomainGetUUID): Report
> error through connection.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  src/libvirt.c | 54 ++++++++++++++++++++++++++++--------------------------
>  1 file changed, 28 insertions(+), 26 deletions(-)
> 
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 815dd64..33f7078 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -3588,11 +3588,15 @@ virDomainGetUUID(virDomainPtr domain, unsigned char *uuid)
>          virDispatchError(NULL);
>          return -1;
>      }
> -    virCheckNonNullArgReturn(uuid, -1);
> +    virCheckNonNullArgGoto(uuid, error);
> 
>      memcpy(uuid, &domain->uuid[0], VIR_UUID_BUFLEN);
> 
>      return 0;
> +
> +error:
> +    virDispatchError(domain->conn);
> +    return -1;
>  }
> 
> 
> @@ -9866,11 +9870,14 @@ virDomainSendKey(virDomainPtr domain,
> 
>      virResetLastError();
> 
> -    if (keycodes == NULL ||
> -        nkeycodes <= 0 || nkeycodes > VIR_DOMAIN_SEND_KEY_MAX_KEYS) {
> -        virLibDomainError(VIR_ERR_OPERATION_INVALID, __FUNCTION__);
> -        virDispatchError(NULL);
> -        return -1;
> +    virCheckNonNullArgGoto(keycodes, error);
> +    virCheckPositiveArgGoto(nkeycodes, error);
> +
> +    if (nkeycodes > VIR_DOMAIN_SEND_KEY_MAX_KEYS) {
> +        virReportInvalidArg(nkeycodes,
> +                            _("nkeycodes in %s must be less than %d"),

technically...

less than or equal to ...


> +                            __FUNCTION__, VIR_DOMAIN_SEND_KEY_MAX_KEYS);
> +        goto error;
>      }

I think the above code may need to move after the next two domain checks
(although looking forward, I realize it may be irrelevant)...

If domain is NULL at the goto error above, then the domain->conn deref
in error: will cause more havoc.

> 
>      if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
> @@ -10477,10 +10484,8 @@ virDomainPinEmulator(virDomainPtr domain, unsigned char *cpumap,
>          goto error;
>      }
> 
> -    if ((cpumap == NULL) || (maplen < 1)) {
> -        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
> -        goto error;
> -    }
> +    virCheckNonNullArgGoto(cpumap, error);
> +    virCheckPositiveArgGoto(maplen, error);
> 
>      conn = domain->conn;
> 
> @@ -10537,15 +10542,15 @@ virDomainGetEmulatorPinInfo(virDomainPtr domain, unsigned char *cpumap,
>          return -1;
>      }
> 
> -    if (!cpumap || maplen <= 0) {
> -        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
> -        goto error;
> -    }
> +    virCheckNonNullArgGoto(cpumap, error);
> +    virCheckPositiveArgGoto(maplen, error);
> 
>      /* At most one of these two flags should be set.  */
>      if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
>          (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
> -        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
> +        virReportInvalidArg(flags,
> +                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
> +                            __FUNCTION__);

The new error message is longer than 80 columns.. split across multiple
lines.

ACK with nits.

John

>          goto error;
>      }
>      conn = domain->conn;
> @@ -10759,10 +10764,7 @@ virDomainGetSecurityLabelList(virDomainPtr domain,
>          return -1;
>      }
> 
> -    if (seclabels == NULL) {
> -        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
> -        goto error;
> -    }
> +    virCheckNonNullArgGoto(seclabels, error);
> 
>      conn = domain->conn;
> 
> @@ -18815,7 +18817,7 @@ virConnectGetCPUModelNames(virConnectPtr conn, const char *arch, char ***models,
>          virDispatchError(NULL);
>          return -1;
>      }
> -    virCheckNonNullArgReturn(arch, -1);
> +    virCheckNonNullArgGoto(arch, error);
> 
>      if (conn->driver->connectGetCPUModelNames) {
>          int ret;
> @@ -21887,10 +21889,10 @@ virConnectRegisterCloseCallback(virConnectPtr conn,
>      return 0;
> 
>  error:
> +    virDispatchError(conn);
>      virObjectUnlock(conn->closeCallback);
>      virMutexUnlock(&conn->lock);
>      virObjectUnref(conn);
> -    virDispatchError(NULL);
>      return -1;
>  }
> 
> @@ -21945,9 +21947,9 @@ virConnectUnregisterCloseCallback(virConnectPtr conn,
>      return 0;
> 
>  error:
> +    virDispatchError(conn);
>      virObjectUnlock(conn->closeCallback);
>      virMutexUnlock(&conn->lock);
> -    virDispatchError(NULL);
>      return -1;
>  }
> 
> @@ -22305,10 +22307,10 @@ virDomainGetDiskErrors(virDomainPtr dom,
>          return -1;
>      }
> 
> -    if ((!errors && maxerrors) || (errors && !maxerrors)) {
> -        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> -        goto error;
> -    }
> +    if (maxerrors)
> +        virCheckNonNullArgGoto(errors, error);
> +    else
> +        virCheckNullArgGoto(errors, error);
> 
>      if (dom->conn->driver->domainGetDiskErrors) {
>          int ret = dom->conn->driver->domainGetDiskErrors(dom, errors,
> 




More information about the libvir-list mailing list