From 5d4a4825849bbfb2e6066ac2dd4b8fc888ed6a1e Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 19 May 2014 14:20:09 +0200 Subject: [PATCH] util: string: Add helper to free non-NULL terminated string arrays To free string lists with some strings stolen from the middle we need to walk the complete array. Introduce a new helper that takes the string list size to free such string lists. --- src/libvirt_private.syms | 1 + src/util/virstring.c | 20 ++++++++++++++++++++ src/util/virstring.h | 1 + tests/virstringtest.c | 25 +++++++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2a2b9c0797..a5f9ede810 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1924,6 +1924,7 @@ virStrcpy; virStrdup; virStringArrayHasString; virStringFreeList; +virStringFreeListCount; virStringJoin; virStringListLength; virStringReplace; diff --git a/src/util/virstring.c b/src/util/virstring.c index 6dcc7a8acc..35b99a5899 100644 --- a/src/util/virstring.c +++ b/src/util/virstring.c @@ -187,6 +187,26 @@ void virStringFreeList(char **strings) } +/** + * virStringFreeListCount: + * @strings: array of strings to free + * @count: number of elements in the array + * + * Frees a string array of @count length. + */ +void +virStringFreeListCount(char **strings, + size_t count) +{ + size_t i; + + for (i = 0; i < count; i++) + VIR_FREE(strings[i]); + + VIR_FREE(strings); +} + + bool virStringArrayHasString(char **strings, const char *needle) { diff --git a/src/util/virstring.h b/src/util/virstring.h index 6ddcff549b..df254417be 100644 --- a/src/util/virstring.h +++ b/src/util/virstring.h @@ -42,6 +42,7 @@ char *virStringJoin(const char **strings, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); void virStringFreeList(char **strings); +void virStringFreeListCount(char **strings, size_t count); bool virStringArrayHasString(char **strings, const char *needle); diff --git a/tests/virstringtest.c b/tests/virstringtest.c index 5277fc657a..7c25b22c67 100644 --- a/tests/virstringtest.c +++ b/tests/virstringtest.c @@ -497,6 +497,26 @@ testStringToLong(const void *opaque) } +/* The point of this test is to check whether all members of the array are + * freed. The test has to be checked using valgrind. */ +static int +testVirStringFreeListCount(const void *opaque ATTRIBUTE_UNUSED) +{ + char **list; + + if (VIR_ALLOC_N(list, 4) < 0) + return -1; + + ignore_value(VIR_STRDUP(list[0], "test1")); + ignore_value(VIR_STRDUP(list[2], "test2")); + ignore_value(VIR_STRDUP(list[3], "test3")); + + virStringFreeListCount(list, 4); + + return 0; +} + + static int mymain(void) { @@ -701,6 +721,11 @@ mymain(void) TEST_STRTOL("-18446744073709551616", NULL, 0, -1, 0U, -1, 0LL, -1, 0ULL, -1); + /* test virStringFreeListCount */ + if (virtTestRun("virStringFreeListCount", testVirStringFreeListCount, + NULL) < 0) + ret = -1; + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }