forked from enlightenment/efl
evas/callbacks: Prevent post_event_callback_call recursion.
If this function is called recursively, it will free the list of post callbacks before the list stops being used, which will cause a segfault. The only place where this seems to happen is on https://phab.enlightenment.org/T124, probably due to the extensive mouse events which are launched in an unexpected way. This bug started happening after commit 164cc07237395f8fe6efa465e4f0c0c4863f78ed, where the _elm_scroll_page_x_get() started being called by a post_event callback, and forcing an edje recalc. This recalc triggered another post_event callback, thus causing the mentioned segfault. If there's a better way to prevent this from happening, please change the mentioned code.
This commit is contained in:
parent
f1ba71147e
commit
4b5d52fca1
|
@ -152,9 +152,12 @@ _evas_post_event_callback_call(Evas *eo_e, Evas_Public_Data *e)
|
||||||
{
|
{
|
||||||
Evas_Post_Callback *pc;
|
Evas_Post_Callback *pc;
|
||||||
int skip = 0;
|
int skip = 0;
|
||||||
|
static int first_run = 1; // FIXME: This is a workaround to prevent this
|
||||||
|
// function from being called recursively.
|
||||||
|
|
||||||
if (e->delete_me) return;
|
if (e->delete_me || (!first_run)) return;
|
||||||
_evas_walk(e);
|
_evas_walk(e);
|
||||||
|
first_run = 0;
|
||||||
EINA_LIST_FREE(e->post_events, pc)
|
EINA_LIST_FREE(e->post_events, pc)
|
||||||
{
|
{
|
||||||
if ((!skip) && (!e->delete_me) && (!pc->delete_me))
|
if ((!skip) && (!e->delete_me) && (!pc->delete_me))
|
||||||
|
@ -163,6 +166,7 @@ _evas_post_event_callback_call(Evas *eo_e, Evas_Public_Data *e)
|
||||||
}
|
}
|
||||||
EVAS_MEMPOOL_FREE(_mp_pc, pc);
|
EVAS_MEMPOOL_FREE(_mp_pc, pc);
|
||||||
}
|
}
|
||||||
|
first_run = 1;
|
||||||
_evas_unwalk(e);
|
_evas_unwalk(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue