diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-10-25 20:26:32 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-10-25 20:26:32 +0100 |
commit | 76181fd6823a644c2670b36341915ad51e804eb2 (patch) | |
tree | 787e05774f50e2e27c43572e10be03a51ce6d26a /src/libutil/str_util.c | |
parent | ad4de4e521e50cba7900171fb06820d0f1219719 (diff) | |
download | rspamd-76181fd6823a644c2670b36341915ad51e804eb2.tar.gz rspamd-76181fd6823a644c2670b36341915ad51e804eb2.zip |
[Minor] Another uuencode fix
Diffstat (limited to 'src/libutil/str_util.c')
-rw-r--r-- | src/libutil/str_util.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c index d1f2cbfe6..866ef52d8 100644 --- a/src/libutil/str_util.c +++ b/src/libutil/str_util.c @@ -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; |