From 55ee6ac8de1fc716e86c29f45d515bd8aac7ad3d Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 21 Feb 2019 16:37:50 +0100 Subject: [PATCH] util: buffer: Introduce VIR_AUTOCLEAN function for virBuffer virBuffer is almost always stack-allocated, but requires freeing of the internals on error. Introduce a VIR_AUTOCLEAN function to deal with this. Along with the addition add a test which would leak the buffer contents if it weren't autocleaned. Signed-off-by: Peter Krempa Reviewed-by: Eric Blake --- src/util/virbuffer.h | 3 +++ tests/virbuftest.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/util/virbuffer.h b/src/util/virbuffer.h index 7e4e7645df..b399c90154 100644 --- a/src/util/virbuffer.h +++ b/src/util/virbuffer.h @@ -59,6 +59,9 @@ int virBufferCheckErrorInternal(const virBuffer *buf, const char *funcname, size_t linenr) ATTRIBUTE_NONNULL(1); + +VIR_DEFINE_AUTOCLEAN_FUNC(virBuffer, virBufferFreeAndReset); + /** * virBufferCheckError * diff --git a/tests/virbuftest.c b/tests/virbuftest.c index bdb0a5e934..34f02b1281 100644 --- a/tests/virbuftest.c +++ b/tests/virbuftest.c @@ -429,6 +429,17 @@ testBufSetIndent(const void *opaque ATTRIBUTE_UNUSED) } +/* Result of this shows up only in valgrind or similar */ +static int +testBufferAutoclean(const void *opaque ATTRIBUTE_UNUSED) +{ + VIR_AUTOCLEAN(virBuffer) buf = VIR_BUFFER_INITIALIZER; + + virBufferAddLit(&buf, "test test test\n"); + return 0; +} + + static int mymain(void) { @@ -448,6 +459,7 @@ mymain(void) DO_TEST("Trim", testBufTrim, 0); DO_TEST("AddBuffer", testBufAddBuffer, 0); DO_TEST("set indent", testBufSetIndent, 0); + DO_TEST("autoclean", testBufferAutoclean, 0); #define DO_TEST_ADD_STR(DATA, EXPECT) \ do { \