for (i=0; i < BN_CTX_NUM; i++) {
bn_check_top(&(ctx->bn[i]));
- BN_clear_free(&(ctx->bn[i]));
+ if (ctx->bn[i].d)
+ BN_clear_free(&(ctx->bn[i]));
}
if (ctx->flags & BN_FLG_MALLOCED)
OPENSSL_free(ctx);
}
return NULL;
}
- bn_check_top(&(ctx->bn[ctx->tos]));
+ /* always return a 'zeroed' bignum */
+ ctx->bn[ctx->tos].top = 0;
return (&(ctx->bn[ctx->tos++]));
}
ctx->too_many = 0;
ctx->depth--;
- /* It appears some "scrapbook" uses of BN_CTX result in BIGNUMs being
- * left in an inconsistent state when they are released (eg. BN_div).
- * These can trip us up when they get reused, so the safest fix is to
- * make sure the BIGNUMs are made sane when the context usage is
- * releasing them. */
if (ctx->depth < BN_CTX_NUM_POS)
-#if 0
+#ifndef BN_DEBUG
ctx->tos = ctx->pos[ctx->depth];
#else
- {
while(ctx->tos > ctx->pos[ctx->depth])
- /* This ensures the BIGNUM is sane(r) for reuse. */
- ctx->bn[--(ctx->tos)].top = 0;
- }
+ bn_check_top(&ctx->bn[--(ctx->tos)]);
#endif
}