jaehyun pushed a commit to branch master.

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

commit f3b9f7f0d8aee9bee9d9b16221a0477e21e23712
Author: Jaehyun Cho <jae_hyun....@samsung.com>
Date:   Fri Apr 26 17:57:24 2019 +0900

    efl_ui: fix not to call _on_child_del() after container is deleted
    
    If efl_ref() is called to child, then child may not be deleted when
    container is deleted.
    This causes _on_child_del() is called after container is deleted and it
    causes crash if container data is accessed in _on_child_del().
    
    To resolve the above issue, all callbacks of child are deleted not to
    call _on_child_del() after container is deleted.
---
 src/lib/elementary/efl_ui_box.c              | 13 +++++++++++++
 src/lib/elementary/efl_ui_box.eo             |  1 +
 src/lib/elementary/efl_ui_relative_layout.c  | 13 +++++++++++++
 src/lib/elementary/efl_ui_relative_layout.eo |  1 +
 src/lib/elementary/efl_ui_table.c            | 13 +++++++++++++
 src/lib/elementary/efl_ui_table.eo           |  1 +
 6 files changed, 42 insertions(+)

diff --git a/src/lib/elementary/efl_ui_box.c b/src/lib/elementary/efl_ui_box.c
index ce3304132d..b58c37ab4f 100644
--- a/src/lib/elementary/efl_ui_box.c
+++ b/src/lib/elementary/efl_ui_box.c
@@ -180,6 +180,19 @@ _efl_ui_box_efl_object_constructor(Eo *obj, 
Efl_Ui_Box_Data *pd)
    return obj;
 }
 
+EOLIAN static void
+_efl_ui_box_efl_object_invalidate(Eo *obj, Efl_Ui_Box_Data *pd)
+{
+   Eo *child;
+
+   efl_invalidate(efl_super(obj, MY_CLASS));
+
+   EINA_LIST_FREE(pd->children, child)
+     {
+        efl_event_callback_array_del(child, efl_ui_box_callbacks(), obj);
+     }
+}
+
 /* CLEAN API BELOW */
 
 EOLIAN static int
diff --git a/src/lib/elementary/efl_ui_box.eo b/src/lib/elementary/efl_ui_box.eo
index 5e5950cd63..24f2928118 100644
--- a/src/lib/elementary/efl_ui_box.eo
+++ b/src/lib/elementary/efl_ui_box.eo
@@ -29,6 +29,7 @@ class @beta Efl.Ui.Box extends Efl.Ui.Widget implements 
Efl.Pack_Linear, Efl.Pac
    }
    implements {
       Efl.Object.constructor;
+      Efl.Object.invalidate;
       Efl.Canvas.Group.group_calculate;
       Efl.Gfx.Entity.position { set; }
       Efl.Gfx.Entity.size { set; }
diff --git a/src/lib/elementary/efl_ui_relative_layout.c 
b/src/lib/elementary/efl_ui_relative_layout.c
index 491c52f8af..d0d5ff441e 100644
--- a/src/lib/elementary/efl_ui_relative_layout.c
+++ b/src/lib/elementary/efl_ui_relative_layout.c
@@ -555,6 +555,19 @@ _efl_ui_relative_layout_efl_object_constructor(Eo *obj, 
Efl_Ui_Relative_Layout_D
    return obj;
 }
 
+EOLIAN static void
+_efl_ui_relative_layout_efl_object_invalidate(Eo *obj, 
Efl_Ui_Relative_Layout_Data *pd)
+{
+   Eo *child;
+
+   efl_invalidate(efl_super(obj, MY_CLASS));
+
+   EINA_LIST_FREE(pd->children, child)
+     {
+        efl_event_callback_array_del(child, 
efl_ui_relative_layout_callbacks(), pd);
+     }
+}
+
 EOLIAN static void
 _efl_ui_relative_layout_efl_object_destructor(Eo *obj, 
Efl_Ui_Relative_Layout_Data *pd)
 {
diff --git a/src/lib/elementary/efl_ui_relative_layout.eo 
b/src/lib/elementary/efl_ui_relative_layout.eo
index dff9c60801..b312070daa 100644
--- a/src/lib/elementary/efl_ui_relative_layout.eo
+++ b/src/lib/elementary/efl_ui_relative_layout.eo
@@ -69,6 +69,7 @@ class @beta Efl.Ui.Relative_Layout extends Efl.Ui.Widget 
implements Efl.Pack_Lay
    }
    implements {
       Efl.Object.constructor;
+      Efl.Object.invalidate;
       Efl.Object.destructor;
       Efl.Canvas.Group.group_calculate;
       Efl.Gfx.Entity.position { set; }
diff --git a/src/lib/elementary/efl_ui_table.c 
b/src/lib/elementary/efl_ui_table.c
index 402b812bc8..8a0c0c3cc5 100644
--- a/src/lib/elementary/efl_ui_table.c
+++ b/src/lib/elementary/efl_ui_table.c
@@ -234,6 +234,19 @@ _efl_ui_table_efl_object_constructor(Eo *obj, 
Efl_Ui_Table_Data *pd)
    return obj;
 }
 
+EOLIAN static void
+_efl_ui_table_efl_object_invalidate(Eo *obj, Efl_Ui_Table_Data *pd)
+{
+   Table_Item *gi;
+
+   efl_invalidate(efl_super(obj, MY_CLASS));
+
+   EINA_INLIST_FREE(EINA_INLIST_GET(pd->items), gi)
+     {
+        efl_event_callback_array_del(gi->object, efl_ui_table_callbacks(), 
obj);
+     }
+}
+
 EOLIAN static void
 _efl_ui_table_efl_pack_pack_padding_set(Eo *obj, Efl_Ui_Table_Data *pd, double 
h, double v, Eina_Bool scalable)
 {
diff --git a/src/lib/elementary/efl_ui_table.eo 
b/src/lib/elementary/efl_ui_table.eo
index dd4b0f7bc7..e2d34bfe0d 100644
--- a/src/lib/elementary/efl_ui_table.eo
+++ b/src/lib/elementary/efl_ui_table.eo
@@ -19,6 +19,7 @@ class @beta Efl.Ui.Table extends Efl.Ui.Widget implements 
Efl.Pack_Table, Efl.Pa
    }
    implements {
       Efl.Object.constructor;
+      Efl.Object.invalidate;
       Efl.Canvas.Group.group_calculate;
       Efl.Gfx.Entity.position { set; }
       Efl.Gfx.Entity.size { set; }

-- 


Reply via email to