diff options
author | Geoff Thorpe <geoff@openssl.org> | 2004-09-19 04:43:46 +0000 |
---|---|---|
committer | Geoff Thorpe <geoff@openssl.org> | 2004-09-19 04:43:46 +0000 |
commit | f79110c63383de7241c01e80f0dfc07d33395e77 (patch) | |
tree | 8609a49a5d402aebd5ccb35c0119d9df3f6cf9e5 /crypto/bn/bn_print.c | |
parent | 6ef2ff62fca2d317bf98cf7dda85bf1ab493749c (diff) |
Two TODO comments taken care of. Nils pointed out that one of them had already
been done, and took care of the other one (which hadn't).
Submitted by: Nils Larsch
Reviewed by: Geoff Thorpe
Diffstat (limited to 'crypto/bn/bn_print.c')
-rw-r--r-- | crypto/bn/bn_print.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/crypto/bn/bn_print.c b/crypto/bn/bn_print.c index 092322d2ff..5fb8473f37 100644 --- a/crypto/bn/bn_print.c +++ b/crypto/bn/bn_print.c @@ -102,14 +102,19 @@ err: /* Must 'OPENSSL_free' the returned data */ char *BN_bn2dec(const BIGNUM *a) { - int i=0,num; + int i=0,num, ok = 0; char *buf=NULL; char *p; BIGNUM *t=NULL; BN_ULONG *bn_data=NULL,*lp; + /* get an upper bound for the length of the decimal integer + * num <= (BN_num_bits(a) + 1) * log(2) + * <= 3 * BN_num_bits(a) * 0.1001 + log(2) + 1 (rounding error) + * <= BN_num_bits(a)/10 + BN_num_bits/1000 + 1 + 1 + */ i=BN_num_bits(a)*3; - num=(i/10+i/1000+3)+1; + num=(i/10+i/1000+1)+1; bn_data=(BN_ULONG *)OPENSSL_malloc((num/BN_DEC_NUM+1)*sizeof(BN_ULONG)); buf=(char *)OPENSSL_malloc(num+3); if ((buf == NULL) || (bn_data == NULL)) @@ -122,7 +127,6 @@ char *BN_bn2dec(const BIGNUM *a) #define BUF_REMAIN (num+3 - (size_t)(p - buf)) p=buf; lp=bn_data; - if (t->neg) *(p++)='-'; if (BN_is_zero(t)) { *(p++)='0'; @@ -130,6 +134,9 @@ char *BN_bn2dec(const BIGNUM *a) } else { + if (BN_get_sign(t)) + *p++ = '-'; + i=0; while (!BN_is_zero(t)) { @@ -149,9 +156,16 @@ char *BN_bn2dec(const BIGNUM *a) while (*p) p++; } } + ok = 1; err: if (bn_data != NULL) OPENSSL_free(bn_data); if (t != NULL) BN_free(t); + if (!ok && buf) + { + OPENSSL_free(buf); + buf = NULL; + } + return(buf); } |