in BN_clear_free, don't cleanse the data if the static data flag is set.
authortedu <tedu@openbsd.org>
Wed, 7 May 2014 21:06:05 +0000 (21:06 +0000)
committertedu <tedu@openbsd.org>
Wed, 7 May 2014 21:06:05 +0000 (21:06 +0000)
much debugging work done by otto. ok miod otto.

side note: BN_FLG_STATIC_DATA doesn't actually mean the data is static.
it's also used to indicate the data may be secretly shared behind your back
as a sort of poor man's refcounting, but without the refcounting.

lib/libcrypto/bn/bn_lib.c
lib/libssl/src/crypto/bn/bn_lib.c

index 9787a31..6ec9282 100644 (file)
@@ -214,11 +214,10 @@ void BN_clear_free(BIGNUM *a)
 
        if (a == NULL) return;
        bn_check_top(a);
-       if (a->d != NULL)
+       if (a->d != NULL && !(BN_get_flags(a,BN_FLG_STATIC_DATA)))
                {
                OPENSSL_cleanse(a->d,a->dmax*sizeof(a->d[0]));
-               if (!(BN_get_flags(a,BN_FLG_STATIC_DATA)))
-                       free(a->d);
+               free(a->d);
                }
        i=BN_get_flags(a,BN_FLG_MALLOCED);
        OPENSSL_cleanse(a,sizeof(BIGNUM));
index 9787a31..6ec9282 100644 (file)
@@ -214,11 +214,10 @@ void BN_clear_free(BIGNUM *a)
 
        if (a == NULL) return;
        bn_check_top(a);
-       if (a->d != NULL)
+       if (a->d != NULL && !(BN_get_flags(a,BN_FLG_STATIC_DATA)))
                {
                OPENSSL_cleanse(a->d,a->dmax*sizeof(a->d[0]));
-               if (!(BN_get_flags(a,BN_FLG_STATIC_DATA)))
-                       free(a->d);
+               free(a->d);
                }
        i=BN_get_flags(a,BN_FLG_MALLOCED);
        OPENSSL_cleanse(a,sizeof(BIGNUM));