From a9b3afabcdf18beeb6250b8677bcf1b1d1adad87 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 1 Apr 2019 15:04:53 +0200 Subject: [PATCH] util: alloc: Add automatic cleanup/disposal of strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VIR_AUTODISPOSE_STR is similar to VIR_AUTOFREE(char *) but uses virDispose for clearing of the stored string. This patch also refactors VIR_DISPOSE to use the new helper which is used for the new macro. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/libvirt_private.syms | 1 + src/util/viralloc.c | 16 ++++++++++++++++ src/util/viralloc.h | 14 ++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 56143f6204..46e5ad34e3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1428,6 +1428,7 @@ virAllocTestOOM; virAllocVar; virDeleteElementsN; virDispose; +virDisposeString; virExpandN; virFree; virInsertElementsN; diff --git a/src/util/viralloc.c b/src/util/viralloc.c index b583294760..e82bfa0acd 100644 --- a/src/util/viralloc.c +++ b/src/util/viralloc.c @@ -618,3 +618,19 @@ void virDispose(void *ptrptr, *countptr = 0; errno = save_errno; } + + +/** + * virDisposeString: + * @ptrptr: pointer to pointer for a string which should be sanitized and cleared + * + * See virDispose. + */ +void +virDisposeString(char **strptr) +{ + if (!*strptr) + return; + + virDispose(strptr, strlen(*strptr), sizeof(char), NULL); +} diff --git a/src/util/viralloc.h b/src/util/viralloc.h index 226d4d9b64..a1708b772c 100644 --- a/src/util/viralloc.h +++ b/src/util/viralloc.h @@ -79,6 +79,8 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1); void virDispose(void *ptrptr, size_t count, size_t element_size, size_t *countptr) ATTRIBUTE_NONNULL(1); +void virDisposeString(char **strptr) + ATTRIBUTE_NONNULL(1); /** * VIR_ALLOC: @@ -575,9 +577,17 @@ void virDispose(void *ptrptr, size_t count, size_t element_size, size_t *countpt * * This macro is not safe to be used on arguments with side effects. */ -# define VIR_DISPOSE_STRING(ptr) virDispose(1 ? (void *) &(ptr) : (ptr), \ - (ptr) ? strlen((ptr)) : 0, 1, NULL) +# define VIR_DISPOSE_STRING(ptr) virDisposeString(&(ptr)) +/** + * VIR_AUTODISPOSE_STR: + * + * Macro to automatically free and clear the memory allocated to + * the string variable declared with it by calling virDisposeString + * when the variable goes out of scope. + */ +# define VIR_AUTODISPOSE_STR \ + __attribute__((cleanup(virDisposeString))) char * /** * VIR_DISPOSE: -- GitLab