提交 6e130ddc 编写于 作者: E Eric Blake

maint: improve VIR_ERR_INVALID_DOMAIN usage

In datatype.c, virGetDomainSnapshot could result in the message:

error: invalid domain pointer in bad domain

Furthermore, while there are a few functions in libvirt.c that
only care about a virDomainPtr without regards to the connection
(such as virDomainGetName), most functions also require a valid
connection.  Yet several functions were blindly dereferencing
the conn member without checking it for validity first (such as
virDomainOpenConsole).  Rather than try and correct all usage
of VIR_IS_DOMAIN vs. VIR_IS_CONNECTED_DOMAIN, it is easier to
just blindly require that a valid domain object always has a
valid connection object (which should be true anyways, since
every domain object holds a reference to its connection, so the
connection will not be closed until all domain objects have
also been closed to release their reference).

After this patch, all places that validate a domain consistently
report:

error: invalid domain pointer in someFunc

* src/datatypes.h (virCheckDomainReturn, virCheckDomainGoto): New
macros.
* src/datatypes.c (virGetDomainSnapshot): Use new macro.
(virLibConnError): Delete unused macro.
Signed-off-by: NEric Blake <eblake@redhat.com>
上级 36dd0bd8
...@@ -32,7 +32,6 @@ src/cpu/cpu_generic.c ...@@ -32,7 +32,6 @@ src/cpu/cpu_generic.c
src/cpu/cpu_map.c src/cpu/cpu_map.c
src/cpu/cpu_powerpc.c src/cpu/cpu_powerpc.c
src/cpu/cpu_x86.c src/cpu/cpu_x86.c
src/datatypes.c
src/driver.c src/driver.c
src/esx/esx_driver.c src/esx/esx_driver.c
src/esx/esx_network_driver.c src/esx/esx_network_driver.c
......
...@@ -31,11 +31,6 @@ ...@@ -31,11 +31,6 @@
#define VIR_FROM_THIS VIR_FROM_NONE #define VIR_FROM_THIS VIR_FROM_NONE
#define virLibConnError(code, ...) \
virReportErrorHelper(VIR_FROM_THIS, code, __FILE__, \
__FUNCTION__, __LINE__, __VA_ARGS__)
virClassPtr virConnectClass; virClassPtr virConnectClass;
virClassPtr virConnectCloseCallbackDataClass; virClassPtr virConnectCloseCallbackDataClass;
virClassPtr virDomainClass; virClassPtr virDomainClass;
...@@ -796,22 +791,19 @@ virGetDomainSnapshot(virDomainPtr domain, const char *name) ...@@ -796,22 +791,19 @@ virGetDomainSnapshot(virDomainPtr domain, const char *name)
if (virDataTypesInitialize() < 0) if (virDataTypesInitialize() < 0)
return NULL; return NULL;
if (!VIR_IS_DOMAIN(domain)) { virCheckDomainGoto(domain, error);
virLibConnError(VIR_ERR_INVALID_DOMAIN, "%s", _("bad domain")); virCheckNonNullArgGoto(name, error);
return NULL;
}
virCheckNonNullArgReturn(name, NULL);
if (!(ret = virObjectNew(virDomainSnapshotClass))) if (!(ret = virObjectNew(virDomainSnapshotClass)))
return NULL; goto error;
if (VIR_STRDUP(ret->name, name) < 0) if (VIR_STRDUP(ret->name, name) < 0)
goto cleanup; goto error;
ret->domain = virObjectRef(domain); ret->domain = virObjectRef(domain);
return ret; return ret;
cleanup: error:
virObjectUnref(ret); virObjectUnref(ret);
return NULL; return NULL;
} }
......
...@@ -64,6 +64,29 @@ extern virClassPtr virStoragePoolClass; ...@@ -64,6 +64,29 @@ extern virClassPtr virStoragePoolClass;
(virObjectIsClass((obj), virDomainClass)) (virObjectIsClass((obj), virDomainClass))
# define VIR_IS_CONNECTED_DOMAIN(obj) \ # define VIR_IS_CONNECTED_DOMAIN(obj) \
(VIR_IS_DOMAIN(obj) && virObjectIsClass((obj)->conn, virConnectClass)) (VIR_IS_DOMAIN(obj) && virObjectIsClass((obj)->conn, virConnectClass))
# define virCheckDomainReturn(obj, retval) \
do { \
virDomainPtr _dom = (obj); \
if (!virObjectIsClass(_dom, virDomainClass) || \
!virObjectIsClass(_dom->conn, virConnectClass)) { \
virReportErrorHelper(VIR_FROM_DOM, VIR_ERR_INVALID_DOMAIN, \
__FILE__, __FUNCTION__, __LINE__, \
__FUNCTION__); \
virDispatchError(NULL); \
return retval; \
} \
} while (0)
# define virCheckDomainGoto(obj, label) \
do { \
virDomainPtr _dom = (obj); \
if (!virObjectIsClass(_dom, virDomainClass) || \
!virObjectIsClass(_dom->conn, virConnectClass)) { \
virReportErrorHelper(VIR_FROM_DOM, VIR_ERR_INVALID_DOMAIN, \
__FILE__, __FUNCTION__, __LINE__, \
__FUNCTION__); \
goto label; \
} \
} while (0)
# define VIR_IS_NETWORK(obj) \ # define VIR_IS_NETWORK(obj) \
(virObjectIsClass((obj), virNetworkClass)) (virObjectIsClass((obj), virNetworkClass))
......
...@@ -36,10 +36,6 @@ ...@@ -36,10 +36,6 @@
#define VIR_FROM_THIS VIR_FROM_NONE #define VIR_FROM_THIS VIR_FROM_NONE
#define virLibDomainError(domain, error, info) \
virReportErrorHelper(VIR_FROM_DOM, error, __FILE__, __FUNCTION__, \
__LINE__, info)
/** /**
* virDomainLxcOpenNamespace: * virDomainLxcOpenNamespace:
* @domain: a domain object * @domain: a domain object
...@@ -70,12 +66,7 @@ virDomainLxcOpenNamespace(virDomainPtr domain, ...@@ -70,12 +66,7 @@ virDomainLxcOpenNamespace(virDomainPtr domain,
virResetLastError(); virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { virCheckDomainReturn(domain, -1);
virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL);
return -1;
}
conn = domain->conn; conn = domain->conn;
virCheckNonNullArgGoto(fdlist, error); virCheckNonNullArgGoto(fdlist, error);
......
...@@ -30,10 +30,6 @@ ...@@ -30,10 +30,6 @@
#define VIR_FROM_THIS VIR_FROM_NONE #define VIR_FROM_THIS VIR_FROM_NONE
#define virLibDomainError(domain, error, info) \
virReportErrorHelper(VIR_FROM_DOM, error, __FILE__, __FUNCTION__, \
__LINE__, info)
/** /**
* virDomainQemuMonitorCommand: * virDomainQemuMonitorCommand:
* @domain: a domain object * @domain: a domain object
...@@ -77,12 +73,7 @@ virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd, ...@@ -77,12 +73,7 @@ virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
virResetLastError(); virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { virCheckDomainReturn(domain, -1);
virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL);
return -1;
}
conn = domain->conn; conn = domain->conn;
virCheckNonNullArgGoto(result, error); virCheckNonNullArgGoto(result, error);
...@@ -205,12 +196,7 @@ virDomainQemuAgentCommand(virDomainPtr domain, ...@@ -205,12 +196,7 @@ virDomainQemuAgentCommand(virDomainPtr domain,
virResetLastError(); virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { virCheckDomainReturn(domain, NULL);
virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL);
return NULL;
}
conn = domain->conn; conn = domain->conn;
virCheckReadOnlyGoto(conn->flags, error); virCheckReadOnlyGoto(conn->flags, error);
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册