[libvirt] [PATCH 04/11] Convert Xen domain managed save driver methods to use virDomainDefPtr

Jim Fehlig jfehlig at suse.com
Thu May 9 21:33:42 UTC 2013


Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Introduce use of a virDomainDefPtr in the domain save
> 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 at redhat.com>
> ---
>  src/xen/xen_driver.c    | 72 ++++++++++++++++++++++++++++++++++++-------------
>  src/xen/xend_internal.c | 23 +++++++++-------
>  src/xen/xend_internal.h |  7 +++--
>  src/xen/xm_internal.c   | 25 ++++++++---------
>  src/xen/xm_internal.h   |  3 ++-
>  5 files changed, 86 insertions(+), 44 deletions(-)
>
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 68a86b7..89b038c 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1038,14 +1038,25 @@ static int
>  xenUnifiedDomainSaveFlags(virDomainPtr dom, const char *to, const char *dxml,
>                            unsigned int flags)
>  {
> +    int ret = -1;
> +    virDomainDefPtr def;
> +
>      virCheckFlags(0, -1);
> +
>      if (dxml) {
>          virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
>                         _("xml modification unsupported"));
>          return -1;
>      }
>  
> -    return xenDaemonDomainSave(dom, to);
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
> +    ret = xenDaemonDomainSave(dom->conn, def, to);
> +
> +cleanup:
> +    virDomainDefFree(def);
> +    return ret;
>  }
>  
>  static int
> @@ -1055,11 +1066,12 @@ xenUnifiedDomainSave(virDomainPtr dom, const char *to)
>  }
>  
>  static char *
> -xenUnifiedDomainManagedSavePath(xenUnifiedPrivatePtr priv, virDomainPtr dom)
> +xenUnifiedDomainManagedSavePath(xenUnifiedPrivatePtr priv,
> +                                virDomainDefPtr def)
>   

This still fits on one line.

