Apply "better safe than sorry" approach after addressing sporadic SEGV in
[oweals/openssl.git] / crypto / bn / bn_shift.c
index 513e686f86a8525ab1e0bbe5b89117f3a9fda500..de9312dce231f5de6c03a90baf42ee867c6b6838 100644 (file)
@@ -65,6 +65,9 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
        register BN_ULONG *ap,*rp,t,c;
        int i;
 
+       bn_check_top(r);
+       bn_check_top(a);
+
        if (r != a)
                {
                r->neg=a->neg;
@@ -98,6 +101,9 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a)
        BN_ULONG *ap,*rp,t,c;
        int i;
 
+       bn_check_top(r);
+       bn_check_top(a);
+
        if (BN_is_zero(a))
                {
                BN_zero(r);
@@ -129,6 +135,9 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
        BN_ULONG *t,*f;
        BN_ULONG l;
 
+       bn_check_top(r);
+       bn_check_top(a);
+
        r->neg=a->neg;
        nw=n/BN_BITS2;
        if (bn_wexpand(r,a->top+nw+1) == NULL) return(0);
@@ -162,6 +171,9 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
        BN_ULONG *t,*f;
        BN_ULONG l,tmp;
 
+       bn_check_top(r);
+       bn_check_top(a);
+
        nw=n/BN_BITS2;
        rb=n%BN_BITS2;
        lb=BN_BITS2-rb;
@@ -188,13 +200,13 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
 
        if (rb == 0)
                {
-               for (i=j+1; i > 0; i--)
+               for (i=j; i != 0; i--)
                        *(t++)= *(f++);
                }
        else
                {
                l= *(f++);
-               for (i=1; i<j; i++)
+               for (i=j-1; i != 0; i--)
                        {
                        tmp =(l>>rb)&BN_MASK2;
                        l= *(f++);
@@ -202,7 +214,6 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
                        }
                *(t++) =(l>>rb)&BN_MASK2;
                }
-       *t=0;
        bn_correct_top(r);
        bn_check_top(r);
        return(1);