Santize the reporting of VIR_ERR_INVALID_ERROR

To ensure consistent error reporting of invalid arguments,
provide a number of predefined helper methods & macros.

 - An arg which must not be NULL:

   virCheckNonNullArgReturn(argname, retvalue)
   virCheckNonNullArgGoto(argname, label)

 - An arg which must be NULL

   virCheckNullArgGoto(argname, label)

 - An arg which must be positive (ie 1 or greater)

   virCheckPositiveArgGoto(argname, label)

 - An arg which must not be 0

   virCheckNonZeroArgGoto(argname, label)

 - An arg which must be zero

   virCheckZeroArgGoto(argname, label)

 - An arg which must not be negative (ie 0 or greater)

   virCheckNonNegativeArgGoto(argname, label)

* src/libvirt.c, src/libvirt-qemu.c,
  src/nodeinfo.c, src/datatypes.c: Update to use
  virCheckXXXX macros
* po/POTFILES.in: Add libvirt-qemu.c and virterror_internal.h
* src/internal.h: Define macros for checking invalid args
* src/util/virterror_internal.h: Define macros for reporting
  invalid args

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-05-25 18:41:07 +01:00
parent 1d22ba953b
commit d91f3ef497
7 changed files with 624 additions and 836 deletions

View File

@ -39,6 +39,7 @@ src/hyperv/hyperv_wmi.c
src/interface/netcf_driver.c
src/internal.h
src/libvirt.c
src/libvirt-qemu.c
src/locking/lock_driver_sanlock.c
src/locking/lock_manager.c
src/lxc/lxc_container.c
@ -146,6 +147,7 @@ src/util/virpidfile.c
src/util/virrandom.c
src/util/virsocketaddr.c
src/util/virterror.c
src/util/virterror_internal.h
src/util/virtime.c
src/util/virtypedparam.c
src/util/xml.c

View File

@ -138,7 +138,7 @@ virUnrefConnect(virConnectPtr conn) {
int refs;
if ((!VIR_IS_CONNECT(conn))) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return -1;
}
virMutexLock(&conn->lock);
@ -173,17 +173,12 @@ virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
return NULL;
}
if (uuid == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virCheckNonNullArgReturn(uuid, NULL);
virMutexLock(&conn->lock);
virUUIDFormat(uuid, uuidstr);
@ -269,7 +264,7 @@ virUnrefDomain(virDomainPtr domain) {
int refs;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("bad domain or no connection"));
virLibConnError(VIR_ERR_INVALID_DOMAIN, _("bad domain or no connection"));
return -1;
}
virMutexLock(&domain->conn->lock);
@ -305,17 +300,12 @@ virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
return NULL;
}
if (uuid == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virCheckNonNullArgReturn(uuid, NULL);
virMutexLock(&conn->lock);
virUUIDFormat(uuid, uuidstr);
@ -399,7 +389,7 @@ virUnrefNetwork(virNetworkPtr network) {
int refs;
if (!VIR_IS_CONNECTED_NETWORK(network)) {
virLibConnError(VIR_ERR_INVALID_ARG,
virLibConnError(VIR_ERR_INVALID_NETWORK,
_("bad network or no connection"));
return -1;
}
@ -437,13 +427,10 @@ virGetInterface(virConnectPtr conn, const char *name, const char *mac) {
virInterfacePtr ret = NULL;
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
/* a NULL mac from caller is okay. Treat it as blank */
if (mac == NULL)
@ -535,7 +522,7 @@ virUnrefInterface(virInterfacePtr iface) {
int refs;
if (!VIR_IS_CONNECTED_INTERFACE(iface)) {
virLibConnError(VIR_ERR_INVALID_ARG,
virLibConnError(VIR_ERR_INVALID_INTERFACE,
_("bad interface or no connection"));
return -1;
}
@ -574,17 +561,12 @@ virGetStoragePool(virConnectPtr conn, const char *name,
char uuidstr[VIR_UUID_STRING_BUFLEN];
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
return NULL;
}
if (uuid == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virCheckNonNullArgReturn(uuid, NULL);
virMutexLock(&conn->lock);
virUUIDFormat(uuid, uuidstr);
@ -669,7 +651,7 @@ virUnrefStoragePool(virStoragePoolPtr pool) {
int refs;
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibConnError(VIR_ERR_INVALID_ARG,
virLibConnError(VIR_ERR_INVALID_STORAGE_POOL,
_("bad storage pool or no connection"));
return -1;
}
@ -708,17 +690,12 @@ virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
virStorageVolPtr ret = NULL;
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
return NULL;
}
if (key == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing key"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virCheckNonNullArgReturn(key, NULL);
virMutexLock(&conn->lock);
if (VIR_ALLOC(ret) < 0) {
@ -813,7 +790,7 @@ virUnrefStorageVol(virStorageVolPtr vol) {
int refs;
if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) {
virLibConnError(VIR_ERR_INVALID_ARG,
virLibConnError(VIR_ERR_INVALID_STORAGE_VOL,
_("bad storage volume or no connection"));
return -1;
}
@ -850,13 +827,11 @@ virGetNodeDevice(virConnectPtr conn, const char *name)
virNodeDevicePtr ret = NULL;
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virMutexLock(&conn->lock);
if (VIR_ALLOC(ret) < 0) {
@ -970,17 +945,12 @@ virGetSecret(virConnectPtr conn, const unsigned char *uuid,
char uuidstr[VIR_UUID_STRING_BUFLEN];
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (uuid == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
return NULL;
}
if (usageID == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing usageID"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(uuid, NULL);
virCheckNonNullArgReturn(usageID, NULL);
virMutexLock(&conn->lock);
virUUIDFormat(uuid, uuidstr);
@ -1061,7 +1031,7 @@ virUnrefSecret(virSecretPtr secret) {
int refs;
if (!VIR_IS_CONNECTED_SECRET(secret)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("bad secret or no connection"));
virLibConnError(VIR_ERR_INVALID_SECRET, _("bad secret or no connection"));
return -1;
}
virMutexLock(&secret->conn->lock);
@ -1156,17 +1126,12 @@ virGetNWFilter(virConnectPtr conn, const char *name, const unsigned char *uuid)
char uuidstr[VIR_UUID_STRING_BUFLEN];
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
return NULL;
}
if (uuid == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virCheckNonNullArgReturn(uuid, NULL);
virMutexLock(&conn->lock);
virUUIDFormat(uuid, uuidstr);
@ -1253,7 +1218,7 @@ virUnrefNWFilter(virNWFilterPtr nwfilter)
int refs;
if (!VIR_IS_CONNECTED_NWFILTER(nwfilter)) {
virLibConnError(VIR_ERR_INVALID_ARG,
virLibConnError(VIR_ERR_INVALID_NWFILTER,
_("bad nwfilter or no connection"));
return -1;
}
@ -1279,13 +1244,11 @@ virGetDomainSnapshot(virDomainPtr domain, const char *name)
virDomainSnapshotPtr ret = NULL;
if (!VIR_IS_DOMAIN(domain)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("bad domain"));
return NULL;
}
if (name == NULL) {
virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
virLibConnError(VIR_ERR_INVALID_DOMAIN, _("bad domain"));
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
virMutexLock(&domain->conn->lock);
if (VIR_ALLOC(ret) < 0) {
@ -1344,7 +1307,7 @@ virUnrefDomainSnapshot(virDomainSnapshotPtr snapshot)
int refs;
if (!VIR_IS_DOMAIN_SNAPSHOT(snapshot)) {
virLibConnError(VIR_ERR_INVALID_ARG, _("not a snapshot"));
virLibConnError(VIR_ERR_INVALID_DOMAIN_SNAPSHOT, _("not a snapshot"));
return -1;
}

View File

@ -232,17 +232,64 @@
do { \
unsigned long __unsuppflags = flags & ~(supported); \
if (__unsuppflags) { \
virReportErrorHelper(VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
__FILE__, \
__FUNCTION__, \
__LINE__, \
_("%s: unsupported flags (0x%lx)"), \
__FUNCTION__, __unsuppflags); \
virReportInvalidArg(flags, \
_("unsupported flags (0x%lx) in function %s"), \
__unsuppflags, __FUNCTION__); \
return retval; \
} \
} while (0)
# define virCheckNonNullArgReturn(argname, retval) \
do { \
if (argname == NULL) { \
virReportInvalidNullArg(argname); \
return retval; \
} \
} while (0)
# define virCheckNullArgGoto(argname, label) \
do { \
if (argname == NULL) { \
virReportInvalidNullArg(argname); \
goto label; \
} \
} while (0)
# define virCheckNonNullArgGoto(argname, label) \
do { \
if (argname == NULL) { \
virReportInvalidNonNullArg(argname); \
goto label; \
} \
} while (0)
# define virCheckPositiveArgGoto(argname, label) \
do { \
if (argname <= 0) { \
virReportInvalidPositiveArg(argname); \
goto label; \
} \
} while (0)
# define virCheckNonZeroArgGoto(argname, label) \
do { \
if (argname == 0) { \
virReportInvalidNonZeroArg(argname); \
goto label; \
} \
} while (0)
# define virCheckZeroArgGoto(argname, label) \
do { \
if (argname != 0) { \
virReportInvalidNonZeroArg(argname); \
goto label; \
} \
} while (0)
# define virCheckNonNegativeArgGoto(argname, label) \
do { \
if (argname < 0) { \
virReportInvalidNonNegativeArg(argname); \
goto label; \
} \
} while (0)
/* divide value by size, rounding up */
# define VIR_DIV_UP(value, size) (((value) + (size) - 1) / (size))

View File

@ -28,6 +28,8 @@
#include "datatypes.h"
#include "libvirt/libvirt-qemu.h"
#define VIR_FROM_THIS VIR_FROM_NONE
#define virLibConnError(conn, error, info) \
virReportErrorHelper(VIR_FROM_NONE, error, NULL, __FUNCTION__, \
__LINE__, info)
@ -87,10 +89,7 @@ virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
conn = domain->conn;
if (result == NULL) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
virCheckNonNullArgGoto(result, error);
if (conn->flags & VIR_CONNECT_RO) {
virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@ -159,8 +158,11 @@ virDomainQemuAttach(virConnectPtr conn,
return NULL;
}
if (pid != pid_value || pid <= 1) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
virCheckPositiveArgGoto(pid_value, error);
if (pid != pid_value) {
virReportInvalidArg(pid_value,
_("pid_value in %s is too large"),
__FUNCTION__);
goto error;
}

File diff suppressed because it is too large Load Diff

View File

@ -451,8 +451,9 @@ int linuxNodeGetCPUStats(FILE *procstat,
}
if ((*nparams) != LINUX_NB_CPU_STATS) {
nodeReportError(VIR_ERR_INVALID_ARG,
"%s", _("Invalid parameter count"));
virReportInvalidArg(*nparams,
_("nparams in %s must be equal to %d"),
__FUNCTION__, LINUX_NB_CPU_STATS);
goto cleanup;
}
@ -526,7 +527,9 @@ int linuxNodeGetCPUStats(FILE *procstat,
}
}
nodeReportError(VIR_ERR_INVALID_ARG, "%s", _("Invalid cpu number"));
virReportInvalidArg(cpuNum,
_("Invalid cpuNum in %s"),
__FUNCTION__);
cleanup:
return ret;
@ -569,8 +572,9 @@ int linuxNodeGetMemoryStats(FILE *meminfo,
}
if ((*nparams) != nr_param) {
nodeReportError(VIR_ERR_INVALID_ARG,
"%s", _("Invalid stats count"));
virReportInvalidArg(nparams,
_("nparams in %s must be %d"),
__FUNCTION__, nr_param);
goto cleanup;
}
@ -779,8 +783,9 @@ int nodeGetMemoryStats(virConnectPtr conn ATTRIBUTE_UNUSED,
# if HAVE_NUMACTL
if (cellNum > numa_max_node()) {
nodeReportError(VIR_ERR_INVALID_ARG, "%s",
_("Invalid cell number"));
virReportInvalidArg(cellNum,
_("cellNum in %s must be less than or equal to %d"),
__FUNCTION__, numa_max_node());
return -1;
}
# endif

View File

@ -68,6 +68,83 @@ void virReportSystemErrorFull(int domcode,
__FILE__, __FUNCTION__, __LINE__, \
(fmt), __VA_ARGS__)
# define virReportInvalidNullArg(argname) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
_("%s in %s must be NULL"), \
#argname, __FUNCTION__)
# define virReportInvalidNonNullArg(argname) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
_("%s in %s must not be NULL"), \
#argname, __FUNCTION__)
# define virReportInvalidPositiveArg(argname) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
_("%s in %s must greater than zero"), \
#argname, __FUNCTION__)
# define virReportInvalidNonZeroArg(argname) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
_("%s in %s must not be zero"), \
#argname, __FUNCTION__)
# define virReportInvalidZeroArg(argname) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
_("%s in %s must be zero"), \
#argname, __FUNCTION__)
# define virReportInvalidNonNegativeArg(argname) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
_("%s in %s must be zero or greater"), \
#argname, __FUNCTION__)
# define virReportInvalidArg(argname, fmt, ...) \
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__, \
VIR_FROM_THIS, \
VIR_ERR_INVALID_ARG, \
VIR_ERR_ERROR, \
__FUNCTION__, \
#argname, \
NULL, \
0, 0, \
(fmt), __VA_ARGS__)
void virReportOOMErrorFull(int domcode,
const char *filename,
const char *funcname,