summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Kuthan <tkuthan@gmail.com>2014-03-06 13:05:24 +0100
committerGreg Hudson <ghudson@mit.edu>2014-03-18 11:55:39 -0400
commit13a9cb721194c8aa4ccf6ed6ef23e3ac8dd24037 (patch)
tree1b709656c3284efe6aa2dd6af3d0cdac28bb8c75
parenta47c4e68308331a630480cb62c2b7711432e0123 (diff)
downloadkrb5-13a9cb721194c8aa4ccf6ed6ef23e3ac8dd24037.tar.gz
krb5-13a9cb721194c8aa4ccf6ed6ef23e3ac8dd24037.tar.xz
krb5-13a9cb721194c8aa4ccf6ed6ef23e3ac8dd24037.zip
Fix GSS krb5 initial sequence number gap handling
Since #2040, the dummy queue element inserted by g_order_init no longer compares less than the initial sequence number, so we fail when the first few sequence numbers are received out of order. Properly detect when a sequence number fits between the dummy element and the first real queue element. [ghudson@mit.edu: rewrote commit message] ticket: 7872 target_version: 1.12.2 tags: pullup
-rw-r--r--src/lib/gssapi/generic/util_ordering.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/lib/gssapi/generic/util_ordering.c b/src/lib/gssapi/generic/util_ordering.c
index 9a1ce8966..22c6be2e3 100644
--- a/src/lib/gssapi/generic/util_ordering.c
+++ b/src/lib/gssapi/generic/util_ordering.c
@@ -195,6 +195,21 @@ g_order_check(void **vqueue, uint64_t seqnum)
return(GSS_S_UNSEQ_TOKEN);
}
}
+ /*
+ * Exception: if first token arrived out-of-order.
+ * In that case first two elements in queue are 0xFFFFFFFF and some k,
+ * where k > seqnum. We need to insert seqnum before k.
+ * We check this after the for-loop, because this should be rare.
+ */
+ if ((QELEM(q, q->start) == (((uint64_t)0 - 1) & q->mask)) &&
+ ((QELEM(q, q->start + 1) > seqnum))) {
+ queue_insert(q, q->start, seqnum);
+ if (q->do_replay && !q->do_sequence)
+ return(GSS_S_COMPLETE);
+ else
+ return(GSS_S_UNSEQ_TOKEN);
+
+ }
}
/* this should never happen */