ccdefname.c (krb5_cc_set_default_name, krb5_cc_default_name): Look up the default...
authorAlexandra Ellwood <lxs@mit.edu>
Thu, 12 Aug 2004 18:57:38 +0000 (18:57 +0000)
committerAlexandra Ellwood <lxs@mit.edu>
Thu, 12 Aug 2004 18:57:38 +0000 (18:57 +0000)
ticket: 2657

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@16655 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/os/ChangeLog
src/lib/krb5/os/ccdefname.c

index 7873efbd47c70e4d29e9eeccd6ce0b3452fbc269..52db164ff1fe575dce482a6adddc5abb5139a87f 100644 (file)
@@ -1,3 +1,10 @@
+2004-08-12  Alexandra Ellwood  <lxs@mit.edu>
+
+        * ccdefname.c (krb5_cc_set_default_name, krb5_cc_default_name):
+        Look up the default ccache name in krb5_cc_default_name, not
+        krb5_cc_set_default_name so that krb5_init_context doesn't
+        have to do work it might never use.
+
 2004-07-22  Ken Raeburn  <raeburn@mit.edu>
 
        * localaddr.c (get_lifconf): Define only if "struct lifconf" is
index 9db56d468c4071f696365ff9f870fd164ba192f7..f9ddecce4af23813d516156b653d83cf04e41309 100644 (file)
@@ -233,51 +233,67 @@ static krb5_error_code get_from_os(char *name_buf, int name_size)
 krb5_error_code KRB5_CALLCONV
 krb5_cc_set_default_name(krb5_context context, const char *name)
 {
-       char name_buf[1024];
-       char *new_name;
-       krb5_error_code retval;
-       krb5_os_context os_ctx;
-
-       if (!context || context->magic != KV5M_CONTEXT)
-               return KV5M_CONTEXT;
-
-       os_ctx = context->os_context;
-       
-       if (!name)
-               name = getenv(KRB5_ENV_CCNAME);
-
-       if (name) {
-               strncpy(name_buf, name, sizeof(name_buf));
-               name_buf[sizeof(name_buf)-1] = 0;
-       } else {
-               retval = get_from_os(name_buf, sizeof(name_buf));
-               if (retval)
-                       return retval;
-       }
-       new_name = malloc(strlen(name_buf)+1);
-       if (!new_name)
-               return ENOMEM;
-       strcpy(new_name, name_buf);
-       
-       if (os_ctx->default_ccname)
-               free(os_ctx->default_ccname);
-
-       os_ctx->default_ccname = new_name;
-       return 0;
+    krb5_error_code err = 0;
+    char *new_ccname = NULL;
+    
+    if (!context || context->magic != KV5M_CONTEXT) { err = KV5M_CONTEXT; }
+    
+    if (name != NULL) {
+        if (!err) {
+            /* If the name isn't NULL, make a copy of it */
+            new_ccname = malloc (strlen (name) + 1);
+            if (new_ccname == NULL) { err = ENOMEM; }
+        }
+        
+        if (!err) {
+            strcpy (new_ccname, name);
+        }
+    }
+    
+    if (!err) {
+        /* free the old ccname and store the new one */
+        krb5_os_context os_ctx = context->os_context;
+        if (os_ctx->default_ccname) { free (os_ctx->default_ccname); }
+        os_ctx->default_ccname = new_ccname;
+        new_ccname = NULL;  /* don't free */
+    }
+    
+    if (new_ccname != NULL) { free (new_ccname); }
+    
+    return err;
 }
 
        
 const char * KRB5_CALLCONV
 krb5_cc_default_name(krb5_context context)
 {
-       krb5_os_context os_ctx;
-
-       if (!context || context->magic != KV5M_CONTEXT)
-               return NULL;
-
-       os_ctx = context->os_context;
-       if (!os_ctx->default_ccname)
-               krb5_cc_set_default_name(context, NULL);
-
-       return(os_ctx->default_ccname);
+    krb5_error_code err = 0;
+    krb5_os_context os_ctx = NULL;
+    
+    if (!context || context->magic != KV5M_CONTEXT) { err = KV5M_CONTEXT; }
+    
+    if (!err) {
+        os_ctx = context->os_context;
+        
+        if (os_ctx->default_ccname == NULL) {
+            /* Default ccache name has not been set yet */
+            char *new_ccname = NULL;
+            char new_ccbuf[1024];
+            
+            /* try the environment variable first */
+            new_ccname = getenv(KRB5_ENV_CCNAME);
+            
+            if (new_ccname == NULL) {
+                /* fall back on the default ccache name for the OS */
+                new_ccname = new_ccbuf;
+                err = get_from_os (new_ccbuf, sizeof (new_ccbuf));
+            }
+            
+            if (!err) {
+                err = krb5_cc_set_default_name (context, new_ccname);
+            }
+        }
+    }
+    
+    return err ? NULL : os_ctx->default_ccname;
 }