elm focus manager - dont leak child lists when updating focus order
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Thu, 31 Aug 2017 08:34:30 +0000 (17:34 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Thu, 31 Aug 2017 08:34:30 +0000 (17:34 +0900)
REALLY fix T5800 by duplicating lists rather than taking ownership

@fix

src/lib/elementary/efl_ui_focus_manager_calc.c
src/lib/elementary/efl_ui_focus_manager_calc.eo
src/lib/elementary/elc_fileselector.c
src/lib/elementary/elm_box.c
src/lib/elementary/elm_grid.c
src/lib/elementary/elm_table.c
src/lib/elementary/elm_toolbar.c
src/tests/elementary/elm_test_focus.c

index 87ae279..effd445 100644 (file)
@@ -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;
 
index 2b78b25..7d622c9 100644 (file)
@@ -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]]
         }
index 8cfa091..a3536c4 100644 (file)
@@ -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
index b6a617d..04420be 100644 (file)
@@ -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 *
index 7c85648..9b37e3e 100644 (file)
@@ -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);
+     }
 }
 
 
index 48e6dfa..d90bdc7 100644 (file)
@@ -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
index 011b842..53d834c 100644 (file)
@@ -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
index ab6c7f5..063d4cd 100644 (file)
@@ -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;