Author: jra
Date: 2006-01-18 19:25:16 +0000 (Wed, 18 Jan 2006)
New Revision: 13011

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=13011

Log:
Fix #3421 - it turns out krb5_kt_get_entry() on MIT
does an implicit open/read/close and blows away an
open keytab handle - so make sure we use a new
handle.
Wonderful analysis from Luke <[EMAIL PROTECTED]>
helped fix this.
Jeremy.

Modified:
   trunk/source/libsmb/clikrb5.c


Changeset:
Modified: trunk/source/libsmb/clikrb5.c
===================================================================
--- trunk/source/libsmb/clikrb5.c       2006-01-18 17:46:56 UTC (rev 13010)
+++ trunk/source/libsmb/clikrb5.c       2006-01-18 19:25:16 UTC (rev 13011)
@@ -770,7 +770,6 @@
 
 static krb5_error_code
 get_key_from_keytab(krb5_context context,
-                   krb5_keytab keytab,
                    krb5_const_principal server,
                    krb5_enctype enctype,
                    krb5_kvno kvno,
@@ -778,13 +777,18 @@
 {
        krb5_keytab_entry entry;
        krb5_error_code ret;
-       krb5_keytab real_keytab;
+       krb5_keytab keytab;
        char *name = NULL;
 
-       if (keytab == NULL) {
-               krb5_kt_default(context, &real_keytab);
-       } else {
-               real_keytab = keytab;
+       /* We have to open a new keytab handle here, as MIT does
+          an implicit open/getnext/close on krb5_kt_get_entry. We
+          may be in the middle of a keytab enumeration when this is
+          called. JRA. */
+
+       ret = krb5_kt_default(context, &keytab);
+       if (ret) {
+               DEBUG(0,("get_key_from_keytab: failed to open keytab: %s\n", 
error_message(ret)));
+               return ret;
        }
 
        if ( DEBUGLEVEL >= 10 ) {
@@ -795,7 +799,7 @@
        }
 
        ret = krb5_kt_get_entry(context,
-                               real_keytab,
+                               keytab,
                                server,
                                kvno,
                                enctype,
@@ -822,10 +826,7 @@
        smb_krb5_kt_free_entry(context, &entry);
        
 out:    
-       if (keytab == NULL) {
-               krb5_kt_close(context, real_keytab);
-       }
-               
+       krb5_kt_close(context, keytab);
        return ret;
 }
 
@@ -916,7 +917,6 @@
        }
 
        ret = get_key_from_keytab(context, 
-                                 keytab,
                                  server,
                                  enctype,
                                  kvno,

Reply via email to