diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-10-13 21:13:56 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-10-13 21:13:56 +0000 |
commit | b0da7c7aeae0b19fe2ad22b05a860d3a9aecf2cb (patch) | |
tree | d3ce474fb532d013e5f77b0e6969bdc940b6fabf /pmult | |
parent | 8117cb8aea420210aacbcf7efb377226703a2ecd (diff) | |
download | mailfromd-b0da7c7aeae0b19fe2ad22b05a860d3a9aecf2cb.tar.gz mailfromd-b0da7c7aeae0b19fe2ad22b05a860d3a9aecf2cb.tar.bz2 |
Minor improvement.
* pmult/pmult.c (enum pmult_msg_state): Add more states.
(collect_headers): Correctly handle end-of-message marker,
even though it should never appear here.
(pmult_msg_handler): Make sure the handler always processes first
handlers, then body, even if some of these two is missing.
git-svn-id: file:///svnroot/mailfromd/trunk@1699 7a8a7f39-df28-0410-adc6-e0d955640f24
Diffstat (limited to 'pmult')
-rw-r--r-- | pmult/pmult.c | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/pmult/pmult.c b/pmult/pmult.c index 61e8107b..80c9b770 100644 --- a/pmult/pmult.c +++ b/pmult/pmult.c @@ -73,7 +73,10 @@ enum pmult_msg_state pmult_msg_state_cr1, pmult_msg_state_crlf1, pmult_msg_state_cr2, - pmult_msg_state_body + pmult_msg_state_body, + pmult_msg_state_dot, + pmult_msg_state_dot_cr, + pmult_msg_state_eom }; struct pmult_priv_data @@ -1392,7 +1395,12 @@ collect_headers (struct pmult_priv_data *p, unsigned char *buf, size_t len, if (p->state == pmult_msg_state_crlf1) { - if (buf[off] == '\r') + if (buf[off] == '.') + { + p->state = pmult_msg_state_dot; + off++; + } + else if (buf[off] == '\r') { p->state = pmult_msg_state_cr2; off++; @@ -1410,6 +1418,27 @@ collect_headers (struct pmult_priv_data *p, unsigned char *buf, size_t len, off++; break; } + + if (p->state == pmult_msg_state_dot) + { + if (buf[off] == '\r') + { + p->state = pmult_msg_state_dot_cr; + off++; + } + else + p->state = pmult_msg_state_headers; + } + + if (p->state == pmult_msg_state_dot_cr) + { + if (buf[off] == '\n' && off + 1 == len) + { + p->state = pmult_msg_state_eom; + *poff = off + 1; + return 0; + } + } } rc = mu_stream_sequential_write (p->hdrstream, buf, off); @@ -1518,16 +1547,20 @@ pmult_msg_handler (pmse_ctx_P pmse_ctx, unsigned char *buf, size_t len) int rc = collect_headers (p, buf, len, &off); if (rc) return SMTP_R_ACCEPT; /* Better safe than sorry. */ - if (p->state != pmult_msg_state_body) - return SMTP_R_OK; /* See comment to rf_body */ - if (process_headers (pmse_ctx, p)) - return SMTP_R_ACCEPT; + if (p->state == pmult_msg_state_eom) + process_headers (pmse_ctx, p); + else + { + if (p->state != pmult_msg_state_body) + return SMTP_R_OK; /* See comment to rf_body */ + if (process_headers (pmse_ctx, p)) + return SMTP_R_ACCEPT; + } len -= off; buf += off; } - /* FIXME: This is not enough, the marker can be split between two - successive calls. */ + /* FIXME: Can the marker be split between two successive calls? */ if (len >= EOM_MARK_LEN && memcmp (buf + len - EOM_MARK_LEN, EOM_MARK, EOM_MARK_LEN) == 0) len -= 3; |