about summary refs log tree commit diff
path: root/rfc2047.c
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2016-07-12 14:08:31 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2016-07-12 14:08:31 +0200
commitcd510df51d33096fbaf83b51b1aac5fb2e3cabb6 (patch)
tree473f4d4e014688d733110156abb7f6c718dc59ac /rfc2047.c
parent41a993c953cd82678cfa3de5c5c7911d347c8907 (diff)
downloadmblaze-cd510df51d33096fbaf83b51b1aac5fb2e3cabb6.tar.gz
mblaze-cd510df51d33096fbaf83b51b1aac5fb2e3cabb6.tar.xz
mblaze-cd510df51d33096fbaf83b51b1aac5fb2e3cabb6.zip
rfc2047: handle uint properly
Diffstat (limited to 'rfc2047.c')
-rw-r--r--rfc2047.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/rfc2047.c b/rfc2047.c
index 7aa824b..436aef0 100644
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -115,14 +115,21 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 		t = b;
 		while (t < s)  // strip space-only inbetween encoded words
 			if (!isspace((unsigned char) *t++)) {
-				while (b < s && dlen--)
+				while (b < s && dlen) {
 					*dst++ = *b++;
+					dlen--;
+				}
 				break;
 			}
 
+		if (!dlen)
+			break;
+
 		s += 2;
 
 		char *e = strchr(s, '?');
+		if (!e)
+			goto nocode;
 
 		*e = 0;
 		ic = iconv_open(tgtenc, s);
@@ -162,11 +169,13 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 
 		iconv_close(ic);
 
-		while (declen-- && dlen--)
+		while (declen-- && dlen) {
 			*dst++ = *dec++;
+			dlen--;
+		}
 
 		b = stop + 2;
-	} while (s = strstr(b, "=?"));
+	} while (dlen && (s = strstr(b, "=?")));
 
 	while (*b && dlen-- > 0)
 		*dst++ = *b++;
@@ -178,8 +187,10 @@ blaze822_decode_rfc2047(char *dst, char *src, size_t dlen, char *tgtenc)
 nocode:
 	fprintf(stderr, "error decoding rfc2047\n");
 nocodeok:
-	while (*src && dlen--)
+	while (*src && dlen) {
 		*dst++ = *src++;
+		dlen--;
+	}
 	*dst = 0;
 
 	return 1;