提交 a9b3afab 编写于 作者: P Peter Krempa

util: alloc: Add automatic cleanup/disposal of strings

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: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 c358adc5
...@@ -1428,6 +1428,7 @@ virAllocTestOOM; ...@@ -1428,6 +1428,7 @@ virAllocTestOOM;
virAllocVar; virAllocVar;
virDeleteElementsN; virDeleteElementsN;
virDispose; virDispose;
virDisposeString;
virExpandN; virExpandN;
virFree; virFree;
virInsertElementsN; virInsertElementsN;
......
...@@ -618,3 +618,19 @@ void virDispose(void *ptrptr, ...@@ -618,3 +618,19 @@ void virDispose(void *ptrptr,
*countptr = 0; *countptr = 0;
errno = save_errno; 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);
}
...@@ -79,6 +79,8 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1); ...@@ -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) void virDispose(void *ptrptr, size_t count, size_t element_size, size_t *countptr)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
void virDisposeString(char **strptr)
ATTRIBUTE_NONNULL(1);
/** /**
* VIR_ALLOC: * VIR_ALLOC:
...@@ -575,9 +577,17 @@ void virDispose(void *ptrptr, size_t count, size_t element_size, size_t *countpt ...@@ -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. * This macro is not safe to be used on arguments with side effects.
*/ */
# define VIR_DISPOSE_STRING(ptr) virDispose(1 ? (void *) &(ptr) : (ptr), \ # define VIR_DISPOSE_STRING(ptr) virDisposeString(&(ptr))
(ptr) ? strlen((ptr)) : 0, 1, NULL)
/**
* 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: * VIR_DISPOSE:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册