From f3b9f7f0d8aee9bee9d9b16221a0477e21e23712 Mon Sep 17 00:00:00 2001 From: Jaehyun Cho Date: Fri, 26 Apr 2019 17:57:24 +0900 Subject: [PATCH] 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; }