]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix handling of OOM when getting Xen dom ID
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 25 Sep 2013 08:31:30 +0000 (09:31 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 25 Sep 2013 17:12:08 +0000 (18:12 +0100)
The methods for obtaining the Xen dom ID cannot distinguish
between returning -1 due to an error and returning -1 due to
the domain being shutoff. Change them to return the dom ID
via an output parameter.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/xen/xen_driver.c
src/xen/xend_internal.c
src/xenxs/xen_sxpr.c
src/xenxs/xen_sxpr.h
tests/sexpr2xmltest.c

index 6cb4f4fc31800e316671dd55946c660ec0c7ccd9..40b98ee59161f37edcb2f84ff4a830cf9aeb802a 100644 (file)
@@ -1604,7 +1604,8 @@ xenUnifiedConnectDomainXMLFromNative(virConnectPtr conn,
 
         def = xenParseXM(conf, priv->xendConfigVersion, priv->caps);
     } else if (STREQ(format, XEN_CONFIG_FORMAT_SEXPR)) {
-        id = xenGetDomIdFromSxprString(config, priv->xendConfigVersion);
+        if (xenGetDomIdFromSxprString(config, priv->xendConfigVersion, &id) < 0)
+            goto cleanup;
         xenUnifiedLock(priv);
         tty = xenStoreDomainGetConsolePath(conn, id);
         vncport = xenStoreDomainGetVNCPort(conn, id);
index f698c8de78468f5bf3c2955bd2bd725449feb7f8..dc57350e2507440bc7ea1514a09347e74aa2a058 100644 (file)
@@ -1561,7 +1561,7 @@ xenDaemonDomainFetch(virConnectPtr conn, int domid, const char *name,
 {
     struct sexpr *root;
     xenUnifiedPrivatePtr priv = conn->privateData;
-    virDomainDefPtr def;
+    virDomainDefPtr def = NULL;
     int id;
     char * tty;
     int vncport;
@@ -1573,7 +1573,8 @@ xenDaemonDomainFetch(virConnectPtr conn, int domid, const char *name,
     if (root == NULL)
         return NULL;
 
-    id = xenGetDomIdFromSxpr(root, priv->xendConfigVersion);
+    if (xenGetDomIdFromSxpr(root, priv->xendConfigVersion, &id) < 0)
+        goto cleanup;
     xenUnifiedLock(priv);
     if (sexpr_lookup(root, "domain/image/hvm"))
         tty = xenStoreDomainGetSerialConsolePath(conn, id);
@@ -3224,7 +3225,7 @@ xenDaemonDomainBlockPeek(virConnectPtr conn,
     xenUnifiedPrivatePtr priv = conn->privateData;
     struct sexpr *root = NULL;
     int fd = -1, ret = -1;
-    virDomainDefPtr def;
+    virDomainDefPtr def = NULL;
     int id;
     char * tty;
     int vncport;
@@ -3249,7 +3250,8 @@ xenDaemonDomainBlockPeek(virConnectPtr conn,
         return -1;
     }
 
-    id = xenGetDomIdFromSxpr(root, priv->xendConfigVersion);
+    if (xenGetDomIdFromSxpr(root, priv->xendConfigVersion, &id) < 0)
+        goto cleanup;
     xenUnifiedLock(priv);
     tty = xenStoreDomainGetConsolePath(conn, id);
     vncport = xenStoreDomainGetVNCPort(conn, id);
index 462eac6a99e9aaba7a990a72981a129eaa8d95ca..bb8a335cf53dd30b51f3ddf9985643d49441f8b9 100644 (file)
 #include "virstring.h"
 
 /* Get a domain id from a S-expression string */
-int xenGetDomIdFromSxprString(const char *sexpr, int xendConfigVersion)
+int xenGetDomIdFromSxprString(const char *sexpr, int xendConfigVersion, int *id)
 {
     struct sexpr *root = string2sexpr(sexpr);
+    int ret;
+
+    *id = -1;
 
     if (!root)
         return -1;
 
-    int id = xenGetDomIdFromSxpr(root, xendConfigVersion);
+    ret = xenGetDomIdFromSxpr(root, xendConfigVersion, id);
     sexpr_free(root);
-    return id;
+    return ret;
 }
 
 /* Get a domain id from a S-expression */
-int xenGetDomIdFromSxpr(const struct sexpr *root, int xendConfigVersion)
+int xenGetDomIdFromSxpr(const struct sexpr *root, int xendConfigVersion, int *id)
 {
-    int id = -1;
     const char * tmp = sexpr_node(root, "domain/domid");
     if (tmp == NULL && xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) { /* domid was mandatory */
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        "%s", _("domain information incomplete, missing id"));
+        return -1;
     } else {
-      id = tmp ? sexpr_int(root, "domain/domid") : -1;
+        *id = tmp ? sexpr_int(root, "domain/domid") : -1;
+        return 0;
     }
-    return id;
 }
 
 /*****************************************************************
index d7ce46a3dd8a0f1602f7c9d699ee6be08679bbcd..f354a50db727293f342a8606941e5a4f56b7498b 100644 (file)
@@ -40,8 +40,8 @@ typedef enum {
 } xenConfigVersionEnum;
 
 /* helper functions to get the dom id from a sexpr */
-int xenGetDomIdFromSxprString(const char *sexpr, int xendConfigVersion);
-int xenGetDomIdFromSxpr(const struct sexpr *root, int xendConfigVersion);
+int xenGetDomIdFromSxprString(const char *sexpr, int xendConfigVersion, int *id);
+int xenGetDomIdFromSxpr(const struct sexpr *root, int xendConfigVersion, int *id);
 
 virDomainDefPtr xenParseSxprString(const char *sexpr, int xendConfigVersion,
                                    char *tty, int vncport);
index eafefda0c72646c9af5f94f2d24da9fd24617a2e..b939319a8ebde4b1bd7435fcd299065ba05b030e 100644 (file)
@@ -50,7 +50,8 @@ testCompareFiles(const char *xml, const char *sexpr, int xendConfigVersion)
   if (virMutexInit(&priv.lock) < 0)
       goto fail;
 
-  id = xenGetDomIdFromSxprString(sexprData, xendConfigVersion);
+  if (xenGetDomIdFromSxprString(sexprData, xendConfigVersion, &id) < 0)
+      goto fail;
   xenUnifiedLock(&priv);
   tty = xenStoreDomainGetConsolePath(conn, id);
   vncport = xenStoreDomainGetVNCPort(conn, id);