From 483c4d7573439e71d0bdfe5a9192b3ffc06d35c1 Mon Sep 17 00:00:00 2001 From: ticktock35 Date: Thu, 26 Mar 2009 03:58:43 -0400 Subject: reduce a big memory leak connecting deb_extract Null pointers git-svn-id: http://opkg.googlecode.com/svn/trunk@206 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- (limited to 'libopkg/str_list.c') diff --git a/libopkg/str_list.c b/libopkg/str_list.c index b354c9e..563f3a1 100644 --- a/libopkg/str_list.c +++ b/libopkg/str_list.c @@ -26,6 +26,8 @@ int str_list_elt_init(str_list_elt_t *elt, char *data) void str_list_elt_deinit(str_list_elt_t *elt) { + if (elt->data) + free(elt->data); void_list_elt_deinit((void_list_elt_t *) elt); } @@ -44,17 +46,26 @@ int str_list_init(str_list_t *list) void str_list_deinit(str_list_t *list) { - void_list_deinit((void_list_t *) list); + str_list_elt_t *elt; + while (!void_list_empty(list)) { + elt = str_list_first(list); + if (!elt) + return; + list_del_init(&elt->node); + free(elt->data); + elt->data=NULL; + free(elt); + } } int str_list_append(str_list_t *list, char *data) { - return void_list_append((void_list_t *) list, data); + return void_list_append((void_list_t *) list, strdup(data)); } int str_list_push(str_list_t *list, char *data) { - return void_list_push((void_list_t *) list, data); + return void_list_push((void_list_t *) list, strdup(data)); } str_list_elt_t *str_list_pop(str_list_t *list) @@ -62,17 +73,21 @@ str_list_elt_t *str_list_pop(str_list_t *list) return (str_list_elt_t *) void_list_pop((void_list_t *) list); } -str_list_elt_t *str_list_remove(str_list_t *list, str_list_elt_t **iter) +void str_list_remove(str_list_t *list, str_list_elt_t **iter) { - return (str_list_elt_t *) void_list_remove((void_list_t *) list, + str_list_elt_t * elt = void_list_remove((void_list_t *) list, (void_list_elt_t **) iter); + + str_list_elt_deinit(elt); } -char *str_list_remove_elt(str_list_t *list, const char *target_str) +void str_list_remove_elt(str_list_t *list, const char *target_str) { - return (char *)void_list_remove_elt((void_list_t *) list, + char *str = void_list_remove_elt((void_list_t *) list, (void *)target_str, (void_list_cmp_t)strcmp); + if (str) + free(str); } str_list_elt_t *str_list_first(str_list_t *list) { @@ -93,14 +108,6 @@ str_list_elt_t *str_list_last(str_list_t *list) { void str_list_purge(str_list_t *list) { - str_list_elt_t *elt; - while (!void_list_empty(list)) { - elt = str_list_first(list); - if (!elt) - return; - list_del_init(&elt->node); - free(elt->data); - elt->data=NULL; - free(elt); - } + str_list_deinit(list); + free(list); } -- cgit v0.9.1