[libvirt] PATCH: Misc error handling / OOM fixes

Daniel P. Berrange berrange at redhat.com
Mon Mar 30 11:52:48 UTC 2009


I ran the OOM checking test suite again and uncovered a handful of
pretty minor bugs - no crashers in real code - just forgetting to 
report OOM correctly

 * src/datatypes.c: Convert to use the virReportErrorHelper macro
   instead of a static function, so we get correct function/line
   number info
 * src/domain_conf.c: Fix OOM handling in virXPathNodeSet() call
   so it reports OOM error, instead of ignoring
 * src/nodeinfo.c: Use _(...) for error message strings
 * src/xend_internal.c: Add missing check of virBufferError() func
   and report OOM error
 * tests/sexpr2xmltest.c: Reset error object between tests, free
   capabilities object, don't unref a NULL connection object
 * tests/testutils.c: Fix crash in OOM testing if single threaded
 * tests/xml2sexprtest.c: Reset error object between tests

Daniel

Index: src/datatypes.c
===================================================================
RCS file: /data/cvs/libvirt/src/datatypes.c,v
retrieving revision 1.9
diff -u -p -r1.9 datatypes.c
--- src/datatypes.c	29 Jan 2009 12:10:32 -0000	1.9
+++ src/datatypes.c	30 Mar 2009 11:47:05 -0000
@@ -28,31 +28,15 @@
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
+#define virLibConnError(conn, code, fmt...)                       \
+    virReportErrorHelper(conn, VIR_FROM_THIS, code, __FILE__,     \
+                         __FUNCTION__, __LINE__, fmt)
+
 /************************************************************************
  *									*
  *			Domain and Connections allocations		*
  *									*
  ************************************************************************/
-/**
- * virLibConnError:
- * @conn: the connection if available
- * @error: the error number
- * @info: extra information string
- *
- * Handle an error at the connection level
- */
-static void
-virLibConnError(virConnectPtr conn, virErrorNumber error, const char *info)
-{
-    const char *errmsg;
-
-    if (error == VIR_ERR_OK)
-        return;
-
-    errmsg = virErrorMsg(error, info);
-    virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR,
-                  errmsg, info, NULL, 0, 0, errmsg, info);
-}
 
 /**
  * virDomainFreeName:
Index: src/domain_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/domain_conf.c,v
retrieving revision 1.72
diff -u -p -r1.72 domain_conf.c
--- src/domain_conf.c	24 Mar 2009 11:16:29 -0000	1.72
+++ src/domain_conf.c	30 Mar 2009 11:47:05 -0000
@@ -2068,7 +2068,10 @@ static virDomainDefPtr virDomainDefParse
         VIR_FREE(tmp);
     }
 
-    if ((n = virXPathNodeSet(conn, "./features/*", ctxt, &nodes)) > 0) {
+    n = virXPathNodeSet(conn, "./features/*", ctxt, &nodes);
+    if (n < 0)
+        goto error;
+    if (n) {
         for (i = 0 ; i < n ; i++) {
             int val = virDomainFeatureTypeFromString((const char *)nodes[i]->name);
             if (val < 0) {
@@ -2079,8 +2082,8 @@ static virDomainDefPtr virDomainDefParse
             }
             def->features |= (1 << val);
         }
+        VIR_FREE(nodes);
     }
-    VIR_FREE(nodes);
 
     if (virDomainLifecycleParseXML(conn, ctxt, "string(./on_reboot[1])",
                                    &def->onReboot, VIR_DOMAIN_LIFECYCLE_RESTART) < 0)
Index: src/nodeinfo.c
===================================================================
RCS file: /data/cvs/libvirt/src/nodeinfo.c,v
retrieving revision 1.17
diff -u -p -r1.17 nodeinfo.c
--- src/nodeinfo.c	20 Jan 2009 17:13:33 -0000	1.17
+++ src/nodeinfo.c	30 Mar 2009 11:47:05 -0000
@@ -74,8 +74,8 @@ int linuxNodeInfoCPUPopulate(virConnectP
                 buf++;
             if (*buf != ':') {
                 virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
-                                VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
-                                "parsing cpuinfo processor");
+                              VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
+                              "%s", _("parsing cpuinfo processor"));
                 return -1;
             }
             nodeinfo->cpus++;
@@ -87,8 +87,8 @@ int linuxNodeInfoCPUPopulate(virConnectP
                 buf++;
             if (*buf != ':' || !buf[1]) {
                 virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
-                                VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
-                                "parsing cpuinfo cpu MHz");
+                              VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
+                              "%s", _("parsing cpuinfo cpu MHz"));
                 return -1;
             }
             if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0
@@ -103,8 +103,8 @@ int linuxNodeInfoCPUPopulate(virConnectP
                 buf++;
             if (*buf != ':' || !buf[1]) {
                 virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
-                                VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
-                                "parsing cpuinfo cpu cores %c", *buf);
+                              VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
+                              "parsing cpuinfo cpu cores %c", *buf);
                 return -1;
             }
             if (virStrToLong_ui(buf+1, &p, 10, &id) == 0
@@ -116,8 +116,8 @@ int linuxNodeInfoCPUPopulate(virConnectP
 
     if (!nodeinfo->cpus) {
         virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
-                        VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
-                        "no cpus found");
+                      VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
+                      "%s", _("no cpus found"));
         return -1;
     }
 
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.253
diff -u -p -r1.253 xend_internal.c
--- src/xend_internal.c	10 Mar 2009 11:13:32 -0000	1.253
+++ src/xend_internal.c	30 Mar 2009 11:47:06 -0000
@@ -5540,6 +5540,11 @@ xenDaemonFormatSxpr(virConnectPtr conn,
 
     virBufferAddLit(&buf, ")"); /* closes (vm */
 
