hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=0c315a64f810e66e82fa67b360b564d612bc6931

commit 0c315a64f810e66e82fa67b360b564d612bc6931
Author: ChunEon Park <[email protected]>
Date:   Sat Nov 1 20:03:39 2014 +0900

    lib/auto_comp: don't access free memory.
    
    entry smart callback could be called after auto_comp is terminated.
    Don't access the freed autocomp instance in the entry callbacks.
---
 src/lib/auto_comp.c | 52 ++++++++++++++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git a/src/lib/auto_comp.c b/src/lib/auto_comp.c
index 0485ef3..c306c93 100644
--- a/src/lib/auto_comp.c
+++ b/src/lib/auto_comp.c
@@ -151,10 +151,11 @@ entry_anchor_off(autocomp_data *ad)
 }
 
 static void
-anchor_unfocused_cb(void *data, Evas_Object *obj EINA_UNUSED,
+anchor_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                     void *event_info EINA_UNUSED)
 {
-   autocomp_data *ad = data;
+   autocomp_data *ad = g_ad;
+   if (!g_ad) return;
    entry_anchor_off(ad);
 }
 
@@ -385,10 +386,13 @@ candidate_list_show(autocomp_data *ad)
 }
 
 static void
-entry_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                 void *event_info)
 {
+   autocomp_data *ad = g_ad;
+   if (!g_ad) return;
+
    Elm_Entry_Change_Info *info = event_info;
-   autocomp_data *ad = data;
 
    if (info->insert)
      {
@@ -416,18 +420,21 @@ entry_changed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 }
 
 static void
-entry_cursor_changed_manual_cb(void *data, Evas_Object *obj EINA_UNUSED,
+entry_cursor_changed_manual_cb(void *data EINA_UNUSED,
+                               Evas_Object *obj EINA_UNUSED,
                                void *event_info EINA_UNUSED)
 {
-   autocomp_data *ad = data;
+   autocomp_data *ad = g_ad;
+   if (!g_ad) return;
    entry_anchor_off(ad);
 }
 
 static void
-entry_cursor_changed_cb(void *data, Evas_Object *obj,
+entry_cursor_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
                         void *event_info EINA_UNUSED)
 {
-   autocomp_data *ad = data;
+   autocomp_data *ad = g_ad;
+   if (!g_ad) return;
 
    //Update anchor position
    Evas_Coord x, y, cx, cy, cw, ch;
@@ -438,18 +445,20 @@ entry_cursor_changed_cb(void *data, Evas_Object *obj,
 }
 
 static void
-entry_press_cb(void *data, Evas_Object *obj EINA_UNUSED,
+entry_press_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                void *event_info EINA_UNUSED)
 {
-   autocomp_data *ad = data;
+   autocomp_data *ad = g_ad;
+   if (!g_ad) return;
    entry_anchor_off(ad);
 }
 
 static void
-entry_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
-              void *event_info EINA_UNUSED)
+entry_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+              Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   autocomp_data *ad = data;
+   autocomp_data *ad = g_ad;
+   if (!g_ad) return;
    entry_anchor_off(ad);
 }
 
@@ -464,7 +473,8 @@ list_item_move(autocomp_data *ad, Eina_Bool up)
    else it = elm_list_item_next(it);
    if (it) elm_list_item_selected_set(it, EINA_TRUE);
 
-   evas_object_smart_callback_add(entry, "unfocused", anchor_unfocused_cb, ad);
+   evas_object_smart_callback_add(entry, "unfocused", anchor_unfocused_cb,
+                                  NULL);
 }
 
 /*****************************************************************************/
@@ -500,15 +510,17 @@ autocomp_target_set(edit_data *ed)
    if (!ed) return;
 
    entry = edit_entry_get(ed);
-   evas_object_smart_callback_add(entry, "changed,user", entry_changed_cb, ad);
+   evas_object_smart_callback_add(entry, "changed,user", entry_changed_cb,
+                                  NULL);
    evas_object_smart_callback_add(entry, "cursor,changed,manual",
-                                          entry_cursor_changed_manual_cb, ad);
+                                          entry_cursor_changed_manual_cb, 
NULL);
    evas_object_smart_callback_add(entry, "cursor,changed",
-                                  entry_cursor_changed_cb, ad);
-   evas_object_smart_callback_add(entry, "unfocused", anchor_unfocused_cb, ad);
-   evas_object_smart_callback_add(entry, "press", entry_press_cb, ad);
+                                  entry_cursor_changed_cb, NULL);
+   evas_object_smart_callback_add(entry, "unfocused", anchor_unfocused_cb,
+                                  NULL);
+   evas_object_smart_callback_add(entry, "press", entry_press_cb, NULL);
    evas_object_event_callback_add(entry, EVAS_CALLBACK_MOVE,
-                                  entry_move_cb, ad);
+                                  entry_move_cb, NULL);
 
    ad->anchor = elm_button_add(edit_obj_get(ed));
    ad->ed = ed;

-- 


Reply via email to