jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e434653fc2a23b1841ebbe243f5169813939b178

commit e434653fc2a23b1841ebbe243f5169813939b178
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Thu Feb 16 16:26:42 2017 +0900

    evas: Ensure post-event cb push is called from an event cb
    
    This rejects calls to evas_post_event_callback_push() that don't
    originate from inside an input event callback.
---
 src/lib/evas/canvas/evas_callbacks.c | 28 +++++++++++++++++++++++++---
 src/lib/evas/canvas/evas_main.c      |  1 +
 src/lib/evas/include/evas_private.h  |  1 +
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/lib/evas/canvas/evas_callbacks.c 
b/src/lib/evas/canvas/evas_callbacks.c
index 2b4e88e..da5bb48 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -252,6 +252,8 @@ _evas_post_event_callback_free(Evas *eo_e)
    Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
    Evas_Post_Callback *pc;
 
+   if (EINA_LIKELY(!e->post_events)) return;
+
    EINA_LIST_FREE(e->post_events, pc)
      {
         EVAS_MEMPOOL_FREE(_mp_pc, pc);
@@ -323,6 +325,7 @@ evas_object_event_callback_call(Evas_Object *eo_obj, 
Evas_Object_Protected_Data
    /* MEM OK */
    const Evas_Button_Flags CLICK_MASK = EVAS_BUTTON_DOUBLE_CLICK | 
EVAS_BUTTON_TRIPLE_CLICK;
    Evas_Button_Flags flags = EVAS_BUTTON_NONE;
+   Evas_Callback_Type prev_type;
    Evas_Public_Data *e;
 
    if (!obj) return;
@@ -364,27 +367,41 @@ evas_object_event_callback_call(Evas_Object *eo_obj, 
Evas_Object_Protected_Data
         efl_event_desc = _legacy_evas_callback_table(type);
      }
 
+   prev_type = e->current_event;
+   e->current_event = type;
+
    efl_event_callback_legacy_call(eo_obj, efl_event_desc, event_info);
 
    /* multi events with finger 0 - only for eo callbacks */
    if (type == EVAS_CALLBACK_MOUSE_DOWN)
      {
         if (_evas_object_callback_has_by_type(obj, EVAS_CALLBACK_MULTI_DOWN))
-          efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_DOWN, event_info);
+          {
+             e->current_event = EVAS_CALLBACK_MULTI_DOWN;
+             efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_DOWN, 
event_info);
+          }
         efl_input_pointer_button_flags_set(event_info, flags);
      }
    else if (type == EVAS_CALLBACK_MOUSE_UP)
      {
         if (_evas_object_callback_has_by_type(obj, EVAS_CALLBACK_MULTI_UP))
-          efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_UP, event_info);
+          {
+             e->current_event = EVAS_CALLBACK_MULTI_UP;
+             efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_UP, event_info);
+          }
         efl_input_pointer_button_flags_set(event_info, flags);
      }
    else if (type == EVAS_CALLBACK_MOUSE_MOVE)
      {
         if (_evas_object_callback_has_by_type(obj, EVAS_CALLBACK_MULTI_MOVE))
-          efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_MOVE, event_info);
+          {
+             e->current_event = EVAS_CALLBACK_MULTI_MOVE;
+             efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_MOVE, 
event_info);
+          }
      }
 
+   e->current_event = prev_type;
+
 nothing_here:
    if (!obj->no_propagate)
      {
@@ -580,6 +597,11 @@ evas_post_event_callback_push(Evas *eo_e, 
Evas_Object_Event_Post_Cb func, const
    Evas_Post_Callback *pc;
 
    if (!e || e->delete_me) return;
+   if (e->current_event == EVAS_CALLBACK_LAST)
+     {
+        ERR("%s() can only be called from an input event callback!", 
__FUNCTION__);
+        return;
+     }
    EVAS_MEMPOOL_INIT(_mp_pc, "evas_post_callback", Evas_Post_Callback, 64, );
    pc = EVAS_MEMPOOL_ALLOC(_mp_pc, Evas_Post_Callback);
    if (!pc) return;
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 3a1aa0e..fff28b4 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -214,6 +214,7 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, 
Evas_Public_Data *e)
    e->framespace.w = 0;
    e->framespace.h = 0;
    e->hinting = EVAS_FONT_HINTING_BYTECODE;
+   e->current_event = EVAS_CALLBACK_LAST;
    e->name_hash = eina_hash_string_superfast_new(NULL);
    eina_clist_init(&e->calc_list);
    eina_clist_init(&e->calc_done);
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index a62852a..ff28339 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -929,6 +929,7 @@ struct _Evas_Public_Data
    int            last_mouse_up_counter;
    int            nochange;
    Evas_Font_Hinting_Flags hinting;
+   Evas_Callback_Type current_event;
 
    Eina_List     *touch_points;
    Eina_List     *devices;

-- 


Reply via email to