From 745376955c78392ba3a283a7d32e375735bd89cf Mon Sep 17 00:00:00 2001
From: Jonas Maebe <jonas.maebe@elis.ugent.be>
Date: Tue, 3 Dec 2013 17:10:12 +0100
Subject: [PATCH 3/7] mime_hdr_new: free mhdr, tmpname, tmpval on error path

---
 crypto/asn1/asn_mime.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/crypto/asn1/asn_mime.c b/crypto/asn1/asn_mime.c
index 54a704a..ce55d3a 100644
--- a/crypto/asn1/asn_mime.c
+++ b/crypto/asn1/asn_mime.c
@@ -799,8 +799,8 @@ static char *strip_end(char *name)
 
 static MIME_HEADER *mime_hdr_new(char *name, char *value)
 {
-	MIME_HEADER *mhdr;
-	char *tmpname, *tmpval, *p;
+	MIME_HEADER *mhdr = NULL;
+	char *tmpname, *tmpval = NULL, *p;
 	int c;
 	if(name) {
 		if(!(tmpname = BUF_strdup(name))) return NULL;
@@ -813,7 +813,8 @@ static MIME_HEADER *mime_hdr_new(char *name, char *value)
 		}
 	} else tmpname = NULL;
 	if(value) {
-		if(!(tmpval = BUF_strdup(value))) return NULL;
+		if(!(tmpval = BUF_strdup(value)))
+			goto err;
 		for(p = tmpval ; *p; p++) {
 			c = (unsigned char)*p;
 			if(isupper(c)) {
@@ -826,8 +827,18 @@ static MIME_HEADER *mime_hdr_new(char *name, char *value)
 	if(!mhdr) return NULL;
 	mhdr->name = tmpname;
 	mhdr->value = tmpval;
-	if(!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) return NULL;
+	if(!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp)))
+		goto err;
 	return mhdr;
+
+	err:
+	if (tmpname != NULL)
+		OPENSSL_free(tmpname);
+	if (tmpval != NULL)
+		OPENSSL_free(tmpval);
+	if (mhdr != NULL)
+		OPENSSL_free(mhdr);
+	return NULL
 }
 		
 static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value)
-- 
1.8.3.1

