diff options
Diffstat (limited to 'src/crypto/bn/div.c')
-rw-r--r-- | src/crypto/bn/div.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/crypto/bn/div.c b/src/crypto/bn/div.c index d65957a..3588ea1 100644 --- a/src/crypto/bn/div.c +++ b/src/crypto/bn/div.c @@ -278,12 +278,14 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, t2 = (BN_ULLONG)d1 * q; for (;;) { - if (t2 <= ((((BN_ULLONG)rem) << BN_BITS2) | wnump[-2])) + if (t2 <= ((((BN_ULLONG)rem) << BN_BITS2) | wnump[-2])) { break; + } q--; rem += d0; - if (rem < d0) + if (rem < d0) { break; /* don't let rem overflow */ + } t2 -= d1; } #else /* !BN_LLONG */ @@ -316,14 +318,17 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, #endif for (;;) { - if ((t2h < rem) || ((t2h == rem) && (t2l <= wnump[-2]))) + if ((t2h < rem) || ((t2h == rem) && (t2l <= wnump[-2]))) { break; + } q--; rem += d0; - if (rem < d0) + if (rem < d0) { break; /* don't let rem overflow */ - if (t2l < d1) + } + if (t2l < d1) { t2h--; + } t2l -= d1; } #endif /* !BN_LLONG */ @@ -357,7 +362,9 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, * BN_rshift() will overwrite it. */ int neg = num->neg; - BN_rshift(rm, snum, norm_shift); + if (!BN_rshift(rm, snum, norm_shift)) { + goto err; + } if (!BN_is_zero(rm)) { rm->neg = neg; } @@ -485,9 +492,7 @@ int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, ret = BN_mod_lshift_quick(r, r, n, (abs_m ? abs_m : m)); - if (abs_m) { - BN_free(abs_m); - } + BN_free(abs_m); return ret; } |