|
|
22d06c |
diff -up evolution-data-server-3.8.5/addressbook/backends/ldap/e-book-backend-ldap.c.ldap-stop-view-crash evolution-data-server-3.8.5/addressbook/backends/ldap/e-book-backend-ldap.c
|
|
|
22d06c |
--- evolution-data-server-3.8.5/addressbook/backends/ldap/e-book-backend-ldap.c.ldap-stop-view-crash 2014-08-28 18:06:16.866096582 +0200
|
|
|
22d06c |
+++ evolution-data-server-3.8.5/addressbook/backends/ldap/e-book-backend-ldap.c 2014-08-28 18:06:24.734022099 +0200
|
|
|
22d06c |
@@ -238,6 +238,8 @@ struct _EBookBackendLDAPPrivate {
|
|
|
22d06c |
EBookBackendSummary *summary;
|
|
|
22d06c |
|
|
|
22d06c |
gboolean generate_cache_in_progress; /* set to TRUE, when updating local cache for offline */
|
|
|
22d06c |
+
|
|
|
22d06c |
+ GMutex view_mutex;
|
|
|
22d06c |
};
|
|
|
22d06c |
|
|
|
22d06c |
typedef void (*LDAPOpHandler)(LDAPOp *op, LDAPMessage *res);
|
|
|
22d06c |
@@ -4919,12 +4921,17 @@ ldap_search_handler (LDAPOp *op,
|
|
|
22d06c |
static void
|
|
|
22d06c |
ldap_search_dtor (LDAPOp *op)
|
|
|
22d06c |
{
|
|
|
22d06c |
+ EBookBackendLDAP *bl;
|
|
|
22d06c |
LDAPSearchOp *search_op = (LDAPSearchOp *) op;
|
|
|
22d06c |
|
|
|
22d06c |
d (printf ("ldap_search_dtor (%p)\n", search_op->view));
|
|
|
22d06c |
|
|
|
22d06c |
+ bl = E_BOOK_BACKEND_LDAP (e_data_book_view_get_backend (op->view));
|
|
|
22d06c |
+
|
|
|
22d06c |
/* unhook us from our EDataBookView */
|
|
|
22d06c |
+ g_mutex_lock (&bl->priv->view_mutex);
|
|
|
22d06c |
g_object_set_data (G_OBJECT (search_op->view), LDAP_SEARCH_OP_IDENT, NULL);
|
|
|
22d06c |
+ g_mutex_unlock (&bl->priv->view_mutex);
|
|
|
22d06c |
|
|
|
22d06c |
g_object_unref (search_op->view);
|
|
|
22d06c |
|
|
|
22d06c |
@@ -5043,7 +5050,9 @@ e_book_backend_ldap_search (EBookBackend
|
|
|
22d06c |
printf ("and took %ld.%03ld seconds\n", diff / 1000,diff % 1000);
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
+ g_mutex_lock (&bl->priv->view_mutex);
|
|
|
22d06c |
g_object_set_data (G_OBJECT (view), LDAP_SEARCH_OP_IDENT, op);
|
|
|
22d06c |
+ g_mutex_unlock (&bl->priv->view_mutex);
|
|
|
22d06c |
}
|
|
|
22d06c |
return;
|
|
|
22d06c |
} else {
|
|
|
22d06c |
@@ -5069,17 +5078,20 @@ static void
|
|
|
22d06c |
e_book_backend_ldap_stop_view (EBookBackend *backend,
|
|
|
22d06c |
EDataBookView *view)
|
|
|
22d06c |
{
|
|
|
22d06c |
+ EBookBackendLDAP *bl = E_BOOK_BACKEND_LDAP (backend);
|
|
|
22d06c |
LDAPSearchOp *op;
|
|
|
22d06c |
|
|
|
22d06c |
d (printf ("stop_view (%p)\n", view));
|
|
|
22d06c |
|
|
|
22d06c |
+ g_mutex_lock (&bl->priv->view_mutex);
|
|
|
22d06c |
op = g_object_get_data (G_OBJECT (view), LDAP_SEARCH_OP_IDENT);
|
|
|
22d06c |
+ g_object_set_data (G_OBJECT (view), LDAP_SEARCH_OP_IDENT, NULL);
|
|
|
22d06c |
+ g_mutex_unlock (&bl->priv->view_mutex);
|
|
|
22d06c |
+
|
|
|
22d06c |
if (op) {
|
|
|
22d06c |
op->aborted = TRUE;
|
|
|
22d06c |
ldap_op_finished ((LDAPOp *) op);
|
|
|
22d06c |
|
|
|
22d06c |
- g_object_set_data (G_OBJECT (view), LDAP_SEARCH_OP_IDENT, NULL);
|
|
|
22d06c |
-
|
|
|
22d06c |
g_free (op);
|
|
|
22d06c |
}
|
|
|
22d06c |
}
|
|
|
22d06c |
@@ -5572,6 +5584,7 @@ e_book_backend_ldap_finalize (GObject *o
|
|
|
22d06c |
g_rec_mutex_unlock (&priv->op_hash_mutex);
|
|
|
22d06c |
g_rec_mutex_unlock (&eds_ldap_handler_lock);
|
|
|
22d06c |
g_rec_mutex_clear (&priv->op_hash_mutex);
|
|
|
22d06c |
+ g_mutex_clear (&priv->view_mutex);
|
|
|
22d06c |
|
|
|
22d06c |
/* Remove the timeout before unbinding to avoid a race. */
|
|
|
22d06c |
if (priv->poll_timeout > 0) {
|
|
|
22d06c |
@@ -5886,6 +5899,7 @@ e_book_backend_ldap_init (EBookBackendLD
|
|
|
22d06c |
backend->priv->ldap_limit = 100;
|
|
|
22d06c |
backend->priv->id_to_op = g_hash_table_new (g_int_hash, g_int_equal);
|
|
|
22d06c |
|
|
|
22d06c |
+ g_mutex_init (&backend->priv->view_mutex);
|
|
|
22d06c |
g_rec_mutex_init (&backend->priv->op_hash_mutex);
|
|
|
22d06c |
|
|
|
22d06c |
if (g_getenv ("LDAP_DEBUG"))
|