+    if (virBufferError(&buf)) {
+        virReportOOMError(conn);
+        return NULL;
+    }
+
     return virBufferContentAndReset(&buf);
 
 error:
Index: tests/sexpr2xmltest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/sexpr2xmltest.c,v
retrieving revision 1.36
diff -u -p -r1.36 sexpr2xmltest.c
--- tests/sexpr2xmltest.c	29 Jan 2009 17:02:00 -0000	1.36
+++ tests/sexpr2xmltest.c	30 Mar 2009 11:47:06 -0000
@@ -64,7 +64,8 @@ static int testCompareFiles(const char *
  fail:
   free(gotxml);
   virDomainDefFree(def);
-  virUnrefConnect(conn);
+  if (conn)
+    virUnrefConnect(conn);
 
   return ret;
 }
@@ -115,6 +116,7 @@ mymain(int argc, char **argv)
 #define DO_TEST(in, out, version)                                      \
     do {                                                               \
         struct testInfo info = { in, out, version };                   \
+        virResetLastError();                                           \
         if (virtTestRun("Xen SEXPR-2-XML " in " -> " out,              \
                         1, testCompareHelper, &info) < 0)              \
             ret = -1;                                                  \
@@ -163,6 +165,8 @@ mymain(int argc, char **argv)
     DO_TEST("fv-sound", "fv-sound", 1);
     DO_TEST("fv-sound-all", "fv-sound-all", 1);
 
+    virCapabilitiesFree(caps);
+
     return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }
 
Index: tests/testutils.c
===================================================================
RCS file: /data/cvs/libvirt/tests/testutils.c,v
retrieving revision 1.26
diff -u -p -r1.26 testutils.c
--- tests/testutils.c	2 Feb 2009 20:35:14 -0000	1.26
+++ tests/testutils.c	30 Mar 2009 11:47:06 -0000
@@ -409,7 +435,8 @@ int virtTestMain(int argc,
         /* Run once for each alloc, failing a different one
            and validating that the test case failed */
         for (n = 0; n < approxAlloc && (!mp || worker) ; n++) {
-            if ((n % mp) != (worker - 1))
+            if (mp &&
+                (n % mp) != (worker - 1))
                 continue;
             if (!testDebug) {
                 if (mp)
Index: tests/xml2sexprtest.c
===================================================================
RCS file: /data/cvs/libvirt/tests/xml2sexprtest.c,v
retrieving revision 1.34
diff -u -p -r1.34 xml2sexprtest.c
--- tests/xml2sexprtest.c	23 Jan 2009 01:48:47 -0000	1.34
+++ tests/xml2sexprtest.c	30 Mar 2009 11:47:06 -0000
@@ -95,6 +95,7 @@ mymain(int argc, char **argv)
 #define DO_TEST(in, out, name, version)                                \
     do {                                                               \
         struct testInfo info = { in, out, name, version };             \
+        virResetLastError();                                           \
         if (virtTestRun("Xen XML-2-SEXPR " in " -> " out,              \
                         1, testCompareHelper, &info) < 0)     \
             ret = -1;                                                  \


-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list