summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2018-05-18 09:03:30 -0500
committerDerek Foreman <derekf@osg.samsung.com>2018-05-18 09:27:15 -0500
commitd04a625e029b1eaf59bde4e25430eeb3f98d4b6b (patch)
tree04cf8ca37cded64c1de9ca8f8ec0947ce57c8179
parent51ed4fbedf9b26f96bfe09b0997baead8db633c1 (diff)
downloadefl-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.c15
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 *