From 1cbd32aca1e895bccef333398f8b23d6d41d845a Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Tue, 28 Feb 2017 16:00:45 +0900 Subject: [PATCH] eina:list: Fix resource leak Summary: The usage of the macro EINA_MAGIC_CHECK_LIST can lead (in some cases) to leaks. Signed-off-by: Flavio Ceolin Reviewers: jpeg Reviewed By: jpeg Subscribers: cedric, jpeg Differential Revision: https://phab.enlightenment.org/D4679 --- src/lib/eina/eina_list.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/lib/eina/eina_list.c b/src/lib/eina/eina_list.c index 26cf3c8..979e484 100644 --- a/src/lib/eina/eina_list.c +++ b/src/lib/eina/eina_list.c @@ -100,6 +100,15 @@ static const char EINA_MAGIC_LIST_ACCOUNTING_STR[] = "Eina List Accounting"; } \ } while(0) +#define EINA_MAGIC_CHECK_LIST_GOTO(d, label) \ + do { \ + if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST)) \ + { \ + EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST); \ + goto label; \ + } \ + } while(0) + #define EINA_MAGIC_CHECK_LIST_ITERATOR(d, ...) \ do { \ if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ITERATOR)) \ @@ -577,7 +586,7 @@ eina_list_append(Eina_List *list, const void *data) return _eina_list_setup_accounting(new_l); } - EINA_MAGIC_CHECK_LIST(list, NULL); + EINA_MAGIC_CHECK_LIST_GOTO(list, on_error); l = list->accounting->last; list->accounting->last = new_l; @@ -587,6 +596,10 @@ eina_list_append(Eina_List *list, const void *data) _eina_list_update_accounting(list, new_l); return list; + +on_error: + _eina_list_mempool_list_free(new_l); + return NULL; } EAPI Eina_List * @@ -604,13 +617,17 @@ eina_list_prepend(Eina_List *list, const void *data) if (!list) return _eina_list_setup_accounting(new_l); - EINA_MAGIC_CHECK_LIST(list, NULL); + EINA_MAGIC_CHECK_LIST_GOTO(list, on_error); list->prev = new_l; _eina_list_update_accounting(list, new_l); return new_l; + +on_error: + _eina_list_mempool_list_free(new_l); + return NULL; } EAPI Eina_List * @@ -643,10 +660,11 @@ eina_list_append_relative_list(Eina_List *list, if ((!list) || (!relative)) return eina_list_append(list, data); + EINA_MAGIC_CHECK_LIST(relative, NULL); + new_l = _eina_list_mempool_list_new(list); if (!new_l) return list; - EINA_MAGIC_CHECK_LIST(relative, NULL); new_l->next = relative->next; new_l->data = (void *)data; @@ -693,11 +711,11 @@ eina_list_prepend_relative_list(Eina_List *list, if ((!list) || (!relative)) return eina_list_prepend(list, data); + EINA_MAGIC_CHECK_LIST(relative, NULL); + new_l = _eina_list_mempool_list_new(list); if (!new_l) return list; - EINA_MAGIC_CHECK_LIST(relative, NULL); - new_l->prev = relative->prev; new_l->next = relative; new_l->data = (void *)data; -- 2.7.4