diff options
author | Derek Foreman <derekf@osg.samsung.com> | 2018-05-18 09:03:30 -0500 |
---|---|---|
committer | Derek Foreman <derekf@osg.samsung.com> | 2018-05-18 09:27:15 -0500 |
commit | d04a625e029b1eaf59bde4e25430eeb3f98d4b6b (patch) | |
tree | 04cf8ca37cded64c1de9ca8f8ec0947ce57c8179 | |
parent | 51ed4fbedf9b26f96bfe09b0997baead8db633c1 (diff) | |
download | efl-d04a625e029b1eaf59bde4e25430eeb3f98d4b6b.tar.gz |
evas_main: Fix deleting pointer data
This appears to be called from a delete callback that takes place well
after the eo parent relationship is deleted, however
efl_input_device_get_seat() finds the seat by finding the parent. That
will always be NULL during this callback, so we'll leak the data.
Instead, search all seats for the pointer.
-rw-r--r-- | src/lib/evas/canvas/evas_main.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 62b996f6e6..a58f59835c 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -1352,25 +1352,24 @@ _evas_pointer_data_remove(Evas_Public_Data *edata, Efl_Input_Device *pointer) { Evas_Pointer_Data *pdata; Evas_Pointer_Seat *pseat; - Eo *seat; + Evas_Pointer_Seat *hit = NULL; - seat = efl_input_device_seat_get(pointer); EINA_INLIST_FOREACH(edata->seats, pseat) { - if (pseat->seat != seat) continue; EINA_INLIST_FOREACH(pseat->pointers, pdata) if (pdata->pointer == pointer) { pseat->pointers = eina_inlist_remove(pseat->pointers, EINA_INLIST_GET(pdata)); free(pdata); + hit = pseat; break; } - if (pseat->pointers) break; - eina_list_free(pseat->object.in); - edata->seats = eina_inlist_remove(edata->seats, EINA_INLIST_GET(pseat)); - free(pseat); - break; } + EINA_SAFETY_ON_NULL_RETURN(hit); + if (hit->pointers) return; + eina_list_free(hit->object.in); + edata->seats = eina_inlist_remove(edata->seats, EINA_INLIST_GET(hit)); + free(hit); } Eina_List * |