libvirt: do not mix internal flags into public API

There were two API in driver.c that were silently masking flags
bits prior to calling out to the drivers, and several others
that were explicitly masking flags bits.  This is not
forward-compatible - if we ever have that many flags in the
future, then talking to an old server that masks out the
flags would be indistinguishable from talking to a new server
that can honor the flag.  In general, libvirt.c should forward
_all_ flags on to drivers, and only the drivers should reject
unknown flags.

In the case of virDrvSecretGetValue, the solution is to separate
the internal driver callback function to have two parameters
instead of one, with only one parameter affected by the public
API.  In the case of virDomainGetXMLDesc, it turns out that
no one was ever mixing VIR_DOMAIN_XML_INTERNAL_STATUS with
the dumpxml path in the first place; that internal flag was
only used in saving and restoring state files, which happened
to be in functions internal to a single file, so there is no
mixing of the internal flag with a public flags argument.
Additionally, virDomainMemoryStats passed a flags argument
over RPC, but not to the driver.

* src/driver.h (VIR_DOMAIN_XML_FLAGS_MASK)
(VIR_SECRET_GET_VALUE_FLAGS_MASK): Delete.
(virDrvSecretGetValue): Separate out internal flags.
(virDrvDomainMemoryStats): Provide missing flags argument.
* src/driver.c (verify): Drop unused check.
* src/conf/domain_conf.h (virDomainObjParseFile): Delete
declaration.
(virDomainXMLInternalFlags): Move...
* src/conf/domain_conf.c: ...here.  Delete redundant include.
(virDomainObjParseFile): Make static.
* src/libvirt.c (virDomainGetXMLDesc, virSecretGetValue): Update
clients.
(virDomainMemoryPeek, virInterfaceGetXMLDesc)
(virDomainMemoryStats, virDomainBlockPeek, virNetworkGetXMLDesc)
(virStoragePoolGetXMLDesc, virStorageVolGetXMLDesc)
(virNodeNumOfDevices, virNodeListDevices, virNWFilterGetXMLDesc):
Don't mask unknown flags.
* src/interface/netcf_driver.c (interfaceGetXMLDesc): Reject
unknown flags.
* src/secret/secret_driver.c (secretGetValue): Update clients.
* src/remote/remote_driver.c (remoteSecretGetValue)
(remoteDomainMemoryStats): Likewise.
* src/qemu/qemu_process.c (qemuProcessGetVolumeQcowPassphrase):
Likewise.
* src/qemu/qemu_driver.c (qemudDomainMemoryStats): Likewise.
* daemon/remote.c (remoteDispatchDomainMemoryStats): Likewise.
This commit is contained in:
Eric Blake 2011-07-13 15:31:56 -06:00
parent 6f669d4ea5
commit 33ba6e6881
11 changed files with 47 additions and 81 deletions

View File

@ -810,7 +810,7 @@ remoteDispatchDomainMemoryStats(virNetServerPtr server ATTRIBUTE_UNUSED,
goto cleanup; goto cleanup;
} }
nr_stats = virDomainMemoryStats(dom, stats, args->maxStats, 0); nr_stats = virDomainMemoryStats(dom, stats, args->maxStats, args->flags);
if (nr_stats < 0) if (nr_stats < 0)
goto cleanup; goto cleanup;

View File

