[gnome-online-accounts/wip/kerberos] identity: don't crash if credentials are updated shortly after sign out



commit 0a074679295e1bdafbaec4205b9d74732a7cab6c
Author: Ray Strode <rstrode redhat com>
Date:   Mon Aug 20 11:20:20 2012 -0400

    identity: don't crash if credentials are updated shortly after sign out

 src/goaidentity/goakerberosidentity.c |   43 +++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)
---
diff --git a/src/goaidentity/goakerberosidentity.c b/src/goaidentity/goakerberosidentity.c
index 2b77906..1d3ce20 100644
--- a/src/goaidentity/goakerberosidentity.c
+++ b/src/goaidentity/goakerberosidentity.c
@@ -1062,6 +1062,40 @@ on_kerberos_inquiry (krb5_context      kerberos_context,
 }
 
 static gboolean
+create_credential_cache (GoaKerberosIdentity  *self,
+                         GError              **error)
+{
+  krb5_ccache      default_cache;
+  const char      *cache_type;
+  krb5_error_code  error_code;
+
+  error_code = krb5_cc_default (self->priv->kerberos_context, &default_cache);
+
+  if (error_code == 0)
+    {
+      cache_type = krb5_cc_get_type (self->priv->kerberos_context, default_cache);
+
+      error_code = krb5_cc_new_unique (self->priv->kerberos_context,
+                                       cache_type,
+                                       NULL,
+                                       &self->priv->credentials_cache);
+    }
+
+  if (error_code != 0)
+    {
+      set_error_from_krb5_error_code (self,
+                                      error,
+                                      GOA_IDENTITY_ERROR_ALLOCATING_CREDENTIALS,
+                                      error_code,
+                                      _("Could not create credential cache: %k"));
+
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+static gboolean
 goa_kerberos_identity_update_credentials (GoaKerberosIdentity  *self,
                                           krb5_principal        principal,
                                           krb5_creds           *new_credentials,
@@ -1069,6 +1103,15 @@ goa_kerberos_identity_update_credentials (GoaKerberosIdentity  *self,
 {
   krb5_error_code   error_code;
 
+  if (self->priv->credentials_cache == NULL)
+    {
+      if (!create_credential_cache (self, error))
+        {
+          krb5_free_cred_contents (self->priv->kerberos_context, new_credentials);
+          goto out;
+        }
+    }
+
   error_code = krb5_cc_initialize (self->priv->kerberos_context,
                                    self->priv->credentials_cache,
                                    principal);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]