mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
maint: improve VIR_ERR_INVALID_STREAM usage
For streams validation, we weren't consistent on whether to
use VIR_FROM_NONE or VIR_FROM_STREAMS. Furthermore, in many
API, we want to ensure that a stream is tied to the same
connection as the other object we are operating on; while
other API failed to validate the stream at all. And the
difference between VIR_IS_STREAM and VIR_IS_CONNECTED_STREAM
is moot; as in commit 6e130ddc
, we know that reference
counting means a valid stream will always be tied to a valid
connection. Similar to previous patches, use a common macro
to make it nicer.
* src/datatypes.h (virCheckStreamReturn, virCheckStreamGoto):
New macros.
(VIR_IS_STREAM, VIR_IS_CONNECTED_STREAM): Drop unused macros.
* src/libvirt.c: Use macro throughout.
(virLibStreamError): Drop unused macro.
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
916273eb94
commit
101f176ae4
@ -192,10 +192,31 @@ extern virClassPtr virStoragePoolClass;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
# define VIR_IS_STREAM(obj) \
|
# define virCheckStreamReturn(obj, retval) \
|
||||||
(virObjectIsClass((obj), virStreamClass))
|
do { \
|
||||||
# define VIR_IS_CONNECTED_STREAM(obj) \
|
virStreamPtr _st = (obj); \
|
||||||
(VIR_IS_STREAM(obj) && virObjectIsClass((obj)->conn, virConnectClass))
|
if (!virObjectIsClass(_st, virStreamClass) || \
|
||||||
|
!virObjectIsClass(_st->conn, virConnectClass)) { \
|
||||||
|
virReportErrorHelper(VIR_FROM_STREAMS, \
|
||||||
|
VIR_ERR_INVALID_STREAM, \
|
||||||
|
__FILE__, __FUNCTION__, __LINE__, \
|
||||||
|
__FUNCTION__); \
|
||||||
|
virDispatchError(NULL); \
|
||||||
|
return retval; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# define virCheckStreamGoto(obj, label) \
|
||||||
|
do { \
|
||||||
|
virStreamPtr _st = (obj); \
|
||||||
|
if (!virObjectIsClass(_st, virStreamClass) || \
|
||||||
|
!virObjectIsClass(_st->conn, virConnectClass)) { \
|
||||||
|
virReportErrorHelper(VIR_FROM_STREAMS, \
|
||||||
|
VIR_ERR_INVALID_STREAM, \
|
||||||
|
__FILE__, __FUNCTION__, __LINE__, \
|
||||||
|
__FUNCTION__); \
|
||||||
|
goto label; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
# define VIR_IS_NWFILTER(obj) \
|
# define VIR_IS_NWFILTER(obj) \
|
||||||
(virObjectIsClass((obj), virNWFilterClass))
|
(virObjectIsClass((obj), virNWFilterClass))
|
||||||
|
128
src/libvirt.c
128
src/libvirt.c
@ -528,9 +528,6 @@ DllMain(HINSTANCE instance ATTRIBUTE_UNUSED,
|
|||||||
#define virLibDomainError(code, ...) \
|
#define virLibDomainError(code, ...) \
|
||||||
virReportErrorHelper(VIR_FROM_DOM, code, __FILE__, \
|
virReportErrorHelper(VIR_FROM_DOM, code, __FILE__, \
|
||||||
__FUNCTION__, __LINE__, __VA_ARGS__)
|
__FUNCTION__, __LINE__, __VA_ARGS__)
|
||||||
#define virLibStreamError(code, ...) \
|
|
||||||
virReportErrorHelper(VIR_FROM_STREAMS, code, __FILE__, \
|
|
||||||
__FUNCTION__, __LINE__, __VA_ARGS__)
|
|
||||||
#define virLibNWFilterError(code, ...) \
|
#define virLibNWFilterError(code, ...) \
|
||||||
virReportErrorHelper(VIR_FROM_NWFILTER, code, __FILE__, \
|
virReportErrorHelper(VIR_FROM_NWFILTER, code, __FILE__, \
|
||||||
__FUNCTION__, __LINE__, __VA_ARGS__)
|
__FUNCTION__, __LINE__, __VA_ARGS__)
|
||||||
@ -3087,14 +3084,18 @@ virDomainScreenshot(virDomainPtr domain,
|
|||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
virCheckDomainReturn(domain, NULL);
|
virCheckDomainReturn(domain, NULL);
|
||||||
if (!VIR_IS_STREAM(stream)) {
|
virCheckStreamGoto(stream, error);
|
||||||
virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
|
virCheckReadOnlyGoto(domain->conn->flags, error);
|
||||||
return NULL;
|
|
||||||
|
if (domain->conn != stream->conn) {
|
||||||
|
virReportInvalidArg(stream,
|
||||||
|
_("stream in %s must match connection of domain '%s'"),
|
||||||
|
__FUNCTION__, domain->name);
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
virCheckReadOnlyGoto(domain->conn->flags | stream->conn->flags, error);
|
|
||||||
|
|
||||||
if (domain->conn->driver->domainScreenshot) {
|
if (domain->conn->driver->domainScreenshot) {
|
||||||
char * ret;
|
char *ret;
|
||||||
ret = domain->conn->driver->domainScreenshot(domain, stream,
|
ret = domain->conn->driver->domainScreenshot(domain, stream,
|
||||||
screen, flags);
|
screen, flags);
|
||||||
|
|
||||||
@ -13664,14 +13665,16 @@ virStorageVolDownload(virStorageVolPtr vol,
|
|||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
virCheckStorageVolReturn(vol, -1);
|
virCheckStorageVolReturn(vol, -1);
|
||||||
|
virCheckStreamGoto(stream, error);
|
||||||
|
virCheckReadOnlyGoto(vol->conn->flags, error);
|
||||||
|
|
||||||
if (!VIR_IS_STREAM(stream)) {
|
if (vol->conn != stream->conn) {
|
||||||
virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
|
virReportInvalidArg(stream,
|
||||||
return -1;
|
_("stream in %s must match connection of volume '%s'"),
|
||||||
|
__FUNCTION__, vol->name);
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
virCheckReadOnlyGoto(vol->conn->flags | stream->conn->flags, error);
|
|
||||||
|
|
||||||
if (vol->conn->storageDriver &&
|
if (vol->conn->storageDriver &&
|
||||||
vol->conn->storageDriver->storageVolDownload) {
|
vol->conn->storageDriver->storageVolDownload) {
|
||||||
int ret;
|
int ret;
|
||||||
@ -13728,14 +13731,16 @@ virStorageVolUpload(virStorageVolPtr vol,
|
|||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
virCheckStorageVolReturn(vol, -1);
|
virCheckStorageVolReturn(vol, -1);
|
||||||
|
virCheckStreamGoto(stream, error);
|
||||||
|
virCheckReadOnlyGoto(vol->conn->flags, error);
|
||||||
|
|
||||||
if (!VIR_IS_STREAM(stream)) {
|
if (vol->conn != stream->conn) {
|
||||||
virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
|
virReportInvalidArg(stream,
|
||||||
return -1;
|
_("stream in %s must match connection of volume '%s'"),
|
||||||
|
__FUNCTION__, vol->name);
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
virCheckReadOnlyGoto(vol->conn->flags | stream->conn->flags, error);
|
|
||||||
|
|
||||||
if (vol->conn->storageDriver &&
|
if (vol->conn->storageDriver &&
|
||||||
vol->conn->storageDriver->storageVolUpload) {
|
vol->conn->storageDriver->storageVolUpload) {
|
||||||
int ret;
|
int ret;
|
||||||
@ -15661,11 +15666,8 @@ virStreamRef(virStreamPtr stream)
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if ((!VIR_IS_CONNECTED_STREAM(stream))) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
virObjectRef(stream);
|
virObjectRef(stream);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -15744,12 +15746,7 @@ virStreamSend(virStreamPtr stream,
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
virCheckNonNullArgGoto(data, error);
|
virCheckNonNullArgGoto(data, error);
|
||||||
|
|
||||||
if (stream->driver &&
|
if (stream->driver &&
|
||||||
@ -15842,12 +15839,7 @@ virStreamRecv(virStreamPtr stream,
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
virCheckNonNullArgGoto(data, error);
|
virCheckNonNullArgGoto(data, error);
|
||||||
|
|
||||||
if (stream->driver &&
|
if (stream->driver &&
|
||||||
@ -15921,12 +15913,7 @@ virStreamSendAll(virStreamPtr stream,
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
virCheckNonNullArgGoto(handler, cleanup);
|
virCheckNonNullArgGoto(handler, cleanup);
|
||||||
|
|
||||||
if (stream->flags & VIR_STREAM_NONBLOCK) {
|
if (stream->flags & VIR_STREAM_NONBLOCK) {
|
||||||
@ -16019,12 +16006,7 @@ virStreamRecvAll(virStreamPtr stream,
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
virCheckNonNullArgGoto(handler, cleanup);
|
virCheckNonNullArgGoto(handler, cleanup);
|
||||||
|
|
||||||
if (stream->flags & VIR_STREAM_NONBLOCK) {
|
if (stream->flags & VIR_STREAM_NONBLOCK) {
|
||||||
@ -16093,11 +16075,7 @@ virStreamEventAddCallback(virStreamPtr stream,
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stream->driver &&
|
if (stream->driver &&
|
||||||
stream->driver->streamEventAddCallback) {
|
stream->driver->streamEventAddCallback) {
|
||||||
@ -16136,11 +16114,7 @@ virStreamEventUpdateCallback(virStreamPtr stream,
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stream->driver &&
|
if (stream->driver &&
|
||||||
stream->driver->streamEventUpdateCallback) {
|
stream->driver->streamEventUpdateCallback) {
|
||||||
@ -16174,11 +16148,7 @@ virStreamEventRemoveCallback(virStreamPtr stream)
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stream->driver &&
|
if (stream->driver &&
|
||||||
stream->driver->streamEventRemoveCallback) {
|
stream->driver->streamEventRemoveCallback) {
|
||||||
@ -16219,11 +16189,7 @@ virStreamFinish(virStreamPtr stream)
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stream->driver &&
|
if (stream->driver &&
|
||||||
stream->driver->streamFinish) {
|
stream->driver->streamFinish) {
|
||||||
@ -16262,11 +16228,7 @@ virStreamAbort(virStreamPtr stream)
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stream->driver) {
|
if (!stream->driver) {
|
||||||
VIR_DEBUG("aborting unused stream");
|
VIR_DEBUG("aborting unused stream");
|
||||||
@ -16310,11 +16272,7 @@ virStreamFree(virStreamPtr stream)
|
|||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
if (!VIR_IS_CONNECTED_STREAM(stream)) {
|
virCheckStreamReturn(stream, -1);
|
||||||
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
|
||||||
virDispatchError(NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX Enforce shutdown before free'ing resources ? */
|
/* XXX Enforce shutdown before free'ing resources ? */
|
||||||
|
|
||||||
@ -19332,8 +19290,16 @@ virDomainOpenConsole(virDomainPtr dom,
|
|||||||
virCheckDomainReturn(dom, -1);
|
virCheckDomainReturn(dom, -1);
|
||||||
conn = dom->conn;
|
conn = dom->conn;
|
||||||
|
|
||||||
|
virCheckStreamGoto(st, error);
|
||||||
virCheckReadOnlyGoto(conn->flags, error);
|
virCheckReadOnlyGoto(conn->flags, error);
|
||||||
|
|
||||||
|
if (conn != st->conn) {
|
||||||
|
virReportInvalidArg(st,
|
||||||
|
_("stream in %s must match connection of domain '%s'"),
|
||||||
|
__FUNCTION__, dom->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainOpenConsole) {
|
if (conn->driver->domainOpenConsole) {
|
||||||
int ret;
|
int ret;
|
||||||
ret = conn->driver->domainOpenConsole(dom, dev_name, st, flags);
|
ret = conn->driver->domainOpenConsole(dom, dev_name, st, flags);
|
||||||
@ -19388,8 +19354,16 @@ virDomainOpenChannel(virDomainPtr dom,
|
|||||||
virCheckDomainReturn(dom, -1);
|
virCheckDomainReturn(dom, -1);
|
||||||
conn = dom->conn;
|
conn = dom->conn;
|
||||||
|
|
||||||
|
virCheckStreamGoto(st, error);
|
||||||
virCheckReadOnlyGoto(conn->flags, error);
|
virCheckReadOnlyGoto(conn->flags, error);
|
||||||
|
|
||||||
|
if (conn != st->conn) {
|
||||||
|
virReportInvalidArg(st,
|
||||||
|
_("stream in %s must match connection of domain '%s'"),
|
||||||
|
__FUNCTION__, dom->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainOpenChannel) {
|
if (conn->driver->domainOpenChannel) {
|
||||||
int ret;
|
int ret;
|
||||||
ret = conn->driver->domainOpenChannel(dom, name, st, flags);
|
ret = conn->driver->domainOpenChannel(dom, name, st, flags);
|
||||||
|
Loading…
Reference in New Issue
Block a user