Document a change I'd already made, and at the same time, correct the
[openssl.git] / crypto / bn / bn_ctx.c
index 34cc75c..f48055b 100644 (file)
@@ -121,8 +121,11 @@ void BN_CTX_free(BN_CTX *ctx)
        if (ctx == NULL) return;
        assert(ctx->depth == 0);
 
-       for (i=0; i < BN_CTX_NUM; i++)
-               BN_clear_free(&(ctx->bn[i]));
+       for (i=0; i < BN_CTX_NUM; i++) {
+               bn_check_top(&(ctx->bn[i]));
+               if (ctx->bn[i].d)
+                       BN_clear_free(&(ctx->bn[i]));
+       }
        if (ctx->flags & BN_FLG_MALLOCED)
                OPENSSL_free(ctx);
        }
@@ -137,6 +140,7 @@ void BN_CTX_start(BN_CTX *ctx)
 
 BIGNUM *BN_CTX_get(BN_CTX *ctx)
        {
+       BIGNUM *ret;
        /* Note: If BN_CTX_get is ever changed to allocate BIGNUMs dynamically,
         * make sure that if BN_CTX_get fails once it will return NULL again
         * until BN_CTX_end is called.  (This is so that callers have to check
@@ -152,7 +156,10 @@ BIGNUM *BN_CTX_get(BN_CTX *ctx)
                        }
                return NULL;
                }
-       return (&(ctx->bn[ctx->tos++]));
+       ret = ctx->bn + (ctx->tos++);
+       /* always return a 'zeroed' bignum */
+       BN_zero(ret);
+       return ret;
        }
 
 void BN_CTX_end(BN_CTX *ctx)
@@ -168,5 +175,10 @@ void BN_CTX_end(BN_CTX *ctx)
        ctx->too_many = 0;
        ctx->depth--;
        if (ctx->depth < BN_CTX_NUM_POS)
+#ifndef BN_DEBUG
                ctx->tos = ctx->pos[ctx->depth];
+#else
+               while(ctx->tos > ctx->pos[ctx->depth])
+                       bn_check_top(&ctx->bn[--(ctx->tos)]);
+#endif
        }