Now a kvno invocation will only open the ccache file a small number of
authorKen Raeburn <raeburn@mit.edu>
Tue, 16 Nov 2004 05:28:38 +0000 (05:28 +0000)
committerKen Raeburn <raeburn@mit.edu>
Tue, 16 Nov 2004 05:28:38 +0000 (05:28 +0000)
times, but there's still excessive seeking and re-reading of data
happening.

* cc_retr.c (krb5_cc_retrieve_cred_seq): Temporarily clear the
KRB5_TC_OPENCLOSE flag on the credentials cache while reading multiple entries
from it.

ticket: 2763
status: open

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

src/lib/krb5/ccache/ChangeLog
src/lib/krb5/ccache/cc_retr.c

index 9fe362e51e30edb2a48a2b5523f9f8e4ae0c11ae..c9e2972d5c40d023c9501bed5a5e32efce12b26c 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-16  Ken Raeburn  <raeburn@mit.edu>
+
+       * cc_retr.c (krb5_cc_retrieve_cred_seq): Temporarily clear the
+       KRB5_TC_OPENCLOSE flag on the credentials cache while reading
+       multiple entries from it.
+
 2004-11-15  Ken Raeburn  <raeburn@mit.edu>
 
        * cc_file.c (krb5_fcc_get_flags): New function.
index 5ddb2cc63dc94bcd128137413030ad015b8968fc..cadd3e5fe805a1fac6a161c78e3d285d37f19e2b 100644 (file)
@@ -193,7 +193,9 @@ krb5int_cc_creds_match_request(krb5_context context, krb5_flags whichfields, krb
 }
 
 static krb5_error_code
-krb5_cc_retrieve_cred_seq (krb5_context context, krb5_ccache id, krb5_flags whichfields, krb5_creds *mcreds, krb5_creds *creds, int nktypes, krb5_enctype *ktypes)
+krb5_cc_retrieve_cred_seq (krb5_context context, krb5_ccache id,
+                          krb5_flags whichfields, krb5_creds *mcreds,
+                          krb5_creds *creds, int nktypes, krb5_enctype *ktypes)
 {
      /* This function could be considerably faster if it kept indexing */
      /* information.. sounds like a "next version" idea to me. :-) */
@@ -206,11 +208,20 @@ krb5_cc_retrieve_cred_seq (krb5_context context, krb5_ccache id, krb5_flags whic
        int pref;
      } fetched, best;
      int have_creds = 0;
+     krb5_flags oflags = 0;
 #define fetchcreds (fetched.creds)
 
-     kret = krb5_cc_start_seq_get(context, id, &cursor);
+     kret = krb5_cc_get_flags(context, id, &oflags);
      if (kret != KRB5_OK)
          return kret;
+     if (oflags & KRB5_TC_OPENCLOSE)
+        (void) krb5_cc_set_flags(context, id, oflags & ~KRB5_TC_OPENCLOSE);
+     kret = krb5_cc_start_seq_get(context, id, &cursor);
+     if (kret != KRB5_OK) {
+         if (oflags & KRB5_TC_OPENCLOSE)
+              krb5_cc_set_flags(context, id, oflags);
+         return kret;
+     }
 
      while ((kret = krb5_cc_next_cred(context, id, &cursor, &fetchcreds)) == KRB5_OK) {
       if (krb5int_cc_creds_match_request(context, whichfields, mcreds, &fetchcreds))
@@ -231,6 +242,8 @@ krb5_cc_retrieve_cred_seq (krb5_context context, krb5_ccache id, krb5_flags whic
              } else {
                  krb5_cc_end_seq_get(context, id, &cursor);
                  *creds = fetchcreds;
+                 if (oflags & KRB5_TC_OPENCLOSE)
+                     krb5_cc_set_flags(context, id, oflags);
                  return KRB5_OK;
              }
          }
@@ -241,6 +254,8 @@ krb5_cc_retrieve_cred_seq (krb5_context context, krb5_ccache id, krb5_flags whic
 
      /* If we get here, a match wasn't found */
      krb5_cc_end_seq_get(context, id, &cursor);
+     if (oflags & KRB5_TC_OPENCLOSE)
+        krb5_cc_set_flags(context, id, oflags);
      if (have_creds) {
         *creds = best.creds;
         return KRB5_OK;