From: Timo Sirainen Date: Thu, 23 Oct 2008 15:58:22 +0000 (+0300) Subject: rfc822_parse_quoted_string(): Handle folding whitespace. X-Git-Tag: 1.2.alpha4~171 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0452398b245ac9643f6b47dfc450dc5bf7da51d0;p=thirdparty%2Fdovecot%2Fcore.git rfc822_parse_quoted_string(): Handle folding whitespace. --HG-- branch : HEAD --- diff --git a/src/lib-mail/rfc822-parser.c b/src/lib-mail/rfc822-parser.c index 0337896662..255ed8a406 100644 --- a/src/lib-mail/rfc822-parser.c +++ b/src/lib-mail/rfc822-parser.c @@ -207,26 +207,34 @@ int rfc822_parse_mime_token(struct rfc822_parser_context *ctx, string_t *str) int rfc822_parse_quoted_string(struct rfc822_parser_context *ctx, string_t *str) { const unsigned char *start; + size_t len; i_assert(*ctx->data == '"'); ctx->data++; for (start = ctx->data; ctx->data != ctx->end; ctx->data++) { - if (*ctx->data == '"') { + switch (*ctx->data) { + case '"': str_append_n(str, start, ctx->data - start); ctx->data++; return rfc822_skip_lwsp(ctx); - } - - if (*ctx->data != '\\') - continue; - - ctx->data++; - if (ctx->data == ctx->end) - return -1; + case '\n': + /* folding whitespace, remove the (CR)LF */ + len = ctx->data - start; + if (len > 0 && start[len-1] == '\r') + len--; + str_append_n(str, start, len); + start = ctx->data + 1; + break; + case '\\': + ctx->data++; + if (ctx->data == ctx->end) + return -1; - str_append_n(str, start, ctx->data - start); - start = ctx->data; + str_append_n(str, start, ctx->data - start); + start = ctx->data; + break; + } } /* missing '"' */