]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virbuffer: Don't leak memory in virBufferAddBuffer
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 18 Apr 2019 11:59:15 +0000 (13:59 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Sat, 4 May 2019 21:39:35 +0000 (23:39 +0200)
If an error occurs in a virBuffer* API the idea is to free the
content immediately and set @error member used in error reporting
later. Well, this is not what how virBufferAddBuffer works.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
src/util/virbuffer.c
tests/virbuftest.c

index 54703a28d8643a8896772cd4278d8429f914abde..b2ae7963a15c29a08a6f76dfd606aad79ca343f7 100644 (file)
@@ -197,7 +197,7 @@ virBufferAddBuffer(virBufferPtr buf, virBufferPtr toadd)
 
     if (buf->error || toadd->error) {
         if (!buf->error)
-            buf->error = toadd->error;
+            virBufferSetError(buf, toadd->error);
         goto done;
     }
 
index 778754d7c10a8cb431637353b245e0050eaae6b8..caad6f3ecb2b7bc4c2686901d88c316de638ca40 100644 (file)
@@ -303,6 +303,32 @@ static int testBufAddBuffer(const void *data ATTRIBUTE_UNUSED)
     return ret;
 }
 
+static int
+testBufAddBuffer2(const void *opaque ATTRIBUTE_UNUSED)
+{
+    VIR_AUTOCLEAN(virBuffer) buf1 = VIR_BUFFER_INITIALIZER;
+    VIR_AUTOCLEAN(virBuffer) buf2 = VIR_BUFFER_INITIALIZER;
+
+    /* Intent of this test is to demonstrate a memleak that happen with
+     * virBufferAddBuffer */
+
+    virBufferAddLit(&buf1, "Hello world!\n");
+    virBufferAddLit(&buf2, "Hello world!\n");
+
+    /* Intentional usage error */
+    virBufferAdjustIndent(&buf2, -2);
+
+    virBufferAddBuffer(&buf1, &buf2);
+
+    if (virBufferCurrentContent(&buf1) ||
+        !virBufferCurrentContent(&buf2)) {
+        VIR_TEST_DEBUG("Unexpected buffer content");
+        return -1;
+    }
+
+    return 0;
+}
+
 struct testBufAddStrData {
     const char *data;
     const char *expect;
@@ -460,6 +486,7 @@ mymain(void)
     DO_TEST("Auto-indentation", testBufAutoIndent, 0);
     DO_TEST("Trim", testBufTrim, 0);
     DO_TEST("AddBuffer", testBufAddBuffer, 0);
+    DO_TEST("AddBuffer2", testBufAddBuffer2, 0);
     DO_TEST("set indent", testBufSetIndent, 0);
     DO_TEST("autoclean", testBufferAutoclean, 0);