ctx->gssFlags &= ~(GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG);
}
- sequenceInit(&ctx->seqState, ctx->recvSeq,
- ((ctx->gssFlags & GSS_C_REPLAY_FLAG) != 0),
- ((ctx->gssFlags & GSS_C_SEQUENCE_FLAG) != 0),
- TRUE);
+ major = sequenceInit(minor,
+ &ctx->seqState, ctx->recvSeq,
+ ((ctx->gssFlags & GSS_C_REPLAY_FLAG) != 0),
+ ((ctx->gssFlags & GSS_C_SEQUENCE_FLAG) != 0),
+ TRUE);
+ if (GSS_ERROR(major))
+ return major;
return GSS_S_COMPLETE;
}
store_uint64_be(ctx->sendSeq, &p[8]);
store_uint64_be(ctx->recvSeq, &p[16]);
p += 24;
- sequenceExternalize(ctx->seqState, &p, &length);
+
+ major = sequenceExternalize(minor, ctx->seqState, &p, &length);
+ if (GSS_ERROR(major))
+ goto cleanup;
if (partialCtx.value != NULL)
p = store_buffer(&partialCtx, p, FALSE);
p += 24;
remain -= 24;
- *minor = sequenceInternalize(&ctx->seqState, &p, &remain);
- if (*minor != 0)
- return GSS_S_FAILURE;
+ major = sequenceInternalize(minor, &ctx->seqState, &p, &remain);
+ if (GSS_ERROR(major))
+ return major;
/*
* The partial context should only be expected for unestablished
ctx->gssFlags &= ~(GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG);
}
- sequenceInit(&ctx->seqState, ctx->recvSeq,
- ((ctx->gssFlags & GSS_C_REPLAY_FLAG) != 0),
- ((ctx->gssFlags & GSS_C_SEQUENCE_FLAG) != 0),
- TRUE);
+ major = sequenceInit(minor,
+ &ctx->seqState,
+ ctx->recvSeq,
+ ((ctx->gssFlags & GSS_C_REPLAY_FLAG) != 0),
+ ((ctx->gssFlags & GSS_C_SEQUENCE_FLAG) != 0),
+ TRUE);
+ if (GSS_ERROR(major))
+ return major;
return GSS_S_COMPLETE;
}
}
}
- code = sequenceCheck(&ctx->seqState, seqnum);
+ code = sequenceCheck(minor, &ctx->seqState, seqnum);
} else if (toktype == TOK_TYPE_MIC || toktype == TOK_TYPE_GSS_CB) {
if (load_uint16_be(ptr) != toktype)
goto defective;
return GSS_S_BAD_SIG;
}
if (toktype != TOK_TYPE_GSS_CB)
- code = sequenceCheck(&ctx->seqState, seqnum);
+ code = sequenceCheck(minor, &ctx->seqState, seqnum);
} else if (toktype == TOK_TYPE_DELETE_CONTEXT) {
if (load_uint16_be(ptr) != TOK_TYPE_DELETE_CONTEXT)
goto defective;
}
/* util_ordering.c */
-int
-sequenceInternalize(void **vqueue, unsigned char **buf, size_t *lenremain);
+OM_uint32
+sequenceInternalize(OM_uint32 *minor,
+ void **vqueue,
+ unsigned char **buf,
+ size_t *lenremain);
-int
-sequenceExternalize(void *vqueue, unsigned char **buf, size_t *lenremain);
+OM_uint32
+sequenceExternalize(OM_uint32 *minor,
+ void *vqueue,
+ unsigned char **buf,
+ size_t *lenremain);
size_t
sequenceSize(void *vqueue);
-void
-sequenceFree(void **vqueue);
+OM_uint32
+sequenceFree(OM_uint32 *minor, void **vqueue);
-int
-sequenceCheck(void **vqueue, uint64_t seqnum);
+OM_uint32
+sequenceCheck(OM_uint32 *minor, void **vqueue, uint64_t seqnum);
-int
-sequenceInit(void **vqueue, uint64_t seqnum,
+OM_uint32
+sequenceInit(OM_uint32 *minor, void **vqueue, uint64_t seqnum,
int do_replay, int do_sequence, int wide_nums);
/* util_token.c */
gssEapReleaseName(&tmpMinor, &ctx->initiatorName);
gssEapReleaseName(&tmpMinor, &ctx->acceptorName);
gss_release_oid(&tmpMinor, &ctx->mechanismUsed);
- sequenceFree(&ctx->seqState);
+ sequenceFree(&tmpMinor, &ctx->seqState);
GSSEAP_MUTEX_DESTROY(&ctx->mutex);
}
}
-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 *) GSSEAP_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;
return(GSS_S_FAILURE);
}
-void
-sequenceFree(void **vqueue)
+OM_uint32
+sequenceFree(OM_uint32 *minor, void **vqueue)
{
queue *q;
GSSEAP_FREE(q);
*vqueue = NULL;
+
+ return GSS_S_COMPLETE;
}
/*
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 ERANGE;
+ if (*lenremain < sizeof(queue)) {
+ *minor = ERANGE;
+ 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 ERANGE;
+ if (*lenremain < sizeof(queue)) {
+ *minor = ERANGE;
+ return GSS_S_DEFECTIVE_TOKEN;
+ }
+
q = GSSEAP_MALLOC(sizeof(queue));
- if (q == NULL)
- return ENOMEM;
+ 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;
}