@ -48,7 +48,6 @@
#include "storage_file.h" #include "storage_file.h"
#include "files.h" #include "files.h"
#include "bitmap.h" #include "bitmap.h"
#include "verify.h"
#include "count-one-bits.h" #include "count-one-bits.h"
#define VIR_FROM_THIS VIR_FROM_DOMAIN #define VIR_FROM_THIS VIR_FROM_DOMAIN
@ -57,6 +56,12 @@
* verify that it doesn't overflow an unsigned int when shifting */ * verify that it doesn't overflow an unsigned int when shifting */
verify(VIR_DOMAIN_VIRT_LAST <= 32); verify(VIR_DOMAIN_VIRT_LAST <= 32);
/* Private flag used internally by virDomainSaveStatus and
* virDomainObjParseFile. */
typedef enum {
VIR_DOMAIN_XML_INTERNAL_STATUS = (1<<16), /* dump internal domain status information */
} virDomainXMLInternalFlags;
VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST, VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST,
"custom-argv", "custom-argv",
"custom-monitor", "custom-monitor",
@ -6995,10 +7000,11 @@ cleanup:
} }
virDomainObjPtr virDomainObjParseFile(virCapsPtr caps, static virDomainObjPtr
const char *filename, virDomainObjParseFile(virCapsPtr caps,
unsigned int expectedVirtTypes, const char *filename,
unsigned int flags) unsigned int expectedVirtTypes,
unsigned int flags)
{ {
xmlDocPtr xml; xmlDocPtr xml;
virDomainObjPtr obj = NULL; virDomainObjPtr obj = NULL;

View File

@ -41,11 +41,6 @@
# include "macvtap.h" # include "macvtap.h"
# include "sysinfo.h" # include "sysinfo.h"
/* Private component of virDomainXMLFlags */
typedef enum {
VIR_DOMAIN_XML_INTERNAL_STATUS = (1<<16), /* dump internal domain status information */
} virDomainXMLInternalFlags;
/* Different types of hypervisor */ /* Different types of hypervisor */
/* NB: Keep in sync with virDomainVirtTypeToString impl */ /* NB: Keep in sync with virDomainVirtTypeToString impl */
enum virDomainVirtType { enum virDomainVirtType {
@ -1417,11 +1412,6 @@ virDomainDefPtr virDomainDefParseNode(virCapsPtr caps,
unsigned int expectedVirtTypes, unsigned int expectedVirtTypes,
unsigned int flags); unsigned int flags);
virDomainObjPtr virDomainObjParseFile(virCapsPtr caps,
const char *filename,
unsigned int expectedVirtTypes,
unsigned int flags);
bool virDomainDefCheckABIStability(virDomainDefPtr src, bool virDomainDefCheckABIStability(virDomainDefPtr src,
virDomainDefPtr dst); virDomainDefPtr dst);

View File

@ -32,10 +32,6 @@
#define DEFAULT_DRIVER_DIR LIBDIR "/libvirt/connection-driver" #define DEFAULT_DRIVER_DIR LIBDIR "/libvirt/connection-driver"
/* Make sure ... INTERNAL_CALL cannot be set by the caller */
verify((VIR_SECRET_GET_VALUE_INTERNAL_CALL &
VIR_SECRET_GET_VALUE_FLAGS_MASK) == 0);
#ifdef WITH_DRIVER_MODULES #ifdef WITH_DRIVER_MODULES
/* XXX re-implment this for other OS, or use libtools helper lib ? */ /* XXX re-implment this for other OS, or use libtools helper lib ? */

View File

@ -191,7 +191,7 @@ typedef char *
unsigned int flags); unsigned int flags);
typedef char * typedef char *
(*virDrvDomainGetXMLDesc) (virDomainPtr dom, (*virDrvDomainGetXMLDesc) (virDomainPtr dom,
unsigned int flags); unsigned int flags);
typedef char * typedef char *
(*virDrvConnectDomainXMLFromNative) (virConnectPtr conn, (*virDrvConnectDomainXMLFromNative) (virConnectPtr conn,
const char *nativeFormat, const char *nativeFormat,
@ -331,7 +331,8 @@ typedef int
(*virDrvDomainMemoryStats) (*virDrvDomainMemoryStats)
(virDomainPtr domain, (virDomainPtr domain,
struct _virDomainMemoryStat *stats, struct _virDomainMemoryStat *stats,
unsigned int nr_stats); unsigned int nr_stats,
unsigned int flags);
typedef int typedef int
(*virDrvDomainBlockPeek) (*virDrvDomainBlockPeek)
@ -1229,16 +1230,10 @@ struct _virDeviceMonitor {
virDrvNodeDeviceDestroy deviceDestroy; virDrvNodeDeviceDestroy deviceDestroy;
}; };
/* bits 16 and above of virDomainXMLFlags are for internal use */
# define VIR_DOMAIN_XML_FLAGS_MASK 0xffff
/* Bits 16 and above of virSecretGetValue flags are for internal use */
# define VIR_SECRET_GET_VALUE_FLAGS_MASK 0xffff
enum { enum {
/* This getValue call is inside libvirt, override the "private" flag. /* This getValue call is inside libvirt, override the "private" flag.
This flag cannot be set by outside callers. */ This flag cannot be set by outside callers. */
VIR_SECRET_GET_VALUE_INTERNAL_CALL = 1 << 16 VIR_SECRET_GET_VALUE_INTERNAL_CALL = 1 << 0,
}; };
typedef virSecretPtr typedef virSecretPtr
@ -1263,7 +1258,8 @@ typedef int
typedef unsigned char * typedef unsigned char *
(*virDrvSecretGetValue) (virSecretPtr secret, (*virDrvSecretGetValue) (virSecretPtr secret,
size_t *value_size, size_t *value_size,
unsigned int flags); unsigned int flags,
unsigned int internalFlags);
typedef int typedef int
(*virDrvSecretUndefine) (virSecretPtr secret); (*virDrvSecretUndefine) (virSecretPtr secret);
typedef int typedef int

View File

@ -344,6 +344,8 @@ static char *interfaceGetXMLDesc(virInterfacePtr ifinfo,
virInterfaceDefPtr ifacedef = NULL; virInterfaceDefPtr ifacedef = NULL;
char *ret = NULL; char *ret = NULL;
virCheckFlags(VIR_INTERFACE_XML_INACTIVE, NULL);
interfaceDriverLock(driver); interfaceDriverLock(driver);
iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo); iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo);

View File

@ -3381,8 +3381,6 @@ virDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
goto error; goto error;
} }
flags &= VIR_DOMAIN_XML_FLAGS_MASK;
if (conn->driver->domainGetXMLDesc) { if (conn->driver->domainGetXMLDesc) {
char *ret; char *ret;
ret = conn->driver->domainGetXMLDesc(domain, flags); ret = conn->driver->domainGetXMLDesc(domain, flags);
@ -6040,11 +6038,6 @@ int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats,
virDispatchError(NULL); virDispatchError(NULL);
return -1; return -1;
} }
if (flags != 0) {
virLibDomainError(VIR_ERR_INVALID_ARG,
_("flags must be zero"));
goto error;
}
if (!stats || nr_stats == 0) if (!stats || nr_stats == 0)
return 0; return 0;
@ -6054,7 +6047,8 @@ int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats,
conn = dom->conn; conn = dom->conn;
if (conn->driver->domainMemoryStats) { if (conn->driver->domainMemoryStats) {
nr_stats_ret = conn->driver->domainMemoryStats (dom, stats, nr_stats); nr_stats_ret = conn->driver->domainMemoryStats (dom, stats, nr_stats,
flags);
if (nr_stats_ret == -1) if (nr_stats_ret == -1)
goto error; goto error;
return nr_stats_ret; return nr_stats_ret;
@ -6139,12 +6133,6 @@ virDomainBlockPeek (virDomainPtr dom,
goto error; goto error;
} }
if (flags != 0) {
virLibDomainError(VIR_ERR_INVALID_ARG,
_("flags must be zero"));
goto error;
}
/* Allow size == 0 as an access test. */ /* Allow size == 0 as an access test. */
if (size > 0 && !buffer) { if (size > 0 && !buffer) {
virLibDomainError(VIR_ERR_INVALID_ARG, virLibDomainError(VIR_ERR_INVALID_ARG,
@ -6248,9 +6236,10 @@ virDomainMemoryPeek (virDomainPtr dom,
* because of incompatible licensing. * because of incompatible licensing.
*/ */
if (flags != VIR_MEMORY_VIRTUAL && flags != VIR_MEMORY_PHYSICAL) { /* Exactly one of these two flags must be set. */
if (!(flags & VIR_MEMORY_VIRTUAL) == !(flags & VIR_MEMORY_PHYSICAL)) {
virLibDomainError(VIR_ERR_INVALID_ARG, virLibDomainError(VIR_ERR_INVALID_ARG,
_("flags parameter must be VIR_MEMORY_VIRTUAL or VIR_MEMORY_PHYSICAL")); _("flags parameter must include VIR_MEMORY_VIRTUAL or VIR_MEMORY_PHYSICAL"));
goto error; goto error;
} }
@ -8474,10 +8463,6 @@ virNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags)
virDispatchError(NULL); virDispatchError(NULL);
return NULL; return NULL;
} }
if (flags != 0) {
virLibNetworkError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
conn = network->conn; conn = network->conn;
@ -8987,10 +8972,6 @@ virInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags)
virDispatchError(NULL); virDispatchError(NULL);
return NULL; return NULL;
} }
if ((flags & ~VIR_INTERFACE_XML_INACTIVE) != 0) {
virLibInterfaceError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
conn = iface->conn; conn = iface->conn;
@ -10460,10 +10441,6 @@ virStoragePoolGetXMLDesc(virStoragePoolPtr pool,
virDispatchError(NULL); virDispatchError(NULL);
return NULL; return NULL;
} }
if (flags != 0) {
virLibStoragePoolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
conn = pool->conn; conn = pool->conn;
@ -11358,10 +11335,6 @@ virStorageVolGetXMLDesc(virStorageVolPtr vol,
virDispatchError(NULL); virDispatchError(NULL);
return NULL; return NULL;
} }
if (flags != 0) {
virLibStorageVolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
conn = vol->conn; conn = vol->conn;
@ -11450,10 +11423,6 @@ virNodeNumOfDevices(virConnectPtr conn, const char *cap, unsigned int flags)
virDispatchError(NULL); virDispatchError(NULL);
return -1; return -1;
} }
if (flags != 0) {
virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
if (conn->deviceMonitor && conn->deviceMonitor->numOfDevices) { if (conn->deviceMonitor && conn->deviceMonitor->numOfDevices) {
int ret; int ret;
@ -11502,7 +11471,7 @@ virNodeListDevices(virConnectPtr conn,
virDispatchError(NULL); virDispatchError(NULL);
return -1; return -1;
} }
if ((flags != 0) || (names == NULL) || (maxnames < 0)) { if ((names == NULL) || (maxnames < 0)) {
virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error; goto error;
} }
@ -12708,12 +12677,10 @@ virSecretGetValue(virSecretPtr secret, size_t *value_size, unsigned int flags)
goto error; goto error;
} }
flags &= VIR_SECRET_GET_VALUE_FLAGS_MASK;
if (conn->secretDriver != NULL && conn->secretDriver->getValue != NULL) { if (conn->secretDriver != NULL && conn->secretDriver->getValue != NULL) {
unsigned char *ret; unsigned char *ret;
ret = conn->secretDriver->getValue(secret, value_size, flags); ret = conn->secretDriver->getValue(secret, value_size, flags, 0);
if (ret == NULL) if (ret == NULL)
goto error; goto error;
return ret; return ret;
@ -14242,10 +14209,6 @@ virNWFilterGetXMLDesc(virNWFilterPtr nwfilter, unsigned int flags)
virDispatchError(NULL); virDispatchError(NULL);
return NULL; return NULL;
} }
if (flags != 0) {
virLibNWFilterError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
conn = nwfilter->conn; conn = nwfilter->conn;

View File

@ -6166,12 +6166,15 @@ qemudDomainInterfaceStats (virDomainPtr dom,
static int static int
qemudDomainMemoryStats (virDomainPtr dom, qemudDomainMemoryStats (virDomainPtr dom,
struct _virDomainMemoryStat *stats, struct _virDomainMemoryStat *stats,
unsigned int nr_stats) unsigned int nr_stats,
unsigned int flags)
{ {
struct qemud_driver *driver = dom->conn->privateData; struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm; virDomainObjPtr vm;
unsigned int ret = -1; unsigned int ret = -1;
virCheckFlags(0, -1);
qemuDriverLock(driver); qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid); vm = virDomainFindByUUID(&driver->domains, dom->uuid);
qemuDriverUnlock(driver); qemuDriverUnlock(driver);

View File

@ -276,7 +276,7 @@ qemuProcessGetVolumeQcowPassphrase(virConnectPtr conn,
enc->secrets[0]->uuid); enc->secrets[0]->uuid);
if (secret == NULL) if (secret == NULL)
goto cleanup; goto cleanup;
data = conn->secretDriver->getValue(secret, &size, data = conn->secretDriver->getValue(secret, &size, 0,
VIR_SECRET_GET_VALUE_INTERNAL_CALL); VIR_SECRET_GET_VALUE_INTERNAL_CALL);
virUnrefSecret(secret); virUnrefSecret(secret);
if (data == NULL) if (data == NULL)

View File

@ -1850,7 +1850,8 @@ done:
static int static int
remoteDomainMemoryStats (virDomainPtr domain, remoteDomainMemoryStats (virDomainPtr domain,
struct _virDomainMemoryStat *stats, struct _virDomainMemoryStat *stats,
unsigned int nr_stats) unsigned int nr_stats,
unsigned int flags)
{ {
int rv = -1; int rv = -1;
remote_domain_memory_stats_args args; remote_domain_memory_stats_args args;
@ -1868,7 +1869,7 @@ remoteDomainMemoryStats (virDomainPtr domain,
goto done; goto done;
} }
args.maxStats = nr_stats; args.maxStats = nr_stats;
args.flags = 0; args.flags = flags;
memset (&ret, 0, sizeof ret); memset (&ret, 0, sizeof ret);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MEMORY_STATS, if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MEMORY_STATS,
@ -3173,7 +3174,7 @@ remoteSecretClose (virConnectPtr conn)
static unsigned char * static unsigned char *
remoteSecretGetValue (virSecretPtr secret, size_t *value_size, remoteSecretGetValue (virSecretPtr secret, size_t *value_size,
unsigned int flags) unsigned int flags, unsigned int internalFlags)
{ {
unsigned char *rv = NULL; unsigned char *rv = NULL;
remote_secret_get_value_args args; remote_secret_get_value_args args;
@ -3182,6 +3183,12 @@ remoteSecretGetValue (virSecretPtr secret, size_t *value_size,
remoteDriverLock (priv); remoteDriverLock (priv);
/* internalFlags intentionally do not go over the wire */
if (internalFlags) {
remoteError(VIR_ERR_NO_SUPPORT, "%s", _("no internalFlags support"));
goto done;
}
make_nonnull_secret (&args.secret, secret); make_nonnull_secret (&args.secret, secret);
args.flags = flags; args.flags = flags;

View File

@ -873,12 +873,15 @@ cleanup:
} }
static unsigned char * static unsigned char *
secretGetValue(virSecretPtr obj, size_t *value_size, unsigned int flags) secretGetValue(virSecretPtr obj, size_t *value_size, unsigned int flags,
unsigned int internalFlags)
{ {
virSecretDriverStatePtr driver = obj->conn->secretPrivateData; virSecretDriverStatePtr driver = obj->conn->secretPrivateData;
unsigned char *ret = NULL; unsigned char *ret = NULL;
virSecretEntryPtr secret; virSecretEntryPtr secret;
virCheckFlags(0, NULL);
secretDriverLock(driver); secretDriverLock(driver);
secret = secretFindByUUID(driver, obj->uuid); secret = secretFindByUUID(driver, obj->uuid);
@ -898,7 +901,7 @@ secretGetValue(virSecretPtr obj, size_t *value_size, unsigned int flags)
goto cleanup; goto cleanup;
} }
if ((flags & VIR_SECRET_GET_VALUE_INTERNAL_CALL) == 0 && if ((internalFlags & VIR_SECRET_GET_VALUE_INTERNAL_CALL) == 0 &&
secret->def->private) { secret->def->private) {
virSecretReportError(VIR_ERR_OPERATION_DENIED, "%s", virSecretReportError(VIR_ERR_OPERATION_DENIED, "%s",
_("secret is private")); _("secret is private"));