diff options
author | Matt Caswell <matt@openssl.org> | 2015-05-19 14:59:47 +0200 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2015-06-04 10:23:02 +0200 |
commit | c56353071d9849220714d8a556806703771b9269 (patch) | |
tree | a6ceee0dcd0cbb820ea1f29679490ef699cec6ca /crypto/bn/bn_print.c | |
parent | Fix DTLS session resumption (diff) | |
download | openssl-c56353071d9849220714d8a556806703771b9269.tar.xz openssl-c56353071d9849220714d8a556806703771b9269.zip |
Fix off-by-one error in BN_bn2hex
A BIGNUM can have the value of -0. The function BN_bn2hex fails to account
for this and can allocate a buffer one byte too short in the event of -0
being used, leading to a one byte buffer overrun. All usage within the
OpenSSL library is considered safe. Any security risk is considered
negligible.
With thanks to Mateusz Kocielski (LogicalTrust), Marek Kroemeke and
Filip Palian for discovering and reporting this issue.
Reviewed-by: Tim Hudson <tjh@openssl.org>
Diffstat (limited to 'crypto/bn/bn_print.c')
-rw-r--r-- | crypto/bn/bn_print.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/crypto/bn/bn_print.c b/crypto/bn/bn_print.c index b0b70b5dae..f528a36ff4 100644 --- a/crypto/bn/bn_print.c +++ b/crypto/bn/bn_print.c @@ -71,7 +71,12 @@ char *BN_bn2hex(const BIGNUM *a) char *buf; char *p; - buf = OPENSSL_malloc(a->top * BN_BYTES * 2 + 2); + if (a->neg && BN_is_zero(a)) { + /* "-0" == 3 bytes including NULL terminator */ + buf = OPENSSL_malloc(3); + } else { + buf = OPENSSL_malloc(a->top * BN_BYTES * 2 + 2); + } if (buf == NULL) { BNerr(BN_F_BN_BN2HEX, ERR_R_MALLOC_FAILURE); goto err; |