Convert Xen domain autostart driver methods to use virDomainDefPtr

Introduce use of a virDomainDefPtr in the domain autostart
APIs to simplify introduction of ACL security checks.
The virDomainPtr cannot be safely used, since the app
may have supplied mis-matching name/uuid/id fields. eg
the name points to domain X, while the uuid points to
domain Y. Resolving the virDomainPtr to a virDomainDefPtr
ensures a consistent name/uuid/id set.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-05-02 11:05:55 +01:00
parent 21213a4b13
commit d305e8691e
5 changed files with 53 additions and 25 deletions

View File

@ -1809,22 +1809,40 @@ static int
xenUnifiedDomainGetAutostart(virDomainPtr dom, int *autostart) xenUnifiedDomainGetAutostart(virDomainPtr dom, int *autostart)
{ {
xenUnifiedPrivatePtr priv = dom->conn->privateData; xenUnifiedPrivatePtr priv = dom->conn->privateData;
virDomainDefPtr def = NULL;
int ret = -1;
if (!(def = xenGetDomainDefForDom(dom)))
goto cleanup;
if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
return xenXMDomainGetAutostart(dom, autostart); ret = xenXMDomainGetAutostart(def, autostart);
else else
return xenDaemonDomainGetAutostart(dom, autostart); ret = xenDaemonDomainGetAutostart(dom->conn, def, autostart);
cleanup:
virDomainDefFree(def);
return ret;
} }
static int static int
xenUnifiedDomainSetAutostart(virDomainPtr dom, int autostart) xenUnifiedDomainSetAutostart(virDomainPtr dom, int autostart)
{ {
xenUnifiedPrivatePtr priv = dom->conn->privateData; xenUnifiedPrivatePtr priv = dom->conn->privateData;
virDomainDefPtr def = NULL;
int ret = -1;
if (!(def = xenGetDomainDefForDom(dom)))
goto cleanup;
if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
return xenXMDomainSetAutostart(dom, autostart); ret = xenXMDomainSetAutostart(def, autostart);
else else
return xenDaemonDomainSetAutostart(dom, autostart); ret = xenDaemonDomainSetAutostart(dom->conn, def, autostart);
cleanup:
virDomainDefFree(def);
return ret;
} }
static char * static char *

View File

