From 0849e320a0f77f8f47dc0509e385ef4287ea4835 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 19 Sep 2011 10:11:53 +0000 Subject: [PATCH] fix bug in generic event handling on xlib side of ecore_x SVN revision: 63475 --- legacy/ecore/ChangeLog | 5 ++++ .../src/lib/ecore_x/xlib/ecore_x_events.c | 27 ++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index c6be25d1e1..9e0d16ce26 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -296,3 +296,8 @@ * Add ECORE_CON_EVENT_CLIENT_WRITE, ECORE_CON_EVENT_SERVER_WRITE for obtaining progress of socket writes + +2011-09-18 Carsten Haitzler (The Rasterman) + + * Fix bug in Ecore_X generic event handling for extended event + sizes when freeing (and allocating) the data. diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c index 777f148182..b207748a07 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c @@ -2229,9 +2229,16 @@ _ecore_x_event_free_generic_event(void *data, void *ev) #ifdef ECORE_XI2 Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)ev; - if (e->data) - XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data); - + if (data) + { + if (e->data) + XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data); + free(data); + } + free(e); +#else + return; + data = NULL; ev = NULL; #endif /* ifdef ECORE_XI2 */ } /* _ecore_x_event_free_generic_event */ @@ -2241,7 +2248,8 @@ _ecore_x_event_handle_generic_event(XEvent *event) #ifdef ECORE_XI2 XGenericEvent *generic_event; Ecore_X_Event_Generic *e; - + XGenericEventCookie *data; + LOGFN(__FILE__, __LINE__, __FUNCTION__); generic_event = (XGenericEvent *)event; @@ -2249,7 +2257,7 @@ _ecore_x_event_handle_generic_event(XEvent *event) if (!e) return; - if (XGetEventData(_ecore_x_disp, &event->xcookie)) + if (XGetEventData(_ecore_x_disp, &(event->xcookie))) { e->cookie = event->xcookie.cookie; e->data = event->xcookie.data; @@ -2265,11 +2273,16 @@ _ecore_x_event_handle_generic_event(XEvent *event) if (e->extension == _ecore_x_xi2_opcode) _ecore_x_input_handler(event); - + + data = malloc(sizeof(XGenericEventCookie)); + if (data) memcpy(data, &(event->xcookie), sizeof(XGenericEventCookie)); ecore_event_add(ECORE_X_EVENT_GENERIC, e, _ecore_x_event_free_generic_event, - event); + data); +#else + return; + event = NULL; #endif /* ifdef ECORE_XI2 */ } /* _ecore_x_event_handle_generic_event */