From: Tomas Kuthan Date: Thu, 6 Mar 2014 12:05:24 +0000 (+0100) Subject: Fix GSS krb5 initial sequence number gap handling X-Git-Tag: krb5-1.13-alpha1~183 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13a9cb721194c8aa4ccf6ed6ef23e3ac8dd24037;p=thirdparty%2Fkrb5.git 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 --- 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 */