aboutsummaryrefslogtreecommitdiff
path: root/pmult
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2008-10-13 21:13:56 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2008-10-13 21:13:56 +0000
commitb0da7c7aeae0b19fe2ad22b05a860d3a9aecf2cb (patch)
treed3ce474fb532d013e5f77b0e6969bdc940b6fabf /pmult
parent8117cb8aea420210aacbcf7efb377226703a2ecd (diff)
downloadmailfromd-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.c49
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;

Return to:

Send suggestions and report system problems to the System administrator.