From 13a9cb721194c8aa4ccf6ed6ef23e3ac8dd24037 Mon Sep 17 00:00:00 2001 From: Tomas Kuthan Date: Thu, 6 Mar 2014 13:05:24 +0100 Subject: [PATCH] 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 --- src/lib/gssapi/generic/util_ordering.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/lib/gssapi/generic/util_ordering.c b/src/lib/gssapi/generic/util_ordering.c index 9a1ce8966a..22c6be2e37 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 */ -- 2.47.2