From fa9b8b046f89b2af00229075b37450dca5bcdfd6 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 2 May 2013 11:26:40 +0100 Subject: [PATCH] Convert Xen domain core dump driver methods to use virDomainDefPtr Introduce use of a virDomainDefPtr in the domain coredump 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 --- src/xen/xen_driver.c | 14 +++++++++++++- src/xen/xend_internal.c | 12 +++++++----- src/xen/xend_internal.h | 4 +++- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 3a5db55e91..2fda634f21 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1191,7 +1191,19 @@ xenUnifiedDomainRestore(virConnectPtr conn, const char *from) static int xenUnifiedDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) { - return xenDaemonDomainCoreDump(dom, to, flags); + virDomainDefPtr def = NULL; + int ret = -1; + + virCheckFlags(0, -1); + + if (!(def = xenGetDomainDefForDom(dom))) + goto cleanup; + + ret = xenDaemonDomainCoreDump(dom->conn, def, to, flags); + +cleanup: + virDomainDefFree(def); + return ret; } static int diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index bd5a43417d..2b1ba61fcf 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -1446,7 +1446,8 @@ xenDaemonDomainSave(virConnectPtr conn, /** * xenDaemonDomainCoreDump: - * @domain: pointer to the Domain block + * @conn: the connection object + * @def: domain configuration * @filename: path for the output file * @flags: extra flags, currently unused * @@ -1457,19 +1458,20 @@ xenDaemonDomainSave(virConnectPtr conn, * Returns 0 in case of success, -1 in case of error. */ int -xenDaemonDomainCoreDump(virDomainPtr domain, +xenDaemonDomainCoreDump(virConnectPtr conn, + virDomainDefPtr def, const char *filename, unsigned int flags) { virCheckFlags(VIR_DUMP_LIVE | VIR_DUMP_CRASH, -1); - if (domain->id < 0) { + if (def->id < 0) { virReportError(VIR_ERR_OPERATION_INVALID, - _("Domain %s isn't running."), domain->name); + _("Domain %s isn't running."), def->name); return -1; } - return xend_op(domain->conn, domain->name, + return xend_op(conn, def->name, "op", "dump", "file", filename, "live", (flags & VIR_DUMP_LIVE ? "1" : "0"), "crash", (flags & VIR_DUMP_CRASH ? "1" : "0"), diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h index cb9898bf7a..814330d951 100644 --- a/src/xen/xend_internal.h +++ b/src/xen/xend_internal.h @@ -102,7 +102,9 @@ int xenDaemonDomainDestroy(virConnectPtr conn, virDomainDefPtr def); int xenDaemonDomainSave(virConnectPtr conn, virDomainDefPtr def, const char *filename); -int xenDaemonDomainCoreDump(virDomainPtr domain, const char *filename, +int xenDaemonDomainCoreDump(virConnectPtr conn, + virDomainDefPtr def, + const char *filename, unsigned int flags); int xenDaemonDomainRestore(virConnectPtr conn, const char *filename); int xenDaemonDomainSetMemory(virConnectPtr conn,