]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix leak of iterators in virDBusMessageIterEncode
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 25 Sep 2013 14:15:45 +0000 (15:15 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 25 Sep 2013 17:12:09 +0000 (18:12 +0100)
If virDBusMessageIterEncode hits an OOM condition it often
leaks the memory associated with the dbus iterator object

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/util/virdbus.c

index a2c4b4e42deb537ca343d01192bab1eee11f5d0d..3bd339a9d79704d41e0f426daec55ff459e998b7 100644 (file)
@@ -601,8 +601,10 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
                 goto cleanup;
             if (virDBusTypeStackPush(&stack, &nstack,
                                      iter, types,
-                                     nstruct, narray) < 0)
+                                     nstruct, narray) < 0) {
+                VIR_FREE(newiter);
                 goto cleanup;
+            }
             VIR_FREE(contsig);
             iter = newiter;
             newiter = NULL;
@@ -625,8 +627,10 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
                 goto cleanup;
             if (virDBusTypeStackPush(&stack, &nstack,
                                      iter, types,
-                                     nstruct, narray) < 0)
+                                     nstruct, narray) < 0) {
+                VIR_FREE(newiter);
                 goto cleanup;
+            }
             iter = newiter;
             newiter = NULL;
             types = vsig;
@@ -657,8 +661,10 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
 
             if (virDBusTypeStackPush(&stack, &nstack,
                                      iter, types,
-                                     nstruct, narray) < 0)
+                                     nstruct, narray) < 0) {
+                VIR_FREE(newiter);
                 goto cleanup;
+            }
             VIR_FREE(contsig);
             iter = newiter;
             newiter = NULL;
@@ -678,6 +684,17 @@ virDBusMessageIterEncode(DBusMessageIter *rootiter,
     ret = 0;
 
 cleanup:
+    while (nstack > 0) {
+        DBusMessageIter *thisiter = iter;
+        VIR_DEBUG("Popping iter=%p", iter);
+        ignore_value(virDBusTypeStackPop(&stack, &nstack, &iter,
+                                         &types, &nstruct, &narray));
+        VIR_DEBUG("Popped iter=%p", iter);
+
+        if (thisiter != rootiter)
+            VIR_FREE(thisiter);
+    }
+
     virDBusTypeStackFree(&stack, &nstack);
     VIR_FREE(contsig);
     VIR_FREE(newiter);