From 1e498286d999109eb4504e4cf98b1412d4554f0b Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Tue, 13 Nov 2018 14:30:09 -0600 Subject: [PATCH] eet: Stop freeing allocated memory in descriptor_decode There are other paths that free this memory, so it ends up freed by the EET_G_UNKNOWN_NESTED path, yet remains on the list. It makes more sense to have all the callers deal with this memory. Differential Revision: https://phab.enlightenment.org/D7280 Signed-off-by: Derek Foreman --- src/lib/eet/eet_data.c | 45 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/lib/eet/eet_data.c b/src/lib/eet/eet_data.c index cf3e72d3cb..c3ad0a0989 100644 --- a/src/lib/eet/eet_data.c +++ b/src/lib/eet/eet_data.c @@ -3568,6 +3568,7 @@ _eet_data_descriptor_decode(Eet_Free_Context *context, char *p; int size, i; Eet_Data_Chunk chnk; + Eina_Bool need_free = EINA_FALSE; if (_eet_data_words_bigendian == -1) { @@ -3590,6 +3591,7 @@ _eet_data_descriptor_decode(Eet_Free_Context *context, else { data = edd->func.mem_alloc(edd->size); + need_free = EINA_TRUE; } if (!data) @@ -3604,8 +3606,6 @@ _eet_data_descriptor_decode(Eet_Free_Context *context, } _eet_freelist_all_ref(context); - if (data && !data_out) - _eet_freelist_add(context, data); memset(&chnk, 0, sizeof(Eet_Data_Chunk)); eet_data_chunk_get(ed, &chnk, data_in, size_in); @@ -3775,6 +3775,7 @@ _eet_data_descriptor_decode(Eet_Free_Context *context, return data; error: + if (need_free) free(data); eet_node_del(result); _eet_freelist_all_unref(context); @@ -3832,14 +3833,17 @@ eet_data_get_list(Eet_Free_Context *context, size, on_error); else - STRUCT_TYPE_DECODE(data_ret, - context, - ed, - subtype, - echnk->data, - echnk->size, - -1, - on_error); + { + STRUCT_TYPE_DECODE(data_ret, + context, + ed, + subtype, + echnk->data, + echnk->size, + -1, + on_error); + if (subtype) _eet_freelist_add(context, data_ret); + } if (edd) { @@ -3920,14 +3924,18 @@ eet_data_get_hash(Eet_Free_Context *context, size, on_error); else - STRUCT_TYPE_DECODE(data_ret, - context, - ed, - ede ? ede->subtype : NULL, - echnk->data, - echnk->size, - -1, - on_error); + { + STRUCT_TYPE_DECODE(data_ret, + context, + ed, + ede ? ede->subtype : NULL, + echnk->data, + echnk->size, + -1, + on_error); + + if (ede ? ede->subtype : NULL) _eet_freelist_add(context, data_ret); + } if (edd) { @@ -4702,6 +4710,7 @@ eet_data_get_unknown(Eet_Free_Context *context, { ptr = (void **)(((char *)data)); *ptr = (void *)data_ret; + _eet_freelist_add(context, data_ret); } } else