]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Uuencode: Fix parsing of corrupted uuencode
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 25 Oct 2019 16:56:32 +0000 (17:56 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 25 Oct 2019 16:56:32 +0000 (17:56 +0100)
src/libmime/mime_parser.c
src/libutil/str_util.c

index e11b59e34793b4d30e0c43f39c62b0c06d73f279..21374e2495db8e876bae5dbcb5d8f7f3f734f8df 100644 (file)
@@ -568,11 +568,11 @@ rspamd_mime_parse_normal_part (struct rspamd_task *task,
                        part->parsed_data.len = parsed->len;
                }
                else {
-                       msg_err_task ("invalid quoted-printable encoded part, assume 8bit");
+                       msg_err_task ("invalid uuencoding in encoded part, assume 8bit");
                        part->ct->flags |= RSPAMD_CONTENT_TYPE_BROKEN;
                        part->cte = RSPAMD_CTE_8BIT;
-                       memcpy (parsed->str, part->raw_data.begin, part->raw_data.len);
-                       parsed->len = part->raw_data.len;
+                       parsed->len = MIN (part->raw_data.len, parsed->allocated);
+                       memcpy (parsed->str, part->raw_data.begin, parsed->len);
                        part->parsed_data.begin = parsed->str;
                        part->parsed_data.len = parsed->len;
                }
index 7edb1b1095c5e3780586d5d52cae5bd314929e39..d1f2cbfe6932693c24b1cf7178aab13ebb58064c 100644 (file)
@@ -2214,6 +2214,10 @@ rspamd_decode_uue_buf (const gchar *in, gsize inlen,
        out_end = out + outlen;
        remain = inlen;
 
+       /* Skip newlines */
+#define SKIP_NEWLINE do { while (remain > 0 && (*p == '\n' || *p == '\r')) {p ++; remain --; } } while (0)
+       SKIP_NEWLINE;
+
        /* First of all, we need to read the first line (and probably skip it) */
        if (remain < sizeof ("begin-base64 ")) {
                /* Obviously truncated */
@@ -2247,7 +2251,6 @@ rspamd_decode_uue_buf (const gchar *in, gsize inlen,
                return (-1);
        }
 
-#define SKIP_NEWLINE do { while (remain > 0 && (*p == '\n' || *p == '\r')) {p ++; remain --; } } while (0)
 #define        DEC(c)  (((c) - ' ') & 077)             /* single character decode */
 #define IS_DEC(c) ( (((c) - ' ') >= 0) && (((c) - ' ') <= 077 + 1) )
 #define CHAR_OUT(c) do { if (o < out_end) { *o++ = c; } else { return (-1); } } while(0)