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

Re: Detect when KRB5CCNAME changes for certain server scenarios




10 feb 2007 kl. 04.03 skrev Michael B Allen:

> And what if you do not change uids?
>
> This is a real error that I ecountered in my application. Apache  
> workers
> all run as 'nobody' and do not change uids. Once the  
> default_cc_name is
> set for an httpd worker process all subsequent authentications by that
> worker will use the old ccache and init_sec_context will fail to find
> the desired cred.

I also think its a real problem, sorry if that didn't come across.

Lets try express this is code instead of words since I can't get  
across what I
the code to do.

Love

--- cache.c	13 Sep 2006 03:35:19 +1000	1.82
+++ cache.c	10 Feb 2007 08:02:45 +1100	
@@ -382,6 +382,45 @@
 }
 
 /*
+ * Detect if enviroment changed and will require a update to the
+ * default credential cache name.
+ */
+
+static HEIMDAL_MUTEX cc_mutex = HEIMDAL_MUTEX_INITIALIZER;
+static unsigned cc_uid;
+static const char *cc_env;
+
+/* XXX will getenv return same value or should we make a copy */
+
+static int
+cc_env_changed_p(void)
+{
+    int update = 0;
+    const char *s;
+    HEIMDAL_MUTEX_lock(&cc_mutex);
+    s = getenv("KRB5CCNAME");
+    if (cc_env == NULL) {
+	update = 1;
+	goto out;
+    }
+    if (s && s != cc_env) {
+	update = 1;
+	goto out;
+    }
+    if (cc_uid != (unsigned)getuid()) {
+	update = 1;
+	goto out;
+    }
+out:
+    if (update) {
+	cc_env = s;
+	cc_uid = (unsigned)getuid();
+    }
+    HEIMDAL_MUTEX_unlock(&cc_mutex);
+    return update;
+}
+
+/*
  * Return a pointer to a context static string containing the default
  * ccache name.
  */
@@ -389,7 +428,7 @@
 const char* KRB5_LIB_FUNCTION
 krb5_cc_default_name(krb5_context context)
 {
-    if (context->default_cc_name == NULL)
+    if (context->default_cc_name == NULL || cc_env_changed_p())
 	krb5_cc_set_default_name(context, NULL);
 
     return context->default_cc_name;