mirror of https://github.com/openssl/openssl.git
bio_ok.c: Integer Overflow in BIO_f_reliable record parser leads to Out-of-Bounds Read
Reviewed-by: Paul Dale <ppzgs1@gmail.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28504)
(cherry picked from commit 312904b216)
This commit is contained in:
parent
6dfd73d6e0
commit
192ac44aaf
|
|
@ -556,7 +556,7 @@ static int block_in(BIO *b)
|
|||
{
|
||||
BIO_OK_CTX *ctx;
|
||||
EVP_MD_CTX *md;
|
||||
unsigned long tl = 0;
|
||||
size_t tl = 0;
|
||||
unsigned char tmp[EVP_MAX_MD_SIZE];
|
||||
int md_size;
|
||||
|
||||
|
|
@ -567,15 +567,18 @@ static int block_in(BIO *b)
|
|||
goto berr;
|
||||
|
||||
assert(sizeof(tl) >= OK_BLOCK_BLOCK); /* always true */
|
||||
tl = ctx->buf[0];
|
||||
tl <<= 8;
|
||||
tl |= ctx->buf[1];
|
||||
tl <<= 8;
|
||||
tl |= ctx->buf[2];
|
||||
tl <<= 8;
|
||||
tl |= ctx->buf[3];
|
||||
tl = ((size_t)ctx->buf[0] << 24)
|
||||
| ((size_t)ctx->buf[1] << 16)
|
||||
| ((size_t)ctx->buf[2] << 8)
|
||||
| ((size_t)ctx->buf[3]);
|
||||
|
||||
if (ctx->buf_len < tl + OK_BLOCK_BLOCK + md_size)
|
||||
if (tl > OK_BLOCK_SIZE)
|
||||
goto berr;
|
||||
|
||||
if (tl > SIZE_MAX - OK_BLOCK_BLOCK - (size_t)md_size)
|
||||
goto berr;
|
||||
|
||||
if (ctx->buf_len < tl + OK_BLOCK_BLOCK + (size_t)md_size)
|
||||
return 1;
|
||||
|
||||
if (!EVP_DigestUpdate(md,
|
||||
|
|
@ -583,7 +586,7 @@ static int block_in(BIO *b)
|
|||
goto berr;
|
||||
if (!EVP_DigestFinal_ex(md, tmp, NULL))
|
||||
goto berr;
|
||||
if (memcmp(&(ctx->buf[tl + OK_BLOCK_BLOCK]), tmp, md_size) == 0) {
|
||||
if (memcmp(&(ctx->buf[tl + OK_BLOCK_BLOCK]), tmp, (size_t)md_size) == 0) {
|
||||
/* there might be parts from next block lurking around ! */
|
||||
ctx->buf_off_save = tl + OK_BLOCK_BLOCK + md_size;
|
||||
ctx->buf_len_save = ctx->buf_len;
|
||||
|
|
|
|||
Loading…
Reference in New Issue