[gnome-online-accounts/gnome-3-8] kerberos: Don't crash when an identity could not be looked up
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-online-accounts/gnome-3-8] kerberos: Don't crash when an identity could not be looked up
- Date: Thu, 29 Aug 2013 15:56:39 +0000 (UTC)
commit 92930750587a918d1fa6151b35118c34e9677752
Author: Debarshi Ray <debarshir gnome org>
Date: Wed Aug 28 19:35:26 2013 +0200
kerberos: Don't crash when an identity could not be looked up
Set an error in look_up_identity instead of only setting the op_res to
NULL, so that ensure_credentials_sync catches it.
Hold a reference to the GoaKerberosIdentity object when queueing a
notify. It is safer than trying to disconnect the source in dispose. We
were not checking for all the idle sources, and even if we did, it can
be racy if the object was getting disposed from a different thread.
Fixes: https://bugzilla.gnome.org/699491
src/goabackend/goakerberosprovider.c | 7 +++++++
src/goaidentity/goakerberosidentity.c | 6 ++----
2 files changed, 9 insertions(+), 4 deletions(-)
---
diff --git a/src/goabackend/goakerberosprovider.c b/src/goabackend/goakerberosprovider.c
index 50b889d..c5261f9 100644
--- a/src/goabackend/goakerberosprovider.c
+++ b/src/goabackend/goakerberosprovider.c
@@ -578,12 +578,15 @@ on_object_manager_ensured_for_look_up (GoaKerberosProvider *self,
const char *identifier;
GList *objects, *node;
GError *error;
+ gboolean found;
error = NULL;
+ found = FALSE;
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
&error))
{
+
g_simple_async_result_take_error (operation_result, error);
g_simple_async_result_complete_in_idle (operation_result);
g_object_unref (operation_result);
@@ -623,12 +626,16 @@ on_object_manager_ensured_for_look_up (GoaKerberosProvider *self,
candidate_identity,
(GDestroyNotify)
g_object_unref);
+ found = TRUE;
break;
}
g_object_unref (candidate_identity);
}
+ if (!found)
+ g_simple_async_result_set_error (operation_result, GOA_ERROR, GOA_ERROR_FAILED, "Failed to find an
identity");
+
g_list_free_full (objects, (GDestroyNotify) g_object_unref);
g_simple_async_result_complete_in_idle (G_SIMPLE_ASYNC_RESULT (operation_result));
g_object_unref (operation_result);
diff --git a/src/goaidentity/goakerberosidentity.c b/src/goaidentity/goakerberosidentity.c
index f62fbe2..ccd5998 100644
--- a/src/goaidentity/goakerberosidentity.c
+++ b/src/goaidentity/goakerberosidentity.c
@@ -125,9 +125,6 @@ goa_kerberos_identity_dispose (GObject *object)
g_clear_object (&self->priv->expiration_alarm);
G_UNLOCK (identity_lock);
- if (self->priv->expiration_time_idle_id != 0)
- g_source_remove (self->priv->expiration_time_idle_id);
-
G_OBJECT_CLASS (goa_kerberos_identity_parent_class)->dispose (object);
}
@@ -509,6 +506,7 @@ static void
clear_idle_id (NotifyRequest *request)
{
*request->idle_id = 0;
+ g_object_unref (request->self);
g_slice_free (NotifyRequest, request);
}
@@ -533,7 +531,7 @@ queue_notify (GoaKerberosIdentity *self,
}
request = g_slice_new0 (NotifyRequest);
- request->self = self;
+ request->self = g_object_ref (self);
request->idle_id = idle_id;
request->property_name = property_name;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]