X-Git-Url: http://www.project-moonshot.org/gitweb/?p=mech_eap.git;a=blobdiff_plain;f=mech_eap%2Futil_token.c;h=d94c43795db81905113201ed7db92fe67ce72db3;hp=eb0dd1b18dd4d44b4688162996b63885c334541b;hb=HEAD;hpb=06e2ee5ccf545c5e63ad0119ccc7e41653641c86 diff --git a/mech_eap/util_token.c b/mech_eap/util_token.c index eb0dd1b..d94c437 100644 --- a/mech_eap/util_token.c +++ b/mech_eap/util_token.c @@ -91,7 +91,7 @@ gssEapEncodeInnerTokens(OM_uint32 *minor, for (i = 0; i < tokens->buffers.count; i++) { gss_buffer_t tokenBuffer = &tokens->buffers.elements[i]; - assert((tokens->types[i] & ITOK_FLAG_VERIFIED) == 0); /* private flag */ + GSSEAP_ASSERT((tokens->types[i] & ITOK_FLAG_VERIFIED) == 0); /* private flag */ /* * Extensions are encoded as type-length-value, where the upper @@ -104,8 +104,8 @@ gssEapEncodeInnerTokens(OM_uint32 *minor, p += 8 + tokenBuffer->length; } - assert(p == (unsigned char *)buffer->value + required); - assert(buffer->value != NULL); + GSSEAP_ASSERT(p == (unsigned char *)buffer->value + required); + GSSEAP_ASSERT(buffer->value != NULL); major = GSS_S_COMPLETE; *minor = 0; @@ -125,6 +125,7 @@ gssEapDecodeInnerTokens(OM_uint32 *minor, { OM_uint32 major, tmpMinor; unsigned char *p; + size_t count = 0; size_t remain; tokens->buffers.count = 0; @@ -149,14 +150,37 @@ gssEapDecodeInnerTokens(OM_uint32 *minor, goto cleanup; } - ntypes = GSSEAP_REALLOC(tokens->types, - (tokens->buffers.count + 1) * sizeof(OM_uint32)); - if (ntypes == NULL) { - major = GSS_S_FAILURE; - *minor = ENOMEM; - goto cleanup; + if (tokens->buffers.count <= count) { + if (count == 0) + count = 1; + else + count *= 2; + + ntypes = GSSEAP_MALLOC(count * sizeof(OM_uint32)); + if (ntypes == NULL) { + major = GSS_S_FAILURE; + *minor = ENOMEM; + goto cleanup; + } + if (tokens->types != NULL) { + memcpy(ntypes, tokens->types, tokens->buffers.count * sizeof(OM_uint32)); + GSSEAP_FREE(tokens->types); + } + tokens->types = ntypes; + + newTokenBuffers = GSSEAP_MALLOC(count * sizeof(gss_buffer_desc)); + if (newTokenBuffers == NULL) { + major = GSS_S_FAILURE; + *minor = ENOMEM; + goto cleanup; + } + if (tokens->buffers.elements != NULL) { + memcpy(newTokenBuffers, tokens->buffers.elements, + tokens->buffers.count * sizeof(gss_buffer_desc)); + GSSEAP_FREE(tokens->buffers.elements); + } + tokens->buffers.elements = newTokenBuffers; } - tokens->types = ntypes; tokens->types[tokens->buffers.count] = load_uint32_be(&p[0]); tokenBuffer.length = load_uint32_be(&p[4]); @@ -168,21 +192,11 @@ gssEapDecodeInnerTokens(OM_uint32 *minor, } tokenBuffer.value = &p[8]; - newTokenBuffers = GSSEAP_REALLOC(tokens->buffers.elements, - (tokens->buffers.count + 1) * sizeof(gss_buffer_desc)); - if (newTokenBuffers == NULL) { - major = GSS_S_FAILURE; - *minor = ENOMEM; - goto cleanup; - } - - tokens->buffers.elements = newTokenBuffers; tokens->buffers.elements[tokens->buffers.count] = tokenBuffer; tokens->buffers.count++; p += 8 + tokenBuffer.length; remain -= 8 + tokenBuffer.length; - } while (remain != 0); major = GSS_S_COMPLETE; @@ -302,7 +316,7 @@ der_read_length(unsigned char **buf, ssize_t *bufsize) size_t tokenSize(const gss_OID_desc *mech, size_t body_size) { - assert(mech != GSS_C_NO_OID); + GSSEAP_ASSERT(mech != GSS_C_NO_OID); /* set body_size to sequence contents size */ body_size += 4 + (size_t) mech->length; /* NEED overflow check */ @@ -320,12 +334,12 @@ makeTokenHeader( enum gss_eap_token_type tok_type) { *(*buf)++ = 0x60; - der_write_length(buf, (tok_type == -1) ?2:4 + mech->length + body_size); + der_write_length(buf, 4 + mech->length + body_size); *(*buf)++ = 0x06; *(*buf)++ = (unsigned char)mech->length; memcpy(*buf, mech->elements, mech->length); *buf += mech->length; - assert(tok_type != TOK_TYPE_NONE); + GSSEAP_ASSERT(tok_type != TOK_TYPE_NONE); *(*buf)++ = (unsigned char)((tok_type>>8) & 0xff); *(*buf)++ = (unsigned char)(tok_type & 0xff); }