edc_parser: fix the memory corruption.
just realized that ecore_thread_cancel() wont call the thread cancel function instantly. and this broke parser sequences that memory corruption. Fix that situation to not write invalid memory.
This commit is contained in:
parent
b25d5dffa8
commit
e24efc9c7e
|
@ -374,18 +374,6 @@ end:
|
||||||
td->utf8 = NULL;
|
td->utf8 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
cur_context_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
|
|
||||||
{
|
|
||||||
cur_context_td *td = data;
|
|
||||||
td->cb(td->cb_data, td->state_name, td->state_value, td->part_name, td->group_name);
|
|
||||||
td->pd->cntd = NULL;
|
|
||||||
eina_stringshare_del(td->state_name);
|
|
||||||
eina_stringshare_del(td->part_name);
|
|
||||||
eina_stringshare_del(td->group_name);
|
|
||||||
free(td);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cur_context_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
cur_context_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -394,10 +382,19 @@ cur_context_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
eina_stringshare_del(td->state_name);
|
eina_stringshare_del(td->state_name);
|
||||||
eina_stringshare_del(td->part_name);
|
eina_stringshare_del(td->part_name);
|
||||||
eina_stringshare_del(td->group_name);
|
eina_stringshare_del(td->group_name);
|
||||||
free(td->utf8);
|
|
||||||
free(td);
|
free(td);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cur_context_thread_end(void *data, Ecore_Thread *thread)
|
||||||
|
{
|
||||||
|
cur_context_td *td = data;
|
||||||
|
td->cb(td->cb_data, td->state_name, td->state_value, td->part_name,
|
||||||
|
td->group_name);
|
||||||
|
cur_context_thread_cancel(data, thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
|
type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -1014,8 +1011,11 @@ static void
|
||||||
type_init_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
|
type_init_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
{
|
{
|
||||||
type_init_td *td = data;
|
type_init_td *td = data;
|
||||||
td->pd->titd = NULL;
|
if (td->pd)
|
||||||
td->pd->attrs = td->attrs;
|
{
|
||||||
|
td->pd->titd = NULL;
|
||||||
|
td->pd->attrs = td->attrs;
|
||||||
|
}
|
||||||
free(td);
|
free(td);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1265,22 +1265,20 @@ bracket_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bracket_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
|
bracket_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
{
|
{
|
||||||
bracket_td *btd = data;
|
bracket_td *btd = data;
|
||||||
btd->update_cb(btd->data, btd->left, btd->right);
|
if (btd->pd && btd->pd->btd == btd) btd->pd->btd = NULL;
|
||||||
if (btd->pd->btd == btd) btd->pd->btd = NULL;
|
|
||||||
free(btd->text);
|
free(btd->text);
|
||||||
free(btd);
|
free(btd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bracket_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
bracket_thread_end(void *data, Ecore_Thread *thread)
|
||||||
{
|
{
|
||||||
bracket_td *btd = data;
|
bracket_td *btd = data;
|
||||||
if (btd->pd->btd == btd) btd->pd->btd = NULL;
|
btd->update_cb(btd->data, btd->left, btd->right);
|
||||||
free(btd->text);
|
bracket_thread_cancel(data, thread);
|
||||||
free(btd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1773,9 +1771,21 @@ parser_init(void)
|
||||||
void
|
void
|
||||||
parser_term(parser_data *pd)
|
parser_term(parser_data *pd)
|
||||||
{
|
{
|
||||||
if (pd->cntd) ecore_thread_cancel(pd->cntd->thread);
|
if (pd->cntd)
|
||||||
if (pd->titd) ecore_thread_cancel(pd->titd->thread);
|
{
|
||||||
if (pd->btd) ecore_thread_cancel(pd->btd->thread);
|
ecore_thread_cancel(pd->cntd->thread);
|
||||||
|
pd->cntd->pd = NULL;
|
||||||
|
}
|
||||||
|
if (pd->titd)
|
||||||
|
{
|
||||||
|
ecore_thread_cancel(pd->titd->thread);
|
||||||
|
pd->titd->pd = NULL;
|
||||||
|
}
|
||||||
|
if (pd->btd)
|
||||||
|
{
|
||||||
|
ecore_thread_cancel(pd->btd->thread);
|
||||||
|
pd->btd->pd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (pd->attrs)
|
if (pd->attrs)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue