]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix issues with quoted-printable encoding
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 20 Dec 2016 12:40:28 +0000 (12:40 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 20 Dec 2016 13:00:11 +0000 (13:00 +0000)
src/libmime/mime_headers.c

index 9503862ce305bff09c3148a5e9397160eafc2e6d..27c427ae5fa03abfd17cc6c9abb20103d698a472 100644 (file)
@@ -352,6 +352,7 @@ rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in,
        rspamd_ftok_t cur_charset = {0, NULL}, old_charset = {0, NULL};
        gint encoding;
        gssize r;
+       guint qmarks = 0;
        enum {
                parse_normal = 0,
                got_eqsign,
@@ -384,6 +385,7 @@ rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in,
                case got_eqsign:
                        if (*p == '?') {
                                state = got_encoded_start;
+                               qmarks = 0;
                        }
                        else {
                                g_string_append_len (out, c, 2);
@@ -394,13 +396,17 @@ rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in,
                case got_encoded_start:
                        if (*p == '?') {
                                state = got_more_qmark;
+                               qmarks ++;
                        }
                        p ++;
                        break;
                case got_more_qmark:
                        if (*p == '=') {
+                               if (qmarks < 3) {
+                                       state = got_encoded_start;
+                               }
                                /* Finished encoded boundary */
-                               if (rspamd_rfc2047_parser (c, p - c + 1, &encoding,
+                               else if (rspamd_rfc2047_parser (c, p - c + 1, &encoding,
                                                &cur_charset.begin, &cur_charset.len,
                                                &tok_start, &tok_len)) {
                                        /* We have a token, so we can decode it from `encoding` */
@@ -409,6 +415,8 @@ rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in,
                                                                token, decoded,
                                                                &old_charset, &cur_charset);
                                        }
+
+                                       qmarks = 0;
                                        pos = token->len;
                                        g_byte_array_set_size (token, pos + tok_len);
 
@@ -434,6 +442,7 @@ rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in,
                                                        token->len -= tok_len;
                                                }
                                        }
+
                                        c = p + 1;
                                        state = skip_spaces;
                                }