diff --git a/legacy/eet/src/lib/eet_data.c b/legacy/eet/src/lib/eet_data.c index 0a305a8102..f607e6bf0a 100644 --- a/legacy/eet/src/lib/eet_data.c +++ b/legacy/eet/src/lib/eet_data.c @@ -2114,6 +2114,23 @@ _eet_free_add(Eet_Free *ef, ef->list[hash][ef->num[hash] - 1] = data; } /* _eet_free_add */ +static void +_eet_free_del(Eet_Free *ef, + void *data) +{ + int hash; + int i; + + hash = _eet_free_hash(data); + + for (i = 0; i < ef->num[hash]; ++i) + if (ef->list[hash][i] == data) + { + ef->list[hash][i] = NULL; + return; + } +} + static void _eet_free_reset(Eet_Free *ef) { @@ -2146,6 +2163,7 @@ _eet_free_unref(Eet_Free *ef) } /* _eet_free_unref */ #define _eet_freelist_add(Ctx, Data) _eet_free_add(&Ctx->freelist, Data); +#define _eet_freelist_del(Ctx, Data) _eet_free_del(&Ctx->freelist, Data); #define _eet_freelist_reset(Ctx) _eet_free_reset(&Ctx->freelist); #define _eet_freelist_ref(Ctx) _eet_free_ref(&Ctx->freelist); #define _eet_freelist_unref(Ctx) _eet_free_unref(&Ctx->freelist); @@ -2162,16 +2180,18 @@ _eet_freelist_free(Eet_Free_Context *context, for (j = 0; j < 256; ++j) for (i = 0; i < context->freelist.num[j]; ++i) - { - if (edd) - edd->func.mem_free(context->freelist.list[j][i]); - else - free(context->freelist.list[j][i]); - } + if (context->freelist.list[j][i]) + { + if (edd) + edd->func.mem_free(context->freelist.list[j][i]); + else + free(context->freelist.list[j][i]); + } _eet_free_reset(&context->freelist); } /* _eet_freelist_free */ #define _eet_freelist_array_add(Ctx, Data) _eet_free_add(&Ctx->freelist_array, Data); +#define _eet_freelist_array_del(Ctx, Data) _eet_free_del(&Ctx->freelist_array, Data); #define _eet_freelist_array_reset(Ctx) _eet_free_reset(&Ctx->freelist_array); #define _eet_freelist_array_ref(Ctx) _eet_free_ref(&Ctx->freelist_array); #define _eet_freelist_array_unref(Ctx) _eet_free_unref(&Ctx->freelist_array); @@ -2188,21 +2208,23 @@ _eet_freelist_array_free(Eet_Free_Context *context, for (j = 0; j < 256; ++j) for (i = 0; i < context->freelist_array.num[j]; ++i) - { - if (edd) - { - if (edd->func.array_free) - edd->func.array_free(context->freelist_array.list[j][i]); - else - edd->func.mem_free(context->freelist_array.list[j][i]); - } - else - free(context->freelist_array.list[j][i]); - } + if (context->freelist_array.list[j][i]) + { + if (edd) + { + if (edd->func.array_free) + edd->func.array_free(context->freelist_array.list[j][i]); + else + edd->func.mem_free(context->freelist_array.list[j][i]); + } + else + free(context->freelist_array.list[j][i]); + } _eet_free_reset(&context->freelist_array); } /* _eet_freelist_array_free */ #define _eet_freelist_list_add(Ctx, Data) _eet_free_add(&Ctx->freelist_list, Data); +#define _eet_freelist_list_del(Ctx, Data) _eet_free_del(&Ctx->freelist_list, Data); #define _eet_freelist_list_reset(Ctx) _eet_free_reset(&Ctx->freelist_list); #define _eet_freelist_list_ref(Ctx) _eet_free_ref(&Ctx->freelist_list); #define _eet_freelist_list_unref(Ctx) _eet_free_unref(&Ctx->freelist_list); @@ -2219,14 +2241,16 @@ _eet_freelist_list_free(Eet_Free_Context *context, for (j = 0; j < 256; ++j) for (i = 0; i < context->freelist_list.num[j]; ++i) - { - if (edd) - edd->func.list_free(*((void **)(context->freelist_list.list[j][i]))); - } + if (context->freelist_list.list[j][i]) + { + if (edd) + edd->func.list_free(*((void **)(context->freelist_list.list[j][i]))); + } _eet_free_reset(&context->freelist_list); } /* _eet_freelist_list_free */ #define _eet_freelist_str_add(Ctx, Data) _eet_free_add(&Ctx->freelist_str, Data); +#define _eet_freelist_str_del(Ctx, Data) _eet_free_del(&Ctx->freelist_str, Data); #define _eet_freelist_str_reset(Ctx) _eet_free_reset(&Ctx->freelist_str); #define _eet_freelist_str_ref(Ctx) _eet_free_ref(&Ctx->freelist_str); #define _eet_freelist_str_unref(Ctx) _eet_free_unref(&Ctx->freelist_str); @@ -2242,16 +2266,18 @@ _eet_freelist_str_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) for (j = 0; j < 256; ++j) for (i = 0; i < context->freelist_str.num[j]; ++i) - { - if (edd) - edd->func.str_free(context->freelist_str.list[j][i]); - else - free(context->freelist_str.list[j][i]); - } + if (context->freelist_str.list[j][i]) + { + if (edd) + edd->func.str_free(context->freelist_str.list[j][i]); + else + free(context->freelist_str.list[j][i]); + } _eet_free_reset(&context->freelist_str); } /* _eet_freelist_str_free */ #define _eet_freelist_direct_str_add(Ctx, Data) _eet_free_add(&Ctx->freelist_direct_str, Data); +#define _eet_freelist_direct_str_del(Ctx, Data) _eet_free_del(&Ctx->freelist_direct_str, Data); #define _eet_freelist_direct_str_reset(Ctx) _eet_free_reset(&Ctx->freelist_direct_str); #define _eet_freelist_direct_str_ref(Ctx) _eet_free_ref(&Ctx->freelist_direct_str); #define _eet_freelist_direct_str_unref(Ctx) _eet_free_unref(&Ctx->freelist_direct_str); @@ -2268,16 +2294,18 @@ _eet_freelist_direct_str_free(Eet_Free_Context *context, for (j = 0; j < 256; ++j) for (i = 0; i < context->freelist_direct_str.num[j]; ++i) - { - if (edd) - edd->func.str_direct_free(context->freelist_direct_str.list[j][i]); - else - free(context->freelist_direct_str.list[j][i]); - } + if (context->freelist_direct_str.list[j][i]) + { + if (edd) + edd->func.str_direct_free(context->freelist_direct_str.list[j][i]); + else + free(context->freelist_direct_str.list[j][i]); + } _eet_free_reset(&context->freelist_direct_str); } /* _eet_freelist_direct_str_free */ #define _eet_freelist_hash_add(Ctx, Data) _eet_free_add(&Ctx->freelist_hash, Data); +#define _eet_freelist_hash_del(Ctx, Data) _eet_free_del(&Ctx->freelist_hash, Data); #define _eet_freelist_hash_reset(Ctx) _eet_free_reset(&Ctx->freelist_hash); #define _eet_freelist_hash_ref(Ctx) _eet_free_ref(&Ctx->freelist_hash); #define _eet_freelist_hash_unref(Ctx) _eet_free_unref(&Ctx->freelist_hash); @@ -2294,12 +2322,13 @@ _eet_freelist_hash_free(Eet_Free_Context *context, for (j = 0; j < 256; ++j) for (i = 0; i < context->freelist_hash.num[j]; ++i) - { - if (edd) - edd->func.hash_free(context->freelist_hash.list[j][i]); - else - free(context->freelist_hash.list[j][i]); - } + if (context->freelist_hash.list[j][i]) + { + if (edd) + edd->func.hash_free(context->freelist_hash.list[j][i]); + else + free(context->freelist_hash.list[j][i]); + } _eet_free_reset(&context->freelist_hash); } /* _eet_freelist_hash_free */ @@ -3248,17 +3277,12 @@ _eet_data_descriptor_decode(Eet_Free_Context *context, &echnk, type, group_type, - ede ? (void *)(((char - *) - data) - + ede-> - offset) - : (void **)&result, + ede ? (void *)(((char*) data) + ede->offset) : (void **)&result, &p, &size); if (ret <= 0) - goto error; + goto error; } /* advance to next chunk */ @@ -3324,7 +3348,7 @@ eet_data_get_list(Eet_Free_Context *context, EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0); - if (edd) + if (ede) { subtype = ede->subtype; @@ -3403,6 +3427,9 @@ eet_data_get_hash(Eet_Free_Context *context, if (ret <= 0) goto on_error; + if (!key) + goto on_error; + /* Advance to next chunk */ NEXT_CHUNK((*p), (*size), (*echnk), ed); memset(echnk, 0, sizeof(Eet_Data_Chunk)); @@ -3412,6 +3439,11 @@ eet_data_get_hash(Eet_Free_Context *context, if (!echnk->name) goto on_error; + if (ede) + if ((ede->group_type != echnk->group_type) + || (ede->type != echnk->type)) + goto on_error; + if (IS_POINTER_TYPE(echnk->type)) POINTER_TYPE_DECODE(context, ed, @@ -3444,7 +3476,7 @@ eet_data_get_hash(Eet_Free_Context *context, return 1; on_error: - return ret; + return 0; } /* eet_data_get_hash */ /* var arrays and fixed arrays have to @@ -3583,6 +3615,7 @@ eet_data_get_array(Eet_Free_Context *context, memcpy(dst, data_ret, subsize); if (edd) edd->func.mem_free(data_ret); else free(data_ret); + _eet_freelist_del(context, data_ret); } if (!edd) @@ -3972,7 +4005,7 @@ eet_data_get_variant(Eet_Free_Context *context, sede->group_type, data, &p2, &size2); if (ret <= 0) - goto on_error; + goto on_error; /* advance to next chunk */ NEXT_CHUNK(p2, size2, chnk, ed);