summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-08-18 17:06:17 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-08-26 10:18:01 +0900
commitab7f281c3461313d907ef8cac238cb380cd3da6d (patch)
tree5456e180755734c69c38ef6a400f941ea148cf37
parentac26c7d4f382a968c505cfa317baf76c38f613a0 (diff)
downloadefl-ab7f281c3461313d907ef8cac238cb380cd3da6d.tar.gz
evas events: Fix crash when translating legacy events
An obvious crash happened when reusing a legacy struct from another type.
-rw-r--r--src/lib/evas/canvas/evas_events_legacy.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/src/lib/evas/canvas/evas_events_legacy.c b/src/lib/evas/canvas/evas_events_legacy.c
index a42ae643fb..2dcdb6896e 100644
--- a/src/lib/evas/canvas/evas_events_legacy.c
+++ b/src/lib/evas/canvas/evas_events_legacy.c
@@ -4,6 +4,34 @@
#define EFL_INTERNAL_UNSTABLE
#include "interfaces/efl_common_internal.h"
+typedef union {
+ Evas_Event_Mouse_Down down;
+ Evas_Event_Mouse_Up up;
+ Evas_Event_Mouse_In in;
+ Evas_Event_Mouse_Out out;
+ Evas_Event_Mouse_Move move;
+ Evas_Event_Mouse_Wheel wheel;
+ Evas_Event_Multi_Down mdown;
+ Evas_Event_Multi_Up mup;
+ Evas_Event_Multi_Move mmove;
+ Evas_Event_Key_Down kdown;
+ Evas_Event_Key_Up kup;
+ Evas_Event_Hold hold;
+ Evas_Event_Axis_Update axis;
+} Evas_Event_Any;
+
+#define EV_SIZE sizeof(Evas_Event_Any)
+
+static inline void *
+_event_alloc(void *old)
+{
+ if (old)
+ memset(old, 0, EV_SIZE);
+ else
+ old = calloc(1, EV_SIZE);
+ return old;
+}
+
Eina_Bool
efl_event_pointer_legacy_info_set(Efl_Event_Pointer *evt, const void *event_info, Evas_Callback_Type type)
{
@@ -223,7 +251,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
case EFL_POINTER_ACTION_IN:
TYPE_CHK(MOUSE_IN);
{
- Evas_Event_Mouse_In *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Mouse_In *e = _event_alloc(ev->legacy);
e->canvas.x = ev->cur.x;
e->canvas.y = ev->cur.y;
COORD_DUP(e);
@@ -242,7 +270,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
case EFL_POINTER_ACTION_OUT:
TYPE_CHK(MOUSE_OUT);
{
- Evas_Event_Mouse_Out *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Mouse_Out *e = _event_alloc(ev->legacy);
e->canvas.x = ev->cur.x;
e->canvas.y = ev->cur.y;
COORD_DUP(e);
@@ -262,7 +290,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
if (ev->finger == 0)
{
TYPE_CHK(MOUSE_DOWN);
- Evas_Event_Mouse_Down *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Mouse_Down *e = _event_alloc(ev->legacy);
e->button = ev->button;
e->canvas.x = ev->cur.x;
e->canvas.y = ev->cur.y;
@@ -282,7 +310,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
else
{
TYPE_CHK(MULTI_DOWN);
- Evas_Event_Multi_Down *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Multi_Down *e = _event_alloc(ev->legacy);
e->device = ev->finger;
e->radius = ev->radius;
e->radius_x = ev->radius_x;
@@ -310,7 +338,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
if (ev->finger == 0)
{
TYPE_CHK(MOUSE_UP);
- Evas_Event_Mouse_Up *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Mouse_Up *e = _event_alloc(ev->legacy);
e->button = ev->button;
e->canvas.x = ev->cur.x;
e->canvas.y = ev->cur.y;
@@ -330,7 +358,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
else
{
TYPE_CHK(MULTI_UP);
- Evas_Event_Multi_Up *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Multi_Up *e = _event_alloc(ev->legacy);
e->device = ev->finger;
e->radius = ev->radius;
e->radius_x = ev->radius_x;
@@ -358,7 +386,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
if (ev->finger == 0)
{
TYPE_CHK(MOUSE_MOVE);
- Evas_Event_Mouse_Move *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Mouse_Move *e = _event_alloc(ev->legacy);
e->buttons = ev->pressed_buttons;
e->cur.canvas.x = ev->cur.x;
e->cur.canvas.y = ev->cur.y;
@@ -380,7 +408,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
else
{
TYPE_CHK(MULTI_MOVE);
- Evas_Event_Multi_Move *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Multi_Move *e = _event_alloc(ev->legacy);
e->device = ev->finger;
e->radius = ev->radius;
e->radius_x = ev->radius_x;
@@ -406,7 +434,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type,
case EFL_POINTER_ACTION_WHEEL:
{
TYPE_CHK(MOUSE_WHEEL);
- Evas_Event_Mouse_Wheel *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Mouse_Wheel *e = _event_alloc(ev->legacy);
e->direction = (ev->wheel.dir == EFL_ORIENT_HORIZONTAL) ? 1 : 0;
e->z = ev->wheel.z;
e->canvas.x = ev->cur.x;
@@ -490,7 +518,7 @@ efl_event_key_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags)
if (ev->pressed)
{
- Evas_Event_Key_Down *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Key_Down *e = _event_alloc(ev->legacy);
e->timestamp = ev->timestamp;
e->keyname = (char *) ev->keyname;
e->key = ev->key;
@@ -508,7 +536,7 @@ efl_event_key_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags)
}
else
{
- Evas_Event_Key_Up *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ Evas_Event_Key_Up *e = _event_alloc(ev->legacy);
e->timestamp = ev->timestamp;
e->keyname = (char *) ev->keyname;
e->key = ev->key;
@@ -557,7 +585,7 @@ efl_event_hold_legacy_info_fill(Efl_Event_Hold *evt, Evas_Event_Flags **pflags)
if (!ev) return NULL;
- e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
+ e = _event_alloc(ev->legacy);
e->timestamp = ev->timestamp;
e->dev = ev->device;
e->hold = ev->hold;