Bug 660584 - Fix crash when removing user certificate

This commit is contained in:
Dan Vrátil
2011-09-30 23:15:38 +02:00
parent 75be8d7701
commit d8487201c1

View File

@ -127,7 +127,6 @@ static const gchar* authoritycerts_mime_types[] = { "application/x-x509-ca-cert
typedef struct {
GtkTreeView *treeview;
GtkTreeStore *treemodel;
GtkTreeModel *streemodel;
GHashTable *root_hash;
GtkMenu *popup_menu;
@ -474,6 +473,7 @@ select_certificate (CertPage *cp,
fcd.cp = cp;
fcd.cert = cert;
fcd.path = NULL;
gtk_tree_model_foreach (model, find_cert_cb, &fcd);
@ -483,7 +483,7 @@ select_certificate (CertPage *cp,
selection = gtk_tree_view_get_selection (cp->treeview);
gtk_tree_selection_select_path (selection, fcd.path);
gtk_tree_view_scroll_to_cell (cp->treeview, fcd.path, NULL, FALSE, 0.0, 0.0);
gtk_tree_view_scroll_to_cell (cp->treeview, fcd.path, NULL, TRUE, 0.5, 0.5);
gtk_tree_path_free (fcd.path);
}
}
@ -644,10 +644,17 @@ delete_cert (GtkWidget *button,
-1);
if (cert && e_cert_db_delete_cert (e_cert_db_peek (), cert)) {
GtkTreeIter child_iter;
GtkTreeIter child_iter, parent_iter;
gboolean has_parent;
GtkTreeStore *store = GTK_TREE_STORE (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (cp->streemodel)));
gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (cp->streemodel), &child_iter, &iter);
gtk_tree_store_remove (cp->treemodel, &child_iter);
has_parent = gtk_tree_model_iter_parent (GTK_TREE_MODEL (store), &parent_iter, &child_iter);
gtk_tree_store_remove (store, &child_iter);
/* Remove parent if it became empty */
if (has_parent && gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &parent_iter) == 0)
gtk_tree_store_remove (store, &parent_iter);
/* we need two unrefs here, one to unref the
* gtk_tree_model_get above, and one to unref
@ -861,14 +868,9 @@ cert_page_free (CertPage *cp)
if (!cp)
return;
/* Free all certificates in treeviews */
if (cp->treemodel) {
gtk_tree_model_foreach (GTK_TREE_MODEL (cp->treemodel),
(GtkTreeModelForeachFunc) free_cert, cp);
}
/* Free streemodel */
if (cp->streemodel) {
gtk_tree_model_foreach (GTK_TREE_MODEL (cp->streemodel),
(GtkTreeModelForeachFunc) free_cert, cp);
g_object_unref (cp->streemodel);
cp->streemodel = NULL;
}
@ -978,7 +980,6 @@ e_cert_manager_config_init (ECertManagerConfig *ecmc)
priv->yourcerts_page = cp;
cp->treeview = GTK_TREE_VIEW (e_builder_get_widget (priv->builder, "yourcerts-treeview"));
cp->streemodel = NULL;
cp->treemodel = NULL;
cp->view_button = e_builder_get_widget (priv->builder, "your-view-button");
cp->backup_button = e_builder_get_widget (priv->builder, "your-backup-button");
cp->backup_all_button = e_builder_get_widget (priv->builder, "your-backup-all-button");
@ -996,7 +997,6 @@ e_cert_manager_config_init (ECertManagerConfig *ecmc)
priv->contactcerts_page = cp;
cp->treeview = GTK_TREE_VIEW (e_builder_get_widget (priv->builder, "contactcerts-treeview"));
cp->streemodel = NULL;
cp->treemodel = NULL;
cp->view_button = e_builder_get_widget (priv->builder, "contact-view-button");
cp->backup_button = NULL;
cp->backup_all_button = NULL;
@ -1014,7 +1014,6 @@ e_cert_manager_config_init (ECertManagerConfig *ecmc)
priv->authoritycerts_page = cp;
cp->treeview = GTK_TREE_VIEW (e_builder_get_widget (priv->builder, "authoritycerts-treeview"));
cp->streemodel = NULL;
cp->treemodel = NULL;
cp->view_button = e_builder_get_widget (priv->builder, "authority-view-button");
cp->backup_button = NULL;
cp->backup_all_button = NULL;