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:
Hermet Park 2016-08-04 19:52:29 +09:00
parent b25d5dffa8
commit e24efc9c7e
1 changed files with 35 additions and 25 deletions

View File

@ -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)
{ {