[krbdev.mit.edu #7820] gss_init_sec_context() can ignore time sync with keyring caches

nalin@redhat.com via RT rt-comment at krbdev.mit.edu
Wed Jan 15 17:38:59 EST 2014


diff --git a/src/lib/gssapi/krb5/init_sec_context.c b/src/lib/gssapi/krb5/init_sec_context.c
index 1bc69ca..af66d2e 100644
--- a/src/lib/gssapi/krb5/init_sec_context.c
+++ b/src/lib/gssapi/krb5/init_sec_context.c
@@ -117,18 +117,18 @@ int krb5_gss_dbg_client_expcreds = 0;
  * Common code which fetches the correct krb5 credentials from the
  * ccache.
  */
-static krb5_error_code get_credentials(context, cred, server, now,
+static krb5_error_code get_credentials(context, cred, server,
                                        endtime, out_creds)
     krb5_context context;
     krb5_gss_cred_id_t cred;
     krb5_gss_name_t server;
-    krb5_timestamp now;
     krb5_timestamp endtime;
     krb5_creds **out_creds;
 {
     krb5_error_code     code;
     krb5_creds          in_creds, evidence_creds, *result_creds = NULL;
     krb5_flags          flags = 0;
+    krb5_timestamp      now;
 
     *out_creds = NULL;
 
@@ -209,8 +209,12 @@ static krb5_error_code get_credentials(context, cred, server, now,
     /*
      * Enforce a stricter limit (without timeskew forgiveness at the
      * boundaries) because accept_sec_context code is also similarly
-     * non-forgiving.
+     * non-forgiving.  Re-read the time here to get the benefit of
+     * KDC time sync that would be reset to match the creds, in case
+     * we're using it.
      */
+    if ((code = krb5_timeofday(context, &now)))
+        goto cleanup;
     if (!krb5_gss_dbg_client_expcreds && result_creds->times.endtime < now) {
         code = KRB5KRB_AP_ERR_TKT_EXPIRED;
         goto cleanup;
@@ -580,7 +584,7 @@ kg_new_connection(
                                   &ctx->there)))
         goto cleanup;
 
-    code = get_credentials(context, cred, ctx->there, now,
+    code = get_credentials(context, cred, ctx->there,
                            ctx->krb_times.endtime, &k_cred);
     if (code)
         goto cleanup;
diff --git a/src/lib/krb5/ccache/cc_keyring.c b/src/lib/krb5/ccache/cc_keyring.c
index a0c8035..35ed5ad 100644
--- a/src/lib/krb5/ccache/cc_keyring.c
+++ b/src/lib/krb5/ccache/cc_keyring.c
@@ -1134,7 +1134,6 @@ make_cache(key_serial_t collection_id, key_serial_t cache_id,
 static krb5_error_code KRB5_CALLCONV
 krb5_krcc_resolve(krb5_context context, krb5_ccache *id, const char *residual)
 {
-    krb5_os_context os_ctx = &context->os_context;
     krb5_error_code ret;
     key_serial_t collection_id, cache_id;
     char *anchor_name = NULL, *collection_name = NULL, *subsidiary_name = NULL;
@@ -1166,17 +1165,6 @@ krb5_krcc_resolve(krb5_context context, krb5_ccache *id, const char *residual)
     if (ret)
         goto cleanup;
 
-    /* Lookup time offsets if necessary. */
-    if ((context->library_options & KRB5_LIBOPT_SYNC_KDCTIME) &&
-        !(os_ctx->os_flags & KRB5_OS_TOFFSET_VALID)) {
-        if (krb5_krcc_get_time_offsets(context, *id,
-                                       &os_ctx->time_offset,
-                                       &os_ctx->usec_offset) == 0) {
-            os_ctx->os_flags &= ~KRB5_OS_TOFFSET_TIME;
-            os_ctx->os_flags |= KRB5_OS_TOFFSET_VALID;
-        }
-    }
-
 cleanup:
     free(anchor_name);
     free(collection_name);
@@ -1201,6 +1189,7 @@ static krb5_error_code KRB5_CALLCONV
 krb5_krcc_start_seq_get(krb5_context context, krb5_ccache id,
                         krb5_cc_cursor * cursor)
 {
+    krb5_os_context os_ctx = &context->os_context;
     krb5_krcc_cursor krcursor;
     krb5_krcc_data *d;
     void *keys;
@@ -1238,6 +1227,18 @@ krb5_krcc_start_seq_get(krb5_context context, krb5_ccache id,
 
     k5_cc_mutex_unlock(context, &d->lock);
     *cursor = (krb5_cc_cursor) krcursor;
+
+    /* Lookup time offsets if necessary. */
+    if ((context->library_options & KRB5_LIBOPT_SYNC_KDCTIME) &&
+        !(os_ctx->os_flags & KRB5_OS_TOFFSET_VALID)) {
+        if (krb5_krcc_get_time_offsets(context, id,
+                                       &os_ctx->time_offset,
+                                       &os_ctx->usec_offset) == 0) {
+            os_ctx->os_flags &= ~KRB5_OS_TOFFSET_TIME;
+            os_ctx->os_flags |= KRB5_OS_TOFFSET_VALID;
+        }
+    }
+
     return KRB5_OK;
 }
 
@@ -1265,6 +1266,7 @@ static krb5_error_code KRB5_CALLCONV
 krb5_krcc_next_cred(krb5_context context, krb5_ccache id,
                     krb5_cc_cursor * cursor, krb5_creds * creds)
 {
+    krb5_os_context os_ctx = &context->os_context;
     krb5_krcc_cursor krcursor;
     krb5_error_code kret;
     int     psize;
@@ -1308,6 +1310,17 @@ krb5_krcc_next_cred(krb5_context context, krb5_ccache id,
 
     kret = krb5_krcc_parse_cred(context, creds, payload, psize);
 
+    /* Lookup time offsets if necessary. */
+    if ((context->library_options & KRB5_LIBOPT_SYNC_KDCTIME) &&
+        !(os_ctx->os_flags & KRB5_OS_TOFFSET_VALID)) {
+        if (krb5_krcc_get_time_offsets(context, id,
+                                       &os_ctx->time_offset,
+                                       &os_ctx->usec_offset) == 0) {
+            os_ctx->os_flags &= ~KRB5_OS_TOFFSET_TIME;
+            os_ctx->os_flags |= KRB5_OS_TOFFSET_VALID;
+        }
+    }
+
 freepayload:
     if (payload) free(payload);
     return kret;



More information about the krb5-bugs mailing list