gss: Fix UB
This commit is contained in:
@@ -1623,7 +1623,10 @@ OM_uint32 _gssapi_mic_cfx(OM_uint32 *minor_status,
|
|||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(buf, message_buffer->value, message_buffer->length);
|
if (message_buffer->length)
|
||||||
|
memcpy(buf, message_buffer->value, message_buffer->length);
|
||||||
|
else
|
||||||
|
memset(buf, 0, len);
|
||||||
|
|
||||||
token = (gss_cfx_mic_token)(buf + message_buffer->length);
|
token = (gss_cfx_mic_token)(buf + message_buffer->length);
|
||||||
token->TOK_ID[0] = 0x04;
|
token->TOK_ID[0] = 0x04;
|
||||||
@@ -1773,7 +1776,8 @@ OM_uint32 _gssapi_verify_mic_cfx(OM_uint32 *minor_status,
|
|||||||
*minor_status = ENOMEM;
|
*minor_status = ENOMEM;
|
||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
memcpy(buf, message_buffer->value, message_buffer->length);
|
if (message_buffer->length)
|
||||||
|
memcpy(buf, message_buffer->value, message_buffer->length);
|
||||||
memcpy(buf + message_buffer->length, token, sizeof(*token));
|
memcpy(buf + message_buffer->length, token, sizeof(*token));
|
||||||
|
|
||||||
ret = krb5_verify_checksum(context, ctx->crypto,
|
ret = krb5_verify_checksum(context, ctx->crypto,
|
||||||
|
@@ -190,7 +190,10 @@ void
|
|||||||
_gss_mg_decode_le_uint32(const void *ptr, uint32_t *n)
|
_gss_mg_decode_le_uint32(const void *ptr, uint32_t *n)
|
||||||
{
|
{
|
||||||
const uint8_t *p = ptr;
|
const uint8_t *p = ptr;
|
||||||
*n = (p[0] << 0) | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
|
*n = ((uint32_t)p[0] << 0)
|
||||||
|
| ((uint32_t)p[1] << 8)
|
||||||
|
| ((uint32_t)p[2] << 16)
|
||||||
|
| ((uint32_t)p[3] << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -734,17 +734,29 @@ wrapunwrap_iov(gss_ctx_id_t cctx, gss_ctx_id_t sctx, int flags, gss_OID mechoid)
|
|||||||
token.data = emalloc(token.length);
|
token.data = emalloc(token.length);
|
||||||
|
|
||||||
p = token.data;
|
p = token.data;
|
||||||
memcpy(p, iov[0].buffer.value, iov[0].buffer.length);
|
|
||||||
|
if (iov[0].buffer.length)
|
||||||
|
memcpy(p, iov[0].buffer.value, iov[0].buffer.length);
|
||||||
p += iov[0].buffer.length;
|
p += iov[0].buffer.length;
|
||||||
memcpy(p, iov[1].buffer.value, iov[1].buffer.length);
|
|
||||||
|
if (iov[1].buffer.length)
|
||||||
|
memcpy(p, iov[1].buffer.value, iov[1].buffer.length);
|
||||||
p += iov[1].buffer.length;
|
p += iov[1].buffer.length;
|
||||||
memcpy(p, iov[2].buffer.value, iov[2].buffer.length);
|
|
||||||
|
if (iov[2].buffer.length)
|
||||||
|
memcpy(p, iov[2].buffer.value, iov[2].buffer.length);
|
||||||
p += iov[2].buffer.length;
|
p += iov[2].buffer.length;
|
||||||
memcpy(p, iov[3].buffer.value, iov[3].buffer.length);
|
|
||||||
|
if (iov[3].buffer.length)
|
||||||
|
memcpy(p, iov[3].buffer.value, iov[3].buffer.length);
|
||||||
p += iov[3].buffer.length;
|
p += iov[3].buffer.length;
|
||||||
memcpy(p, iov[4].buffer.value, iov[4].buffer.length);
|
|
||||||
|
if (iov[4].buffer.length)
|
||||||
|
memcpy(p, iov[4].buffer.value, iov[4].buffer.length);
|
||||||
p += iov[4].buffer.length;
|
p += iov[4].buffer.length;
|
||||||
memcpy(p, iov[5].buffer.value, iov[5].buffer.length);
|
|
||||||
|
if (iov[5].buffer.length)
|
||||||
|
memcpy(p, iov[5].buffer.value, iov[5].buffer.length);
|
||||||
p += iov[5].buffer.length;
|
p += iov[5].buffer.length;
|
||||||
|
|
||||||
assert(p - ((unsigned char *)token.data) == token.length);
|
assert(p - ((unsigned char *)token.data) == token.length);
|
||||||
@@ -1336,7 +1348,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if (out1.length != out2.length)
|
if (out1.length != out2.length)
|
||||||
errx(1, "prf len mismatch");
|
errx(1, "prf len mismatch");
|
||||||
if (memcmp(out1.value, out2.value, out1.length) != 0)
|
if (out1.length && memcmp(out1.value, out2.value, out1.length) != 0)
|
||||||
errx(1, "prf data mismatch");
|
errx(1, "prf data mismatch");
|
||||||
|
|
||||||
gss_release_buffer(&min_stat, &out1);
|
gss_release_buffer(&min_stat, &out1);
|
||||||
@@ -1346,7 +1358,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if (out1.length != out2.length)
|
if (out1.length != out2.length)
|
||||||
errx(1, "prf len mismatch");
|
errx(1, "prf len mismatch");
|
||||||
if (memcmp(out1.value, out2.value, out1.length) != 0)
|
if (out1.length && memcmp(out1.value, out2.value, out1.length) != 0)
|
||||||
errx(1, "prf data mismatch");
|
errx(1, "prf data mismatch");
|
||||||
|
|
||||||
gss_release_buffer(&min_stat, &out1);
|
gss_release_buffer(&min_stat, &out1);
|
||||||
|
Reference in New Issue
Block a user