[evolution/gnome-3-22] Bug 767228 - Use-after-free in MessageList rebuild under clear_tree()



commit a62f99a29a4753dbdc4fcd067d1cf25152e9e711
Author: Milan Crha <mcrha redhat com>
Date:   Mon Nov 28 16:51:48 2016 +0100

    Bug 767228 - Use-after-free in MessageList rebuild under clear_tree()

 e-util/e-tree-table-adapter.c |    9 +++++++++
 e-util/e-tree-table-adapter.h |    2 ++
 mail/message-list.c           |    2 ++
 3 files changed, 13 insertions(+), 0 deletions(-)
---
diff --git a/e-util/e-tree-table-adapter.c b/e-util/e-tree-table-adapter.c
index 6fa3974..4ce10b0 100644
--- a/e-util/e-tree-table-adapter.c
+++ b/e-util/e-tree-table-adapter.c
@@ -1659,3 +1659,12 @@ e_tree_table_adapter_node_get_next (ETreeTableAdapter *etta,
        return NULL;
 }
 
+void
+e_tree_table_adapter_clear_nodes_silent (ETreeTableAdapter *etta)
+{
+       g_return_if_fail (E_IS_TREE_TABLE_ADAPTER (etta));
+
+       if (etta->priv->root)
+               kill_gnode (etta->priv->root, etta);
+       resize_map (etta, 0);
+}
diff --git a/e-util/e-tree-table-adapter.h b/e-util/e-tree-table-adapter.h
index d9926f5..62182cf 100644
--- a/e-util/e-tree-table-adapter.h
+++ b/e-util/e-tree-table-adapter.h
@@ -133,6 +133,8 @@ xmlDoc *    e_tree_table_adapter_save_expanded_state_xml
 void           e_tree_table_adapter_load_expanded_state_xml
                                                (ETreeTableAdapter *etta,
                                                 xmlDoc *doc);
+void           e_tree_table_adapter_clear_nodes_silent
+                                               (ETreeTableAdapter *etta);
 
 G_END_DECLS
 
diff --git a/mail/message-list.c b/mail/message-list.c
index b585975..be68e85 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -3827,6 +3827,8 @@ clear_tree (MessageList *message_list,
                        message_list, message_list->priv->tree_model_root);
        }
 
+       e_tree_table_adapter_clear_nodes_silent (e_tree_get_table_adapter (E_TREE (message_list)));
+
        /* Create a new placeholder root node. */
        message_list_tree_model_insert (message_list, NULL, 0, NULL);
        g_warn_if_fail (message_list->priv->tree_model_root != NULL);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]