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



commit 26537ec8d04f002a1171cb52e412937b214e7099
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()

 src/e-util/e-tree-table-adapter.c |    9 +++++++++
 src/e-util/e-tree-table-adapter.h |    2 ++
 src/mail/message-list.c           |    2 ++
 3 files changed, 13 insertions(+), 0 deletions(-)
---
diff --git a/src/e-util/e-tree-table-adapter.c b/src/e-util/e-tree-table-adapter.c
index 6fa3974..4ce10b0 100644
--- a/src/e-util/e-tree-table-adapter.c
+++ b/src/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/src/e-util/e-tree-table-adapter.h b/src/e-util/e-tree-table-adapter.h
index d9926f5..62182cf 100644
--- a/src/e-util/e-tree-table-adapter.h
+++ b/src/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/src/mail/message-list.c b/src/mail/message-list.c
index 52cd24b..718b96a 100644
--- a/src/mail/message-list.c
+++ b/src/mail/message-list.c
@@ -3838,6 +3838,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]