mirror of https://github.com/openssl/openssl.git
				
				
				
			Fix SSL memory leak.
This commit is contained in:
		
							parent
							
								
									5e2c4e23f4
								
							
						
					
					
						commit
						1f3b65801b
					
				|  | @ -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) */ | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue