raster pushed a commit to branch master.

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

commit bd6dcbb044ffea543f27cc69c421317bdea4a14a
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Thu Aug 31 17:34:30 2017 +0900

    elm focus manager - dont leak child lists when updating focus order
    
    REALLY fix T5800 by duplicating lists rather than taking ownership
    
    @fix
---
 src/lib/elementary/efl_ui_focus_manager_calc.c  |  8 ++++---
 src/lib/elementary/efl_ui_focus_manager_calc.eo |  2 +-
 src/lib/elementary/elc_fileselector.c           | 30 +++++++++++++------------
 src/lib/elementary/elm_box.c                    |  8 +++++--
 src/lib/elementary/elm_grid.c                   |  8 +++++--
 src/lib/elementary/elm_table.c                  |  8 +++++--
 src/lib/elementary/elm_toolbar.c                | 29 ++++++++++++++----------
 src/tests/elementary/elm_test_focus.c           |  1 +
 8 files changed, 58 insertions(+), 36 deletions(-)

diff --git a/src/lib/elementary/efl_ui_focus_manager_calc.c 
b/src/lib/elementary/efl_ui_focus_manager_calc.c
index 87ae279a43..effd445e6c 100644
--- a/src/lib/elementary/efl_ui_focus_manager_calc.c
+++ b/src/lib/elementary/efl_ui_focus_manager_calc.c
@@ -551,6 +551,7 @@ _efl_ui_focus_manager_calc_register_logical(Eo *obj, 
Efl_Ui_Focus_Manager_Calc_D
 
         tmp = eina_list_clone(T(pnode).saved_order);
         efl_ui_focus_manager_calc_update_order(obj, parent, tmp);
+        eina_list_free(tmp);
      }
 
    return EINA_TRUE;
@@ -593,6 +594,7 @@ _efl_ui_focus_manager_calc_register(Eo *obj, 
Efl_Ui_Focus_Manager_Calc_Data *pd,
 
         tmp = eina_list_clone(T(pnode).saved_order);
         efl_ui_focus_manager_calc_update_order(obj, parent, tmp);
+        eina_list_free(tmp);
      }
 
    return EINA_TRUE;
@@ -692,7 +694,7 @@ _efl_ui_focus_manager_calc_update_order(Eo *obj, 
Efl_Ui_Focus_Manager_Calc_Data
      return;
 
    ELM_SAFE_FREE(T(pnode).saved_order, eina_list_free);
-   T(pnode).saved_order = order;
+   T(pnode).saved_order = eina_list_clone(order);
 
    //get all nodes from the subset
    EINA_LIST_FOREACH(order, n, o)
@@ -725,14 +727,14 @@ _efl_ui_focus_manager_calc_update_children(Eo *obj 
EINA_UNUSED, Efl_Ui_Focus_Man
    Node *pnode;
    Efl_Ui_Focus_Object *o;
    Eina_Bool fail = EINA_FALSE;
-   Eina_List *node_order = NULL;
+   Eina_List *node_order = NULL, *n;
 
    pnode = node_get(obj, pd, parent);
    if (!pnode)
      return EINA_FALSE;
 
    //get all nodes from the subset
-   EINA_LIST_FREE(order, o)
+   EINA_LIST_FOREACH(order, n, o)
      {
         Node *tmp;
 
diff --git a/src/lib/elementary/efl_ui_focus_manager_calc.eo 
b/src/lib/elementary/efl_ui_focus_manager_calc.eo
index 2b78b259ac..7d622c9786 100644
--- a/src/lib/elementary/efl_ui_focus_manager_calc.eo
+++ b/src/lib/elementary/efl_ui_focus_manager_calc.eo
@@ -66,7 +66,7 @@ class Efl.Ui.Focus.Manager.Calc (Efl.Object, 
Efl.Ui.Focus.Manager) {
             [[Give the list of children a different order.]]
             params {
                 parent : Efl.Ui.Focus.Object @nonull; [[the parent to update]]
-                children : own(list<Efl.Ui.Focus.Object>); [[the list with the 
new order]]
+                children : list<Efl.Ui.Focus.Object>; [[the list with the new 
order]]
             }
             return : bool; [[$true if successful, $false otherwise]]
         }
diff --git a/src/lib/elementary/elc_fileselector.c 
b/src/lib/elementary/elc_fileselector.c
index 8cfa0911cf..a3536c4b33 100644
--- a/src/lib/elementary/elc_fileselector.c
+++ b/src/lib/elementary/elc_fileselector.c
@@ -96,24 +96,26 @@ EFL_CALLBACKS_ARRAY_DEFINE(monitoring_callbacks,
 static void
 _focus_chain_update(Eo *obj, Elm_Fileselector_Data *pd)
 {
-   Eina_List *tmp = NULL;
+   Eo *fman = efl_ui_focus_user_manager_get(obj);
+   if (fman)
+     {
+        Eina_List *tmp = NULL;
 
 #define A(p) tmp = eina_list_append(tmp, p);
-
-   A(pd->up_button)
-   A(pd->home_button)
-   A(pd->search_entry)
-   A(pd->files_view)
-   A(pd->path_entry)
-   A(pd->name_entry)
-   A(pd->filter_hoversel)
-   A(pd->ok_button)
-   A(pd->cancel_button)
-
-
+        A(pd->up_button)
+        A(pd->home_button)
+        A(pd->search_entry)
+        A(pd->files_view)
+        A(pd->path_entry)
+        A(pd->name_entry)
+        A(pd->filter_hoversel)
+        A(pd->ok_button)
+        A(pd->cancel_button)
 #undef A
 
-   efl_ui_focus_manager_calc_update_order(efl_ui_focus_user_manager_get(obj), 
obj, tmp);
+        
efl_ui_focus_manager_calc_update_order(efl_ui_focus_user_manager_get(obj), obj, 
tmp);
+        eina_list_free(tmp);
+     }
 }
 
 static void
diff --git a/src/lib/elementary/elm_box.c b/src/lib/elementary/elm_box.c
index b6a617dd2b..04420be35f 100644
--- a/src/lib/elementary/elm_box.c
+++ b/src/lib/elementary/elm_box.c
@@ -26,9 +26,13 @@ static void
 _focus_order_flush(Eo *obj, Elm_Box_Data *pd EINA_UNUSED)
 {
    Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS);
-   Eina_List *order = evas_object_box_children_get(wpd->resize_obj);
+   if (wpd->focus.manager)
+     {
+        Eina_List *order = evas_object_box_children_get(wpd->resize_obj);
 
-   efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        eina_list_free(order);
+     }
 }
 
 static void *
diff --git a/src/lib/elementary/elm_grid.c b/src/lib/elementary/elm_grid.c
index 7c85648882..9b37e3e87e 100644
--- a/src/lib/elementary/elm_grid.c
+++ b/src/lib/elementary/elm_grid.c
@@ -17,9 +17,13 @@ static void
 _focus_order_flush(Eo *obj)
 {
    Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS);
-   Eina_List *order = evas_object_grid_children_get(wpd->resize_obj);
+   if (wpd->focus.manager)
+     {
+        Eina_List *order = evas_object_grid_children_get(wpd->resize_obj);
 
-   efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        eina_list_free(order);
+     }
 }
 
 
diff --git a/src/lib/elementary/elm_table.c b/src/lib/elementary/elm_table.c
index 48e6dfa62a..d90bdc7d8d 100644
--- a/src/lib/elementary/elm_table.c
+++ b/src/lib/elementary/elm_table.c
@@ -18,9 +18,13 @@ static void
 _focus_order_flush(Eo *obj)
 {
    Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS);
-   Eina_List *order = evas_object_table_children_get(wpd->resize_obj);
+   if (wpd->focus.manager)
+     {
+        Eina_List *order = evas_object_table_children_get(wpd->resize_obj);
 
-   efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        eina_list_free(order);
+     }
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c
index 011b842cc2..53d834c50b 100644
--- a/src/lib/elementary/elm_toolbar.c
+++ b/src/lib/elementary/elm_toolbar.c
@@ -101,24 +101,29 @@ _item_focus_eval(Elm_Toolbar_Item_Data *pd)
 static void
 _item_focus_eval_all(Elm_Toolbar *obj, Elm_Toolbar_Data *pd)
 {
-   Elm_Toolbar_Item_Data *it;
    Elm_Widget_Smart_Data *wpd;
-   Eina_List *order = NULL;
 
    wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS);
-   EINA_INLIST_FOREACH(pd->items, it)
+   if (wpd->focus.manager)
      {
-        _item_focus_eval(it);
-        order = eina_list_append(order, EO_OBJ(it));
-     }
+        Eina_List *order = NULL;
+        Elm_Toolbar_Item_Data *it;
 
-   if (pd->more_item)
-     {
-        _item_focus_eval(pd->more_item);
-        order = eina_list_append(order, EO_OBJ(pd->more_item));
-     }
+        EINA_INLIST_FOREACH(pd->items, it)
+          {
+             _item_focus_eval(it);
+             order = eina_list_append(order, EO_OBJ(it));
+          }
 
-   efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        if (pd->more_item)
+          {
+             _item_focus_eval(pd->more_item);
+             order = eina_list_append(order, EO_OBJ(pd->more_item));
+          }
+
+        efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order);
+        eina_list_free(order);
+     }
 }
 
 static int
diff --git a/src/tests/elementary/elm_test_focus.c 
b/src/tests/elementary/elm_test_focus.c
index ab6c7f558d..063d4cdaa3 100644
--- a/src/tests/elementary/elm_test_focus.c
+++ b/src/tests/elementary/elm_test_focus.c
@@ -320,6 +320,7 @@ START_TEST(order_check)
    order = eina_list_append(order, child3);
    order = eina_list_append(order, child1);
    ck_assert_int_eq(efl_ui_focus_manager_calc_update_children(m, root, order), 
1);
+   eina_list_free(order);
 
    order = NULL;
 

-- 


Reply via email to