/*
- * Copyright (c) 2010, JANET(UK)
+ * Copyright (c) 2011, JANET(UK)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
*/
/*
- * $Id: util_ordering.c 23457 2009-12-08 00:04:48Z tlyu $
- */
-
-/*
- * functions to check sequence numbers for replay and sequencing
+ * Functions to check sequence numbers for replay and sequencing
*/
#include "gssapiP_eap.h"
/* move all the elements (after,last] up one slot */
- for (i=q->start+q->length-1; i>after; i--)
+ for (i = q->start + q->length - 1; i > after; i--)
QELEM(q,i+1) = QELEM(q,i);
/* fill in slot after+1 */
}
}
-int
-sequenceInit(void **vqueue, uint64_t seqnum,
- int do_replay, int do_sequence, int wide_nums)
+OM_uint32
+sequenceInit(OM_uint32 *minor,
+ void **vqueue,
+ uint64_t seqnum,
+ int do_replay,
+ int do_sequence,
+ int wide_nums)
{
queue *q;
- if ((q = (queue *) malloc(sizeof(queue))) == NULL)
- return(ENOMEM);
-
- /* This stops valgrind from complaining about writing uninitialized
- data if the caller exports the context and writes it to a file.
- We don't actually use those bytes at all, but valgrind still
- complains. */
- memset(q, 0xfe, sizeof(*q));
+ q = (queue *)GSSEAP_CALLOC(1, sizeof(queue));
+ if (q == NULL) {
+ *minor = ENOMEM;
+ return GSS_S_FAILURE;
+ }
q->do_replay = do_replay;
q->do_sequence = do_sequence;
q->firstnum = seqnum;
q->elem[q->start] = ((uint64_t)0 - 1) & q->mask;
- *vqueue = (void *) q;
- return(0);
+ *vqueue = (void *)q;
+
+ return GSS_S_COMPLETE;
}
-int
-sequenceCheck(void **vqueue, uint64_t seqnum)
+OM_uint32
+sequenceCheck(OM_uint32 *minor,
+ void **vqueue,
+ uint64_t seqnum)
{
queue *q;
int i;
q = (queue *) (*vqueue);
if (!q->do_replay && !q->do_sequence)
- return(GSS_S_COMPLETE);
+ return GSS_S_COMPLETE;
/* All checks are done relative to the initial sequence number, to
avoid (or at least put off) the pain of wrapping. */
expected = (QELEM(q,q->start+q->length-1)+1) & q->mask;
if (seqnum == expected) {
queue_insert(q, q->start+q->length-1, seqnum);
- return(GSS_S_COMPLETE);
+ return GSS_S_COMPLETE;
}
/* rule 2: > expected sequence number */
if ((seqnum > expected)) {
queue_insert(q, q->start+q->length-1, seqnum);
if (q->do_replay && !q->do_sequence)
- return(GSS_S_COMPLETE);
+ return GSS_S_COMPLETE;
else
- return(GSS_S_GAP_TOKEN);
+ return GSS_S_GAP_TOKEN;
}
/* rule 3: seqnum < seqnum(first) */
(seqnum & (1 + (q->mask >> 1)))
) {
if (q->do_replay && !q->do_sequence)
- return(GSS_S_OLD_TOKEN);
+ return GSS_S_OLD_TOKEN;
else
- return(GSS_S_UNSEQ_TOKEN);
+ return GSS_S_UNSEQ_TOKEN;
}
/* rule 4+5: seqnum in [seqnum(first),seqnum(last)] */
else {
- if (seqnum == QELEM(q,q->start+q->length-1))
- return(GSS_S_DUPLICATE_TOKEN);
+ if (seqnum == QELEM(q,q->start+q->length - 1))
+ return GSS_S_DUPLICATE_TOKEN;
- for (i=q->start; i<q->start+q->length-1; i++) {
+ for (i = q->start; i < q->start + q->length - 1; i++) {
if (seqnum == QELEM(q,i))
- return(GSS_S_DUPLICATE_TOKEN);
+ return GSS_S_DUPLICATE_TOKEN;
if ((seqnum > QELEM(q,i)) && (seqnum < QELEM(q,i+1))) {
queue_insert(q, i, seqnum);
if (q->do_replay && !q->do_sequence)
- return(GSS_S_COMPLETE);
+ return GSS_S_COMPLETE;
else
- return(GSS_S_UNSEQ_TOKEN);
+ return GSS_S_UNSEQ_TOKEN;
}
}
}
/* this should never happen */
- return(GSS_S_FAILURE);
+ return GSS_S_FAILURE;
}
-void
-sequenceFree(void **vqueue)
+OM_uint32
+sequenceFree(OM_uint32 *minor, void **vqueue)
{
queue *q;
q = (queue *) (*vqueue);
- free(q);
+ GSSEAP_FREE(q);
*vqueue = NULL;
+
+ return GSS_S_COMPLETE;
}
/*
* These support functions are for the serialization routines
*/
-int
-sequenceSize(void *vqueue, size_t *sizep)
+size_t
+sequenceSize(void *vqueue)
{
- *sizep += sizeof(queue);
- return 0;
+ return sizeof(queue);
}
-int
-sequenceExternalize(void *vqueue, unsigned char **buf, size_t *lenremain)
+OM_uint32
+sequenceExternalize(OM_uint32 *minor,
+ void *vqueue,
+ unsigned char **buf,
+ size_t *lenremain)
{
- if (*lenremain < sizeof(queue))
- return ENOMEM;
+ if (*lenremain < sizeof(queue)) {
+ *minor = GSSEAP_WRONG_SIZE;
+ return GSS_S_FAILURE;
+ }
memcpy(*buf, vqueue, sizeof(queue));
*buf += sizeof(queue);
*lenremain -= sizeof(queue);
return 0;
}
-int
-sequenceInternalize(void **vqueue, unsigned char **buf, size_t *lenremain)
+OM_uint32
+sequenceInternalize(OM_uint32 *minor,
+ void **vqueue,
+ unsigned char **buf,
+ size_t *lenremain)
{
void *q;
- if (*lenremain < sizeof(queue))
- return EINVAL;
- if ((q = malloc(sizeof(queue))) == 0)
- return ENOMEM;
+ if (*lenremain < sizeof(queue)) {
+ *minor = GSSEAP_TOK_TRUNC;
+ return GSS_S_DEFECTIVE_TOKEN;
+ }
+
+ q = GSSEAP_MALLOC(sizeof(queue));
+ if (q == NULL) {
+ *minor = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+
memcpy(q, *buf, sizeof(queue));
*buf += sizeof(queue);
*lenremain -= sizeof(queue);
*vqueue = q;
- return 0;
+
+ *minor = 0;
+ return GSS_S_COMPLETE;
}