about summary refs log tree commit diff
path: root/rfc2047.c
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2016-07-13 17:17:43 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2016-07-13 17:17:43 +0200
commit6e6d1993a2cd61d49c6207986798e8324a9a3e2a (patch)
tree1beb5adf49c74c3eb8c16ff2d8c030691190df72 /rfc2047.c
parent00954008cca242f88f3af743f9ff731d3c384ae8 (diff)
downloadmblaze-6e6d1993a2cd61d49c6207986798e8324a9a3e2a.tar.gz
mblaze-6e6d1993a2cd61d49c6207986798e8324a9a3e2a.tar.xz
mblaze-6e6d1993a2cd61d49c6207986798e8324a9a3e2a.zip
rfc2047: free all things in blaze822_decode_rfc2047
Diffstat (limited to 'rfc2047.c')
-rw-r--r--rfc2047.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/rfc2047.c b/rfc2047.c
index a52c612..94b9a59 100644
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -103,7 +103,7 @@ blaze822_decode_b64(char *s, char *e, char **deco, size_t *decleno)
 int
 blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 {
-	iconv_t ic;
+	iconv_t ic = (iconv_t)-1;
 
 	char *b = src;
 
@@ -149,7 +149,7 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 		if (!stop)
 			goto nocode;
 
-		char *dec;
+		char *dec, *decchunk;
 		size_t declen;
 		if (enc == 'q')
 			blaze822_decode_qp(start, stop, &dec, &declen);
@@ -158,6 +158,7 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 		else
 			goto nocode;
 
+		decchunk = dec;
 		int r = iconv(ic, &dec, &declen, &dst, &dlen);
 		if (r < 0) {
 			if (errno == E2BIG) {
@@ -179,6 +180,8 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 			dlen--;
 		}
 
+		free(decchunk);
+
 		b = stop + 2;
 	} while (dlen && (s = strstr(b, "=?")));
 
@@ -192,6 +195,9 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 	return 1;
 
 nocode:
+	if (ic != (iconv_t)-1)
+		iconv_close(ic);
+
 	fprintf(stderr, "error decoding rfc2047\n");
 nocodeok:
 	while (*src && dlen) {