aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2020-03-31 11:25:27 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2020-03-31 11:25:53 +0100
commit447b68f3590279d3009d342addc575fbbe6735f3 (patch)
treec7c36c222862cf3cbe34c19e9ffa128cd91322d6 /src
parent356d8cfe5fabfe8febf829b6a2640100c53b450c (diff)
downloadrspamd-447b68f3590279d3009d342addc575fbbe6735f3.tar.gz
rspamd-447b68f3590279d3009d342addc575fbbe6735f3.zip
[Fix] Another fix for brain damaged obs-fws state
Diffstat (limited to 'src')
-rw-r--r--src/libutil/str_util.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c
index cb69a8b33..4c16cb685 100644
--- a/src/libutil/str_util.c
+++ b/src/libutil/str_util.c
@@ -1875,16 +1875,13 @@ rspamd_string_find_eoh (GString *input, goffset *body_start)
}
else {
/*
- * newline wsp+ \r <nwsp>, hence:
- * c -> eoh
- * p + 1 -> body start
+ * <nline> <wsp>+ \r <nwsp>.
+ * It is an empty header likely, so we can go further...
+ * https://tools.ietf.org/html/rfc2822#section-4.2
*/
- if (body_start) {
- /* \r\n\r\n */
- *body_start = p - input->str + 1;
- }
-
- return c - input->str;
+ c = p;
+ p ++;
+ state = got_cr;
}
}
else {
@@ -1899,33 +1896,36 @@ rspamd_string_find_eoh (GString *input, goffset *body_start)
else if (*p == '\n') {
/* Perform lookahead due to #2349 */
if (end - p > 1) {
+ /* Continue folding with an empty line */
if (p[1] == ' ' || p[1] == '\t') {
c = p;
p ++;
state = obs_fws;
}
else if (p[1] == '\r') {
+ /* WTF state: we have seen spaces, \n and then it follows \r */
c = p;
p ++;
state = got_lf;
}
else if (p[1] == '\n') {
+ /*
+ * Switching to got_lf state here will let us to finish
+ * the cycle.
+ */
c = p;
p ++;
state = got_lf;
}
else {
/*
- * newline wsp+ \n <nwsp>, hence:
- * c -> eoh
- * p + 1 -> body start
+ * <nline> <wsp>+ \n <nwsp>.
+ * It is an empty header likely, so we can go further...
+ * https://tools.ietf.org/html/rfc2822#section-4.2
*/
- if (body_start) {
- /* \r\n\r\n */
- *body_start = p - input->str + 1;
- }
-
- return c - input->str;
+ c = p;
+ p ++;
+ state = got_lf;
}
}