@ -2562,12 +2562,14 @@ cleanup:
} }
int int
xenDaemonDomainGetAutostart(virDomainPtr domain, int *autostart) xenDaemonDomainGetAutostart(virConnectPtr conn,
virDomainDefPtr def,
int *autostart)
{ {
struct sexpr *root; struct sexpr *root;
const char *tmp; const char *tmp;
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name); root = sexpr_get(conn, "/xend/domain/%s?detail=1", def->name);
if (root == NULL) { if (root == NULL) {
virReportError(VIR_ERR_XEN_CALL, virReportError(VIR_ERR_XEN_CALL,
"%s", _("xenDaemonGetAutostart failed to find this domain")); "%s", _("xenDaemonGetAutostart failed to find this domain"));
@ -2586,14 +2588,16 @@ xenDaemonDomainGetAutostart(virDomainPtr domain, int *autostart)
} }
int int
xenDaemonDomainSetAutostart(virDomainPtr domain, int autostart) xenDaemonDomainSetAutostart(virConnectPtr conn,
virDomainDefPtr def,
int autostart)
{ {
struct sexpr *root, *autonode; struct sexpr *root, *autonode;
virBuffer buffer = VIR_BUFFER_INITIALIZER; virBuffer buffer = VIR_BUFFER_INITIALIZER;
char *content = NULL; char *content = NULL;
int ret = -1; int ret = -1;
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name); root = sexpr_get(conn, "/xend/domain/%s?detail=1", def->name);
if (root == NULL) { if (root == NULL) {
virReportError(VIR_ERR_XEN_CALL, virReportError(VIR_ERR_XEN_CALL,
"%s", _("xenDaemonSetAutostart failed to find this domain")); "%s", _("xenDaemonSetAutostart failed to find this domain"));
@ -2632,7 +2636,7 @@ xenDaemonDomainSetAutostart(virDomainPtr domain, int autostart)
content = virBufferContentAndReset(&buffer); content = virBufferContentAndReset(&buffer);
if (xend_op(domain->conn, "", "op", "new", "config", content, NULL) != 0) { if (xend_op(conn, "", "op", "new", "config", content, NULL) != 0) {
virReportError(VIR_ERR_XEN_CALL, virReportError(VIR_ERR_XEN_CALL,
"%s", _("Failed to redefine sexpr")); "%s", _("Failed to redefine sexpr"));
goto error; goto error;

View File

@ -174,9 +174,11 @@ int xenDaemonUpdateDeviceFlags(virConnectPtr conn,
virDomainDefPtr def, virDomainDefPtr def,
const char *xml, const char *xml,
unsigned int flags); unsigned int flags);
int xenDaemonDomainGetAutostart (virDomainPtr dom, int xenDaemonDomainGetAutostart(virConnectPtr conn,
virDomainDefPtr def,
int *autostart); int *autostart);
int xenDaemonDomainSetAutostart (virDomainPtr domain, int xenDaemonDomainSetAutostart(virConnectPtr conn,
virDomainDefPtr def,
int autostart); int autostart);
int xenDaemonCreateXML(virConnectPtr conn, virDomainDefPtr def); int xenDaemonCreateXML(virConnectPtr conn, virDomainDefPtr def);

View File

@ -1423,28 +1423,29 @@ xenXMDomainBlockPeek(virDomainPtr dom ATTRIBUTE_UNUSED,
static char * static char *
xenXMAutostartLinkName(virDomainPtr dom) xenXMAutostartLinkName(virDomainDefPtr def)
{ {
char *ret; char *ret;
if (virAsprintf(&ret, "/etc/xen/auto/%s", dom->name) < 0) if (virAsprintf(&ret, "/etc/xen/auto/%s", def->name) < 0)
return NULL; return NULL;
return ret; return ret;
} }
static char * static char *
xenXMDomainConfigName(virDomainPtr dom) xenXMDomainConfigName(virDomainDefPtr def)
{ {
char *ret; char *ret;
if (virAsprintf(&ret, "/etc/xen/%s", dom->name) < 0) if (virAsprintf(&ret, "/etc/xen/%s", def->name) < 0)
return NULL; return NULL;
return ret; return ret;
} }
int int
xenXMDomainGetAutostart(virDomainPtr dom, int *autostart) xenXMDomainGetAutostart(virDomainDefPtr def,
int *autostart)
{ {
char *linkname = xenXMAutostartLinkName(dom); char *linkname = xenXMAutostartLinkName(def);
char *config = xenXMDomainConfigName(dom); char *config = xenXMDomainConfigName(def);
int ret = -1; int ret = -1;
if (!linkname || !config) { if (!linkname || !config) {
@ -1470,10 +1471,11 @@ cleanup:
int int
xenXMDomainSetAutostart(virDomainPtr dom, int autostart) xenXMDomainSetAutostart(virDomainDefPtr def,
int autostart)
{ {
char *linkname = xenXMAutostartLinkName(dom); char *linkname = xenXMAutostartLinkName(def);
char *config = xenXMDomainConfigName(dom); char *config = xenXMDomainConfigName(def);
int ret = -1; int ret = -1;
if (!linkname || !config) { if (!linkname || !config) {

View File

@ -82,8 +82,10 @@ int xenXMDomainUndefine(virConnectPtr conn, virDomainDefPtr def);
int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer); int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer);
int xenXMDomainGetAutostart(virDomainPtr dom, int *autostart); int xenXMDomainGetAutostart(virDomainDefPtr def,
int xenXMDomainSetAutostart(virDomainPtr dom, int autostart); int *autostart);
int xenXMDomainSetAutostart(virDomainDefPtr def,
int autostart);
int xenXMDomainAttachDeviceFlags(virConnectPtr conn, int xenXMDomainAttachDeviceFlags(virConnectPtr conn,
virDomainDefPtr def, virDomainDefPtr def,