[gnome-online-accounts/gnome-3-8] kerberos: Don't crash when an identity could not be looked up



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]