svn rev #25681: branches/krb5-1-10/src/kdc/
tlyu@MIT.EDU
tlyu at MIT.EDU
Fri Feb 10 16:19:07 EST 2012
http://src.mit.edu/fisheye/changelog/krb5/?cs=25681
Commit By: tlyu
Log Message:
ticket: 7082
version_fixed: 1.10.1
status: resolved
Pull up r25660 from trunk
------------------------------------------------------------------------
r25660 | ghudson | 2012-01-26 16:56:16 -0500 (Thu, 26 Jan 2012) | 22 lines
ticket: 7082
subject: Various lookaside cache fixes
target_version: 1.10
tags: pullup
Don't touch the lookaside cache if we're responding with a lookaside
cache entry. Also, leave the null entry behind if we're deliberately
dropping a request (a rare case) so that we don't have to process it
again. Fixes several lookaside problems in 1.10:
* When dropping a request because it was already being processed, we
were erroneously removing the null entry, causing us to process the
request again upon a second retransmit.
* When responding to a finished request with a lookaside entry, we
were removing and re-adding the entry to the cache, resetting its
time and performing unnecessary work.
* We were not caching responses we couldn't deliver because they were
too big for UDP, causing us to re-process the request when it came
in again via TCP instead of simply delivering the cached response.
Changed Files:
U branches/krb5-1-10/src/kdc/dispatch.c
Modified: branches/krb5-1-10/src/kdc/dispatch.c
===================================================================
--- branches/krb5-1-10/src/kdc/dispatch.c 2012-02-10 21:19:01 UTC (rev 25680)
+++ branches/krb5-1-10/src/kdc/dispatch.c 2012-02-10 21:19:07 UTC (rev 25681)
@@ -44,21 +44,12 @@
};
static void
-finish_dispatch(void *arg, krb5_error_code code, krb5_data *response)
+finish_dispatch(struct dispatch_state *state, krb5_error_code code,
+ krb5_data *response)
{
- struct dispatch_state *state = arg;
- loop_respond_fn oldrespond;
- void *oldarg;
+ loop_respond_fn oldrespond = state->respond;
+ void *oldarg = state->arg;
- assert(state);
- oldrespond = state->respond;
- oldarg = state->arg;
-
-#ifndef NOCACHE
- /* Remove our NULL cache entry to indicate request completion. */
- kdc_remove_lookaside(kdc_context, state->request);
-#endif
-
if (state->is_tcp == 0 && response &&
response->length > max_dgram_reply_size) {
krb5_free_data(kdc_context, response);
@@ -70,14 +61,27 @@
error_message(code));
}
+ free(state);
+ (*oldrespond)(oldarg, code, response);
+}
+
+static void
+finish_dispatch_cache(void *arg, krb5_error_code code, krb5_data *response)
+{
+ struct dispatch_state *state = arg;
+
#ifndef NOCACHE
- /* put the response into the lookaside buffer */
- else if (!code && response)
+ /* Remove the null cache entry unless we actually want to discard this
+ * request. */
+ if (code != KRB5KDC_ERR_DISCARD)
+ kdc_remove_lookaside(kdc_context, state->request);
+
+ /* Put the response into the lookaside buffer (if we produced one). */
+ if (code == 0 && response != NULL)
kdc_insert_lookaside(state->request, response);
#endif
- free(state);
- (*oldrespond)(oldarg, code, response);
+ finish_dispatch(state, code, response);
}
void
@@ -167,7 +171,7 @@
* process_as_req frees the request if it is called
*/
if (!(retval = setup_server_realm(as_req->server))) {
- process_as_req(as_req, pkt, from, vctx, finish_dispatch,
+ process_as_req(as_req, pkt, from, vctx, finish_dispatch_cache,
state);
return;
}
More information about the cvs-krb5
mailing list