From 9713264f70846d6eda3d9ed97d0212c5a077f888 Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Fri, 18 Jun 2021 00:35:40 +0200 Subject: mmime: be more careful when qp-encoding in headers Characters such as , or ; mustn't appear in qp-encoded strings, as they have a meaning in phrases. To be safe, encode all special characters except for the safe ones in RFC 2047 5.(3). _ is dealt with already. --- mmime.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mmime.c b/mmime.c index 5c18171..b55d301 100644 --- a/mmime.c +++ b/mmime.c @@ -59,6 +59,11 @@ int gen_b64(uint8_t *s, off_t size) return 0; } +#define qphrasevalid(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || \ + (c >= 'a' && c <= 'z') || \ + c == '!' || c == '*' || c == '+' || c == '-' || \ + c == '/') + size_t gen_qp(uint8_t *s, off_t size, size_t maxlinelen, size_t linelen) { @@ -123,6 +128,10 @@ gen_qp(uint8_t *s, off_t size, size_t maxlinelen, size_t linelen) putc_unlocked('\n', stdout); linelen = 0; prev = 0; + } else if (header && !qphrasevalid(s[i])) { + printf("=%02X", s[i]); + linelen += 3; + prev = '_'; } else { putc_unlocked(s[i], stdout); linelen++; -- cgit 1.4.1