
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@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,