aboutsummaryrefslogtreecommitdiff
path: root/pmult
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2008-11-06 07:48:29 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2008-11-06 07:48:29 +0000
commit3676eeb4e925817b23b5cb98c5ea9f63c6f7a0ca (patch)
treefba877da3d60cd3b6542a7c21b6b12b1c55a65e7 /pmult
parent7a91ff0db3fc3ec881a114b2b720bee6c87b4ad2 (diff)
downloadmailfromd-3676eeb4e925817b23b5cb98c5ea9f63c6f7a0ca.tar.gz
mailfromd-3676eeb4e925817b23b5cb98c5ea9f63c6f7a0ca.tar.bz2
Bugfix
* pmult/pmult.c (collect_headers): Rewrite state machine to ensure each state either advances off or switches to the new state. git-svn-id: file:///svnroot/mailfromd/trunk@1725 7a8a7f39-df28-0410-adc6-e0d955640f24
Diffstat (limited to 'pmult')
-rw-r--r--pmult/pmult.c81
1 files changed, 40 insertions, 41 deletions
diff --git a/pmult/pmult.c b/pmult/pmult.c
index c74b6ca1..b517bc70 100644
--- a/pmult/pmult.c
+++ b/pmult/pmult.c
@@ -1688,10 +1688,13 @@ collect_headers (struct pmult_priv_data *p, unsigned char *buf, size_t len,
p->state = pmult_msg_state_headers;
}
- for (;;)
+ while (off < len
+ && p->state != pmult_msg_state_body
+ && p->state != pmult_msg_state_eom)
{
- if (p->state == pmult_msg_state_headers)
+ switch (p->state)
{
+ case pmult_msg_state_headers:
for (; off < len; off++)
if (buf[off] == '\r')
{
@@ -1699,69 +1702,65 @@ collect_headers (struct pmult_priv_data *p, unsigned char *buf, size_t len,
p->state = pmult_msg_state_cr1;
break;
}
- }
-
- if (off == len)
- break;
-
- if (p->state == pmult_msg_state_cr1 && buf[off] == '\n')
- {
- p->state = pmult_msg_state_crlf1;
- off++;
- }
+ break;
- if (off == len)
- break;
-
- if (p->state == pmult_msg_state_crlf1)
- {
- if (buf[off] == '.')
+ case pmult_msg_state_cr1:
+ switch (buf[off++])
{
- p->state = pmult_msg_state_dot;
- off++;
+ case '\n':
+ p->state = pmult_msg_state_crlf1;
+ break;
+
+ default:
+ p->state = pmult_msg_state_headers;
+ break;
}
- else if (buf[off] == '\r')
+ break;
+
+ case pmult_msg_state_crlf1:
+ switch (buf[off++])
{
+ case '.':
+ p->state = pmult_msg_state_dot;
+ break;
+
+ case '\r':
p->state = pmult_msg_state_cr2;
- off++;
- }
- else
- p->state = pmult_msg_state_headers;
- }
+ break;
- if (off == len)
- break;
+ default:
+ p->state = pmult_msg_state_headers;
+ }
+ break;
- if (p->state == pmult_msg_state_cr2 && buf[off] == '\n')
- {
- p->state = pmult_msg_state_body;
- off++;
+ case pmult_msg_state_cr2:
+ if (buf[off++] == '\n')
+ p->state = pmult_msg_state_body;
+ else
+ p->state = pmult_msg_state_crlf1;
break;
- }
- if (p->state == pmult_msg_state_dot)
- {
+ case pmult_msg_state_dot:
if (buf[off] == '\r')
{
p->state = pmult_msg_state_dot_cr;
off++;
- if (off == len)
- break;
}
else
p->state = pmult_msg_state_headers;
- }
+ break;
- if (p->state == pmult_msg_state_dot_cr)
- {
+ case pmult_msg_state_dot_cr:
if (buf[off] == '\n')
{
p->state = pmult_msg_state_eom;
off++;
- break;
}
else
p->state = pmult_msg_state_headers;
+
+ default:
+ abort ();
}
}

Return to:

Send suggestions and report system problems to the System administrator.