evas events - fix segv if pointer data is freed by cb

callback can free what is in context. avoid that problem

@fix
This commit is contained in:
Carsten Haitzler 2019-07-31 14:05:06 +01:00
parent 8dba566c4b
commit 0af9c345cc
1 changed files with 6 additions and 2 deletions

View File

@ -2187,6 +2187,8 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
copy = evas_event_list_copy(pdata->seat->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Eina_Bool check_nogrep = EINA_FALSE;
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
obj_pdata = _evas_object_pointer_data_get(pdata, obj);
if (!obj_pdata)
@ -2195,6 +2197,9 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
ev->device);
continue;
}
if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
(pdata->seat->nogrep > 0))
check_nogrep = EINA_TRUE;
if ((!e->is_frozen) &&
_evas_event_object_pointer_allow(eo_obj, obj, obj_pdata) &&
(!evas_object_is_source_invisible(eo_obj, obj) ||
@ -2212,8 +2217,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
}
else
outs = eina_list_append(outs, eo_obj);
if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
(pdata->seat->nogrep > 0))
if (check_nogrep)
{
eina_list_free(copy);
eina_list_free(outs);