Fix SSL memory leak.
authorBen Laurie <ben@openssl.org>
Tue, 28 Aug 2001 13:45:41 +0000 (13:45 +0000)
committerBen Laurie <ben@openssl.org>
Tue, 28 Aug 2001 13:45:41 +0000 (13:45 +0000)
crypto/engine/hw_openbsd_dev_crypto.c
crypto/evp/digest.c
crypto/evp/evp.h
ssl/s3_lib.c

index 3e11fc59aa9f5b37736c159cf1220d22a7c23158..6479a7c249e5d2059410a5c272f48527523e596d 100644 (file)
@@ -80,4 +80,8 @@ ENGINE *ENGINE_openbsd_dev_crypto(void)
        return engine;
        }
 
-#endif /* defined(OPENSSL_OPENBSD_DEV_CRYPTO) */
+#else  /* !defined(OPENSSL_OPENBSD_DEV_CRYPTO) */
+
+static void *dummy=&dummy;
+
+#endif  /* !defined(OPENSSL_OPENBSD_DEV_CRYPTO) */
index f1c905ab757328ac4f468389c9fd82b8a6827afa..5c5b118486319601bcdb42e61184e3396f7753ff 100644 (file)
@@ -75,13 +75,22 @@ EVP_MD_CTX *EVP_MD_CTX_create(void)
        return ctx;
        }
 
+#ifdef CRYPTO_MDEBUG
+int EVP_DigestInit_dbg(EVP_MD_CTX *ctx, const EVP_MD *type,const char *file,
+                      int line)
+#else
 int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
+#endif
        {
        if(ctx->digest != type)
                {
                OPENSSL_free(ctx->md_data);
                ctx->digest=type;
+#ifdef CRYPTO_MDEBUG
+               ctx->md_data=CRYPTO_malloc(type->ctx_size,file,line);
+#else
                ctx->md_data=OPENSSL_malloc(type->ctx_size);
+#endif
                }
        return type->init(ctx->md_data);
        }
@@ -142,7 +151,12 @@ void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
 /* This call frees resources associated with the context */
 int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
        {
-       /* assume ctx->md_data was cleaned in EVP_Digest_Final */
+       /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
+        * because sometimes only copies of the context are ever finalised.
+        */
+       if(ctx->md_data)
+           memset(ctx->md_data,0,ctx->digest->ctx_size);
+
        OPENSSL_free(ctx->md_data);
        memset(ctx,'\0',sizeof *ctx);
 
index 435f2b36e663fa943dce913019be12acc46c990b..ef77db499e4fdc1e844419ab82627f95ced7966b 100644 (file)
@@ -443,7 +443,13 @@ int        EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
 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);  
+#ifdef CRYPTO_MDEBUG
+int    EVP_DigestInit_dbg(EVP_MD_CTX *ctx, const EVP_MD *type,
+                          const char *file,int line);
+#define EVP_DigestInit(ctx,type) EVP_DigestInit_dbg(ctx,type,__FILE__,__LINE__)
+#else
 int    EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+#endif
 int    EVP_DigestUpdate(EVP_MD_CTX *ctx,const void *d,
                         unsigned int cnt);
 int    EVP_DigestFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s);
index 8fbb2c2501629e38ba854b5cd51f661dfd23e53e..4575eeecc02b5dc6e49ef224a1573544088a9669 100644 (file)
@@ -1009,6 +1009,9 @@ void ssl3_clear(SSL *s)
        rp=s->s3->rbuf.buf;
        wp=s->s3->wbuf.buf;
 
+       EVP_MD_CTX_cleanup(&s->s3->finish_dgst1);
+       EVP_MD_CTX_cleanup(&s->s3->finish_dgst2);
+
        memset(s->s3,0,sizeof *s->s3);
        if (rp != NULL) s->s3->rbuf.buf=rp;
        if (wp != NULL) s->s3->wbuf.buf=wp;