[libvirt] [PATCH] Fix misc OOM bugs

Daniel P. Berrange berrange at redhat.com
Wed Sep 2 14:11:53 UTC 2009


* tests/testutils.c: Run test function twice, once to prime it for
  static allocations, once to count the non-static allocations.
* tests/testutilsqemu.c: Initialize variable correctl
* src/capabilities.c: Don't free machines variable upon failure
  since caller must do that
* src/xm_internal.c: Add missing check for OOM in building VIF
  config param
---
 src/capabilities.c    |   17 +++++++++--------
 src/xm_internal.c     |    3 +++
 tests/testutils.c     |   12 ++++++++----
 tests/testutilsqemu.c |    2 +-
 4 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/src/capabilities.c b/src/capabilities.c
index 193a9fe..289180d 100644
--- a/src/capabilities.c
+++ b/src/capabilities.c
@@ -354,10 +354,6 @@ virCapabilitiesAddGuest(virCapsPtr caps,
     if (loader &&
         (guest->arch.defaultInfo.loader = strdup(loader)) == NULL)
         goto no_memory;
-    if (nmachines) {
-        guest->arch.defaultInfo.nmachines = nmachines;
-        guest->arch.defaultInfo.machines = machines;
-    }
 
     if (VIR_REALLOC_N(caps->guests,
                       caps->nguests + 1) < 0)
@@ -365,6 +361,11 @@ virCapabilitiesAddGuest(virCapsPtr caps,
     caps->guests[caps->nguests] = guest;
     caps->nguests++;
 
+    if (nmachines) {
+        guest->arch.defaultInfo.nmachines = nmachines;
+        guest->arch.defaultInfo.machines = machines;
+    }
+
     return guest;
 
  no_memory:
@@ -407,10 +408,6 @@ virCapabilitiesAddGuestDomain(virCapsGuestPtr guest,
     if (loader &&
         (dom->info.loader = strdup(loader)) == NULL)
         goto no_memory;
-    if (nmachines) {
-        dom->info.nmachines = nmachines;
-        dom->info.machines = machines;
-    }
 
     if (VIR_REALLOC_N(guest->arch.domains,
                       guest->arch.ndomains + 1) < 0)
@@ -418,6 +415,10 @@ virCapabilitiesAddGuestDomain(virCapsGuestPtr guest,
     guest->arch.domains[guest->arch.ndomains] = dom;
     guest->arch.ndomains++;
 
+    if (nmachines) {
+        dom->info.nmachines = nmachines;
+        dom->info.machines = machines;
+    }
 
     return dom;
 
diff --git a/src/xm_internal.c b/src/xm_internal.c
index 71b852e..66f1e1c 100644
--- a/src/xm_internal.c
+++ b/src/xm_internal.c
@@ -2048,6 +2048,9 @@ static int xenXMDomainConfigFormatNet(virConnectPtr conn,
         virBufferVSprintf(&buf, ",vifname=%s",
                           net->ifname);
 
+    if (virBufferError(&buf))
+        goto cleanup;
+
     if (VIR_ALLOC(val) < 0) {
         virReportOOMError(conn);
         goto cleanup;
diff --git a/tests/testutils.c b/tests/testutils.c
index 7a1dbdc..5072fec 100644
--- a/tests/testutils.c
+++ b/tests/testutils.c
@@ -367,10 +367,7 @@ int virtTestMain(int argc,
         }
     }
 
-    if (testOOM)
-        virAllocTestInit();
-
-    /* Run once to count allocs, and ensure it passes :-) */
+    /* Run once to prime any static allocations & ensure it passes */
     ret = (func)(argc, argv);
     if (ret != EXIT_SUCCESS)
         goto cleanup;
@@ -385,6 +382,13 @@ int virtTestMain(int argc,
         testOOM++;
         virSetErrorFunc(NULL, virtTestErrorFuncQuiet);
 
+        virAllocTestInit();
+
+        /* Run again to count allocs, and ensure it passes :-) */
+        ret = (func)(argc, argv);
+        if (ret != EXIT_SUCCESS)
+            goto cleanup;
+
         approxAlloc = virAllocTestCount();
         testCounter++;
         if (testDebug)
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
index 58707e1..6b6a185 100644
--- a/tests/testutilsqemu.c
+++ b/tests/testutilsqemu.c
@@ -9,7 +9,7 @@ virCapsPtr testQemuCapsInit(void) {
     struct utsname utsname;
     virCapsPtr caps;
     virCapsGuestPtr guest;
-    virCapsGuestMachinePtr *machines;
+    virCapsGuestMachinePtr *machines = NULL;
     int nmachines;
     static const char *const x86_machines[] = {
         "pc", "isapc"
-- 
1.6.2.5




More information about the libvir-list mailing list