Don't clean up stuff twice.
authorBen Laurie <ben@openssl.org>
Wed, 26 Sep 2001 15:15:03 +0000 (15:15 +0000)
committerBen Laurie <ben@openssl.org>
Wed, 26 Sep 2001 15:15:03 +0000 (15:15 +0000)
crypto/evp/digest.c
crypto/evp/evp.h

index 5178df6eb289e275bb5a4225f179f079b51cc70c..aa1729012ec907d36c8be82303ef868560cbfdb9 100644 (file)
@@ -133,8 +133,10 @@ int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
        {
        return EVP_DigestInit_ex(ctx, type, NULL);
        }
        {
        return EVP_DigestInit_ex(ctx, type, NULL);
        }
+
 int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
        {
 int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
        {
+       EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
        /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
         * so this context may already have an ENGINE! Try to avoid releasing
         * the previous handle, re-querying for an ENGINE, and having a
        /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
         * so this context may already have an ENGINE! Try to avoid releasing
         * the previous handle, re-querying for an ENGINE, and having a
@@ -202,7 +204,11 @@ int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
        ret=ctx->digest->final(ctx,md);
        if (size != NULL)
                *size=ctx->digest->md_size;
        ret=ctx->digest->final(ctx,md);
        if (size != NULL)
                *size=ctx->digest->md_size;
-       /* FIXME: add a cleanup function to the ctx? */
+       if (ctx->digest->cleanup)
+               {
+               ctx->digest->cleanup(ctx);
+               EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
+               }
        memset(ctx->md_data,0,ctx->digest->ctx_size);
        return ret;
        }
        memset(ctx->md_data,0,ctx->digest->ctx_size);
        return ret;
        }
@@ -264,7 +270,8 @@ int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
        /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
         * because sometimes only copies of the context are ever finalised.
         */
        /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
         * because sometimes only copies of the context are ever finalised.
         */
-       if (ctx->digest && ctx->digest->cleanup)
+       if (ctx->digest && ctx->digest->cleanup
+               && !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED))
                ctx->digest->cleanup(ctx);
        if (ctx->digest && ctx->digest->ctx_size && ctx->md_data)
                {
                ctx->digest->cleanup(ctx);
        if (ctx->digest && ctx->digest->ctx_size && ctx->md_data)
                {
index a26594e9bdcc36d308d85953c61c8cedc9323e57..ff9e67f7c663f6aec7049acf6758f33669d14546 100644 (file)
@@ -271,6 +271,8 @@ struct env_md_ctx_st
 
 #define EVP_MD_CTX_FLAG_ONESHOT                0x0001 /* digest update will be called
                                                * once only */
 
 #define EVP_MD_CTX_FLAG_ONESHOT                0x0001 /* digest update will be called
                                                * once only */
+#define EVP_MD_CTX_FLAG_CLEANED                0x0002 /* context has already been
+                                               * cleaned */
 
 struct evp_cipher_st
        {
 
 struct evp_cipher_st
        {
@@ -457,6 +459,8 @@ EVP_MD_CTX *EVP_MD_CTX_create(void);
 void   EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
 int     EVP_MD_CTX_copy(EVP_MD_CTX *out,const EVP_MD_CTX *in);  
 #define EVP_MD_CTX_set_flags(ctx,flgs) ((ctx)->flags|=(flgs))
 void   EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
 int     EVP_MD_CTX_copy(EVP_MD_CTX *out,const EVP_MD_CTX *in);  
 #define EVP_MD_CTX_set_flags(ctx,flgs) ((ctx)->flags|=(flgs))
+#define EVP_MD_CTX_clear_flags(ctx,flgs) ((ctx)->flags&=~(flgs))
+#define EVP_MD_CTX_test_flags(ctx,flgs) ((ctx)->flags&(flgs))
 int    EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
 int    EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
 int    EVP_DigestUpdate(EVP_MD_CTX *ctx,const void *d,
 int    EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
 int    EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
 int    EVP_DigestUpdate(EVP_MD_CTX *ctx,const void *d,