>  {
>      char *ret;
>  
> -    if (virAsprintf(&ret, "%s/%s.save", priv->saveDir, dom->name) < 0) {
> +    if (virAsprintf(&ret, "%s/%s.save", priv->saveDir, def->name) < 0) {
>          virReportOOMError();
>          return NULL;
>      }
> @@ -1072,19 +1084,23 @@ static int
>  xenUnifiedDomainManagedSave(virDomainPtr dom, unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> -    char *name;
> +    char *name = NULL;
> +    virDomainDefPtr def = NULL;
>      int ret = -1;
>  
>      virCheckFlags(0, -1);
>  
> -    name = xenUnifiedDomainManagedSavePath(priv, dom);
> -    if (!name)
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
> +    if (!(name = xenUnifiedDomainManagedSavePath(priv, def)))
>          goto cleanup;
>  
> -    ret = xenDaemonDomainSave(dom, name);
> +    ret = xenDaemonDomainSave(dom->conn, def, name);
>  
>  cleanup:
>      VIR_FREE(name);
> +    virDomainDefFree(def);
>      return ret;
>  }
>  
> @@ -1092,17 +1108,23 @@ static int
>  xenUnifiedDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> -    char *name;
> +    char *name = NULL;
> +    virDomainDefPtr def = NULL;
>      int ret = -1;
>  
>      virCheckFlags(0, -1);
>  
> -    name = xenUnifiedDomainManagedSavePath(priv, dom);
> -    if (!name)
> -        return ret;
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
> +    if (!(name = xenUnifiedDomainManagedSavePath(priv, def)))
> +        goto cleanup;
>  
>      ret = virFileExists(name);
> +
> +cleanup:
>      VIR_FREE(name);
> +    virDomainDefFree(def);
>      return ret;
>  }
>  
> @@ -1110,16 +1132,21 @@ static int
>  xenUnifiedDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> -    char *name;
> +    char *name = NULL;
> +    virDomainDefPtr def = NULL;
>      int ret = -1;
>  
>      virCheckFlags(0, -1);
>  
> -    name = xenUnifiedDomainManagedSavePath(priv, dom);
> -    if (!name)
> -        return ret;
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
> +    if (!(name = xenUnifiedDomainManagedSavePath(priv, def)))
> +        goto cleanup;
>  
>      ret = unlink(name);
> +
> +cleanup:
>      VIR_FREE(name);
>      return ret;
>  }
> @@ -1496,12 +1523,15 @@ xenUnifiedDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
>      int ret = -1;
> +    virDomainDefPtr def = NULL;
>      char *name = NULL;
>  
>      virCheckFlags(0, -1);
>  
> -    name = xenUnifiedDomainManagedSavePath(priv, dom);
> -    if (!name)
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
> +    if (!(name = xenUnifiedDomainManagedSavePath(priv, def)))
>          goto cleanup;
>  
>      if (virFileExists(name)) {
> @@ -1512,11 +1542,15 @@ xenUnifiedDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
>      }
>  
>      if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> -        ret = xenXMDomainCreate(dom);
> +        ret = xenXMDomainCreate(dom->conn, def);
>      else
> -        ret = xenDaemonDomainCreate(dom);
> +        ret = xenDaemonDomainCreate(dom->conn, def);
> +
> +    if (ret >= 0)
> +        dom->id = def->id;
>  
>  cleanup:
> +    virDomainDefFree(def);
>      VIR_FREE(name);
>      return ret;
>  }
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index c10567c..9555b33 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -1413,22 +1413,24 @@ xenDaemonDomainGetOSType(virConnectPtr conn,
>   * Returns 0 in case of success, -1 (with errno) in case of error.
>   */
>  int
> -xenDaemonDomainSave(virDomainPtr domain, const char *filename)
> +xenDaemonDomainSave(virConnectPtr conn,
> +                    virDomainDefPtr def,
> +                    const char *filename)
>  {
> -    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;
>      }
>  
>      /* We can't save the state of Domain-0, that would mean stopping it too */
> -    if (domain->id == 0) {
> +    if (def->id == 0) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("Cannot save host domain"));
>          return -1;
>      }
>  
> -    return xend_op(domain->conn, domain->name, "op", "save", "file", filename, NULL);
> +    return xend_op(conn, def->name, "op", "save", "file", filename, NULL);
>  }
>  
>  /**
> @@ -2862,17 +2864,18 @@ xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc)
>      return NULL;
>  }
>  int
> -xenDaemonDomainCreate(virDomainPtr domain)
> +xenDaemonDomainCreate(virConnectPtr conn,
> +                      virDomainDefPtr def)
>   

Fits on one line.

>  {
>      int ret;
>  
> -    ret = xend_op(domain->conn, domain->name, "op", "start", NULL);
> +    ret = xend_op(conn, def->name, "op", "start", NULL);
>  
>      if (ret == 0) {
> -        int id = xenDaemonDomainLookupByName_ids(domain->conn, domain->name,
> -                                                 domain->uuid);
> +        int id = xenDaemonDomainLookupByName_ids(conn, def->name,
> +                                                 def->uuid);
>   

Fits on one line now.

>          if (id > 0)
> -            domain->id = id;
> +            def->id = id;
>      }
>  
>      return ret;
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index 87e0a0f..01d321f 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -92,7 +92,9 @@ int xenDaemonDomainResume(virConnectPtr conn, virDomainDefPtr def);
>  int xenDaemonDomainShutdown(virConnectPtr conn, virDomainDefPtr def);
>  int xenDaemonDomainReboot(virConnectPtr conn, virDomainDefPtr def);
>  int xenDaemonDomainDestroy(virConnectPtr conn, virDomainDefPtr def);
> -int xenDaemonDomainSave(virDomainPtr domain, const char *filename);
> +int xenDaemonDomainSave(virConnectPtr conn,
> +                        virDomainDefPtr def,
> +                        const char *filename);
>  int xenDaemonDomainCoreDump(virDomainPtr domain, const char *filename,
>                              unsigned int flags);
>  int xenDaemonDomainRestore(virConnectPtr conn, const char *filename);
> @@ -131,7 +133,8 @@ int xenDaemonDetachDeviceFlags(virDomainPtr domain,
>                                 unsigned int flags);
>  
>  virDomainPtr xenDaemonDomainDefineXML(virConnectPtr xend, const char *sexpr);
> -int xenDaemonDomainCreate(virDomainPtr domain);
> +int xenDaemonDomainCreate(virConnectPtr conn,
> +                          virDomainDefPtr def);
>   

Still fits on one line.

>  int xenDaemonDomainUndefine(virDomainPtr domain);
>  
>  int	xenDaemonDomainSetVcpus		(virDomainPtr domain,
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index ce44e39..6c884d9 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -893,48 +893,49 @@ cleanup:
>   * Start a domain from an existing defined config file
>   */
>  int
> -xenXMDomainCreate(virDomainPtr domain)
> +xenXMDomainCreate(virConnectPtr conn,
> +                  virDomainDefPtr def)
>   

