]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Another uuencode fix
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 25 Oct 2019 19:26:32 +0000 (20:26 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 25 Oct 2019 19:26:32 +0000 (20:26 +0100)
src/libutil/str_util.c

index d1f2cbfe6932693c24b1cf7178aab13ebb58064c..866ef52d859d2ed777987bc1b57ad15f80917a8a 100644 (file)
@@ -2206,8 +2206,8 @@ rspamd_decode_uue_buf (const gchar *in, gsize inlen,
        const gchar *p;
        gssize remain;
        gboolean base64 = FALSE;
-       goffset newlines_fsm[3], pos;
-       static const gchar *nline = "\r\n";
+       goffset pos;
+       const gchar *nline = "\r\n";
 
        p = in;
        o = out;
@@ -2224,29 +2224,24 @@ rspamd_decode_uue_buf (const gchar *in, gsize inlen,
                return -1;
        }
 
-       rspamd_substring_preprocess_kmp (nline, 2, newlines_fsm,
-                       rspamd_substring_cmp_func);
-
        if (memcmp (p, "begin ", sizeof ("begin ") - 1) == 0) {
                p += sizeof ("begin ") - 1;
                remain -= sizeof ("begin ") - 1;
 
-               pos = rspamd_substring_search_preprocessed (p, remain, nline, 2,
-                               newlines_fsm, rspamd_substring_cmp_func);
+               pos = rspamd_memcspn (p, nline, remain);
        }
        else if (memcmp (p, "begin-base64 ", sizeof ("begin-base64 ") - 1) == 0) {
                base64 = TRUE;
                p += sizeof ("begin-base64 ") - 1;
                remain -= sizeof ("begin-base64 ") - 1;
-               pos = rspamd_substring_search_preprocessed (p, remain, nline, 2,
-                               newlines_fsm, rspamd_substring_cmp_func);
+               pos = rspamd_memcspn (p, nline, remain);
        }
        else {
                /* Crap */
                return (-1);
        }
 
-       if (pos == -1) {
+       if (pos == -1 || remain == 0) {
                /* Crap */
                return (-1);
        }
@@ -2274,12 +2269,15 @@ rspamd_decode_uue_buf (const gchar *in, gsize inlen,
                const gchar *eol;
                gint i, ch;
 
-               pos = rspamd_substring_search_preprocessed (p, remain, nline, 2,
-                               newlines_fsm, rspamd_substring_cmp_func);
+               pos = rspamd_memcspn (p, nline, remain);
+
+               if (pos == 0) {
+                       /* Skip empty lines */
+                       SKIP_NEWLINE;
 
-               if (pos == -1) {
-                       /* Assume end of buffer */
-                       pos = remain;
+                       if (remain == 0) {
+                               break;
+                       }
                }
 
                eol = p + pos;