diff options
author | Christian Neukirchen <chneukirchen@gmail.com> | 2016-07-12 14:08:31 +0200 |
---|---|---|
committer | Christian Neukirchen <chneukirchen@gmail.com> | 2016-07-12 14:08:31 +0200 |
commit | cd510df51d33096fbaf83b51b1aac5fb2e3cabb6 (patch) | |
tree | 473f4d4e014688d733110156abb7f6c718dc59ac /rfc2047.c | |
parent | 41a993c953cd82678cfa3de5c5c7911d347c8907 (diff) | |
download | mblaze-cd510df51d33096fbaf83b51b1aac5fb2e3cabb6.tar.gz mblaze-cd510df51d33096fbaf83b51b1aac5fb2e3cabb6.tar.xz mblaze-cd510df51d33096fbaf83b51b1aac5fb2e3cabb6.zip |
rfc2047: handle uint properly
Diffstat (limited to 'rfc2047.c')
-rw-r--r-- | rfc2047.c | 19 |
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; |