And again.

>  {
>      char *sexpr;
>      int ret = -1;
> -    xenUnifiedPrivatePtr priv= domain->conn->privateData;
> +    xenUnifiedPrivatePtr priv = conn->privateData;
>      const char *filename;
>      xenXMConfCachePtr entry = NULL;
>  
>      xenUnifiedLock(priv);
>  
> -    if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
> +    if (!(filename = virHashLookup(priv->nameConfigMap, def->name)))
>          goto error;
>  
>      if (!(entry = virHashLookup(priv->configCache, filename)))
>          goto error;
>  
> -    if (!(sexpr = xenFormatSxpr(domain->conn, entry->def, priv->xendConfigVersion)))
> +    if (!(sexpr = xenFormatSxpr(conn, entry->def, priv->xendConfigVersion)))
>          goto error;
>  
> -    ret = xenDaemonDomainCreateXML(domain->conn, sexpr);
> +    ret = xenDaemonDomainCreateXML(conn, sexpr);
>      VIR_FREE(sexpr);
>      if (ret != 0)
>          goto error;
>  
> -    if ((ret = xenDaemonDomainLookupByName_ids(domain->conn, domain->name,
> +    if ((ret = xenDaemonDomainLookupByName_ids(conn, def->name,
>                                                 entry->def->uuid)) < 0)
>          goto error;
> -    domain->id = ret;
> +    def->id = ret;
>  
> -    if (xend_wait_for_devices(domain->conn, domain->name) < 0)
> +    if (xend_wait_for_devices(conn, def->name) < 0)
>          goto error;
>  
> -    if (xenDaemonDomainResume(domain->conn, entry->def) < 0)
> +    if (xenDaemonDomainResume(conn, entry->def) < 0)
>          goto error;
>  
>      xenUnifiedUnlock(priv);
>      return 0;
>  
>   error:
> -    if (domain->id != -1 && entry) {
> -        xenDaemonDomainDestroy(domain->conn, entry->def);
> -        domain->id = -1;
> +    if (def->id != -1 && entry) {
> +        xenDaemonDomainDestroy(conn, entry->def);
> +        def->id = -1;
>      }
>      xenUnifiedUnlock(priv);
>      return -1;
> diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
> index 0ae32bc..0521625 100644
> --- a/src/xen/xm_internal.h
> +++ b/src/xen/xm_internal.h
> @@ -65,7 +65,8 @@ virDomainDefPtr xenXMDomainLookupByUUID(virConnectPtr conn, const unsigned char
>  int xenXMListDefinedDomains(virConnectPtr conn, char ** const names, int maxnames);
>  int xenXMNumOfDefinedDomains(virConnectPtr conn);
>  
> -int xenXMDomainCreate(virDomainPtr domain);
> +int xenXMDomainCreate(virConnectPtr conn,
> +                      virDomainDefPtr def);
>   

Fits on one line.

No issues found testing this patch. ACK.

Regards,
Jim

>  virDomainPtr xenXMDomainDefineXML(virConnectPtr con, const char *xml);
>  int xenXMDomainUndefine(virDomainPtr domain);
>  
>   




More information about the libvir-list mailing list