diff options
Diffstat (limited to 'deps/openssl/openssl/crypto/bn/bn_word.c')
-rw-r--r-- | deps/openssl/openssl/crypto/bn/bn_word.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/deps/openssl/openssl/crypto/bn/bn_word.c b/deps/openssl/openssl/crypto/bn/bn_word.c index de83a15b99..ee7b87c45c 100644 --- a/deps/openssl/openssl/crypto/bn/bn_word.c +++ b/deps/openssl/openssl/crypto/bn/bn_word.c @@ -144,17 +144,26 @@ int BN_add_word(BIGNUM *a, BN_ULONG w) a->neg=!(a->neg); return(i); } - for (i=0;w!=0 && i<a->top;i++) + /* Only expand (and risk failing) if it's possibly necessary */ + if (((BN_ULONG)(a->d[a->top - 1] + 1) == 0) && + (bn_wexpand(a,a->top+1) == NULL)) + return(0); + i=0; + for (;;) { - a->d[i] = l = (a->d[i]+w)&BN_MASK2; - w = (w>l)?1:0; + if (i >= a->top) + l=w; + else + l=(a->d[i]+w)&BN_MASK2; + a->d[i]=l; + if (w > l) + w=1; + else + break; + i++; } - if (w && i==a->top) - { - if (bn_wexpand(a,a->top+1) == NULL) return 0; + if (i >= a->top) a->top++; - a->d[i]=w; - } bn_check_top(a); return(1); } |