diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-06 07:48:29 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-06 07:48:29 +0000 |
commit | 3676eeb4e925817b23b5cb98c5ea9f63c6f7a0ca (patch) | |
tree | fba877da3d60cd3b6542a7c21b6b12b1c55a65e7 /pmult | |
parent | 7a91ff0db3fc3ec881a114b2b720bee6c87b4ad2 (diff) | |
download | mailfromd-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.c | 81 |
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 (); } } |