Commit 1f3b6580 authored by Ben Laurie's avatar Ben Laurie
Browse files

Fix SSL memory leak.

parent 5e2c4e23
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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) */
+15 −1
Original line number Diff line number Diff line
@@ -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);

+6 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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;