* eet: fix build of data that doesn't match data descriptor.

SVN revision: 51677
This commit is contained in:
Cedric BAIL 2010-08-27 13:45:53 +00:00
parent 67dbaebcf6
commit d0e18a3b2a
1 changed files with 82 additions and 49 deletions

View File

@ -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,6 +2180,7 @@ _eet_freelist_free(Eet_Free_Context *context,
for (j = 0; j < 256; ++j)
for (i = 0; i < context->freelist.num[j]; ++i)
if (context->freelist.list[j][i])
{
if (edd)
edd->func.mem_free(context->freelist.list[j][i]);
@ -2172,6 +2191,7 @@ _eet_freelist_free(Eet_Free_Context *context,
} /* _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,6 +2208,7 @@ _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 (context->freelist_array.list[j][i])
{
if (edd)
{
@ -2203,6 +2224,7 @@ _eet_freelist_array_free(Eet_Free_Context *context,
} /* _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,6 +2241,7 @@ _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 (context->freelist_list.list[j][i])
{
if (edd)
edd->func.list_free(*((void **)(context->freelist_list.list[j][i])));
@ -2227,6 +2250,7 @@ _eet_freelist_list_free(Eet_Free_Context *context,
} /* _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,6 +2266,7 @@ _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 (context->freelist_str.list[j][i])
{
if (edd)
edd->func.str_free(context->freelist_str.list[j][i]);
@ -2252,6 +2277,7 @@ _eet_freelist_str_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd)
} /* _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,6 +2294,7 @@ _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 (context->freelist_direct_str.list[j][i])
{
if (edd)
edd->func.str_direct_free(context->freelist_direct_str.list[j][i]);
@ -2278,6 +2305,7 @@ _eet_freelist_direct_str_free(Eet_Free_Context *context,
} /* _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,6 +2322,7 @@ _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 (context->freelist_hash.list[j][i])
{
if (edd)
edd->func.hash_free(context->freelist_hash.list[j][i]);
@ -3248,12 +3277,7 @@ _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);
@ -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)