commit e99c688913a7761c6adea9488ea9355f43539883 Author: Greg Hudson Date: Thu Jan 16 17:48:54 2014 -0500 Get time offsets for all keyring ccaches Move the time offset lookup from krb5_krcc_resolve to make_cache, so that we fetch time offsets for caches created by krb5_krcc_ptcursor_next. ticket: 7820 target_version: 1.12.2 tags: pullup diff --git a/src/lib/krb5/ccache/cc_keyring.c b/src/lib/krb5/ccache/cc_keyring.c index a0c8035..27bad9d 100644 --- a/src/lib/krb5/ccache/cc_keyring.c +++ b/src/lib/krb5/ccache/cc_keyring.c @@ -1077,11 +1077,13 @@ krb5_krcc_destroy(krb5_context context, krb5_ccache id) /* Create a cache handle for a cache ID. */ static krb5_error_code -make_cache(key_serial_t collection_id, key_serial_t cache_id, - const char *anchor_name, const char *collection_name, - const char *subsidiary_name, krb5_ccache *cache_out) +make_cache(krb5_context context, key_serial_t collection_id, + key_serial_t cache_id, const char *anchor_name, + const char *collection_name, const char *subsidiary_name, + krb5_ccache *cache_out) { krb5_error_code ret; + krb5_os_context os_ctx = &context->os_context; krb5_ccache ccache = NULL; krb5_krcc_data *d; key_serial_t pkey = 0; @@ -1108,6 +1110,18 @@ make_cache(key_serial_t collection_id, key_serial_t cache_id, ccache->data = d; ccache->magic = KV5M_CCACHE; *cache_out = ccache; + + /* 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, ccache, + &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 0; } @@ -1134,7 +1148,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; @@ -1161,22 +1174,11 @@ krb5_krcc_resolve(krb5_context context, krb5_ccache *id, const char *residual) if (cache_id < 0) cache_id = 0; - ret = make_cache(collection_id, cache_id, anchor_name, collection_name, - subsidiary_name, id); + ret = make_cache(context, collection_id, cache_id, anchor_name, + collection_name, subsidiary_name, id); 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); @@ -1928,8 +1930,9 @@ krb5_krcc_ptcursor_next(krb5_context context, krb5_cc_ptcursor cursor, cache_id = keyctl_search(data->collection_id, KRCC_KEY_TYPE_KEYRING, first_name, 0); if (cache_id != -1) { - return make_cache(data->collection_id, cache_id, data->anchor_name, - data->collection_name, first_name, cache_out); + return make_cache(context, data->collection_id, cache_id, + data->anchor_name, data->collection_name, + first_name, cache_out); } } @@ -1967,7 +1970,7 @@ krb5_krcc_ptcursor_next(krb5_context context, krb5_cc_ptcursor cursor, /* We found a valid key */ data->next_key++; - ret = make_cache(data->collection_id, key, data->anchor_name, + ret = make_cache(context, data->collection_id, key, data->anchor_name, data->collection_name, subsidiary_name, cache_out); free(description); return ret;