forked from enlightenment/efl
now make eet REALLY not leak if a parse error occurs in decoding serialized
data struct. SVN revision: 7114
This commit is contained in:
parent
1b587fd598
commit
0656623f54
|
@ -1518,6 +1518,7 @@ eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, char *name, void *data, i
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int freelist_ref = 0;
|
||||||
static int freelist_len = 0;
|
static int freelist_len = 0;
|
||||||
static int freelist_num = 0;
|
static int freelist_num = 0;
|
||||||
static void **freelist = NULL;
|
static void **freelist = NULL;
|
||||||
|
@ -1537,6 +1538,7 @@ _eet_freelist_add(void *data)
|
||||||
static void
|
static void
|
||||||
_eet_freelist_reset(void)
|
_eet_freelist_reset(void)
|
||||||
{
|
{
|
||||||
|
if (freelist_ref > 0) return;
|
||||||
freelist_len = 0;
|
freelist_len = 0;
|
||||||
freelist_num = 0;
|
freelist_num = 0;
|
||||||
if (freelist) free(freelist);
|
if (freelist) free(freelist);
|
||||||
|
@ -1548,11 +1550,25 @@ _eet_freelist_free(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (freelist_ref > 0) return;
|
||||||
for (i = 0; i < freelist_num; i++)
|
for (i = 0; i < freelist_num; i++)
|
||||||
free(freelist[i]);
|
free(freelist[i]);
|
||||||
_eet_freelist_reset();
|
_eet_freelist_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eet_freelist_ref(void)
|
||||||
|
{
|
||||||
|
freelist_ref++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eet_freelist_unref(void)
|
||||||
|
{
|
||||||
|
freelist_ref--;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int freelist_list_ref = 0;
|
||||||
static int freelist_list_len = 0;
|
static int freelist_list_len = 0;
|
||||||
static int freelist_list_num = 0;
|
static int freelist_list_num = 0;
|
||||||
static void ***freelist_list = NULL;
|
static void ***freelist_list = NULL;
|
||||||
|
@ -1578,6 +1594,7 @@ _eet_freelist_list_add(void **data)
|
||||||
static void
|
static void
|
||||||
_eet_freelist_list_reset(void)
|
_eet_freelist_list_reset(void)
|
||||||
{
|
{
|
||||||
|
if (freelist_list_ref > 0) return;
|
||||||
freelist_list_len = 0;
|
freelist_list_len = 0;
|
||||||
freelist_list_num = 0;
|
freelist_list_num = 0;
|
||||||
if (freelist_list) free(freelist_list);
|
if (freelist_list) free(freelist_list);
|
||||||
|
@ -1589,11 +1606,25 @@ _eet_freelist_list_free(Eet_Data_Descriptor *edd)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (freelist_list_ref > 0) return;
|
||||||
for (i = 0; i < freelist_list_num; i++)
|
for (i = 0; i < freelist_list_num; i++)
|
||||||
edd->func.list_free(*(freelist_list[i]));
|
edd->func.list_free(*(freelist_list[i]));
|
||||||
_eet_freelist_list_reset();
|
_eet_freelist_list_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eet_freelist_list_ref(void)
|
||||||
|
{
|
||||||
|
freelist_list_ref++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eet_freelist_list_unref(void)
|
||||||
|
{
|
||||||
|
freelist_list_ref--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
void *data_in,
|
void *data_in,
|
||||||
|
@ -1615,10 +1646,14 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
|
|
||||||
data = calloc(1, edd->size);
|
data = calloc(1, edd->size);
|
||||||
if (!data) return NULL;
|
if (!data) return NULL;
|
||||||
|
_eet_freelist_ref();
|
||||||
|
_eet_freelist_list_ref();
|
||||||
_eet_freelist_add(data);
|
_eet_freelist_add(data);
|
||||||
chnk = eet_data_chunk_get(data_in, size_in);
|
chnk = eet_data_chunk_get(data_in, size_in);
|
||||||
if (!chnk)
|
if (!chnk)
|
||||||
{
|
{
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1626,6 +1661,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
if (strcmp(chnk->name, edd->name))
|
if (strcmp(chnk->name, edd->name))
|
||||||
{
|
{
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1641,6 +1678,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
echnk = eet_data_chunk_get(p, size);
|
echnk = eet_data_chunk_get(p, size);
|
||||||
if (!echnk)
|
if (!echnk)
|
||||||
{
|
{
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
@ -1675,6 +1714,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
echnk->size);
|
echnk->size);
|
||||||
if (!data_ret)
|
if (!data_ret)
|
||||||
{
|
{
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
@ -1717,6 +1758,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
data_ret);
|
data_ret);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
{
|
{
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
@ -1725,6 +1768,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
@ -1745,6 +1790,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_free();
|
_eet_freelist_free();
|
||||||
_eet_freelist_list_free(edd);
|
_eet_freelist_list_free(edd);
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
@ -1768,6 +1815,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
||||||
eet_data_chunk_free(echnk);
|
eet_data_chunk_free(echnk);
|
||||||
}
|
}
|
||||||
eet_data_chunk_free(chnk);
|
eet_data_chunk_free(chnk);
|
||||||
|
_eet_freelist_unref();
|
||||||
|
_eet_freelist_list_unref();
|
||||||
_eet_freelist_reset();
|
_eet_freelist_reset();
|
||||||
_eet_freelist_list_reset();
|
_eet_freelist_list_reset();
|
||||||
return data;
|
return data;
|
||||||
|
|
Loading…
Reference in New Issue