diff options
author | gilles <gilles@poolp.org> | 2016-10-12 09:12:42 +0200 |
---|---|---|
committer | gilles <gilles@poolp.org> | 2016-10-12 09:14:47 +0200 |
commit | 5b76d7694356c01bf8fb3a197b4379592a4356a8 (patch) | |
tree | 6e9a1a1bd1e8838cb793396977863323a6053a60 | |
parent | update version (diff) | |
download | OpenSMTPD-5b76d7694356c01bf8fb3a197b4379592a4356a8.tar.xz OpenSMTPD-5b76d7694356c01bf8fb3a197b4379592a4356a8.zip |
smtp state machine has a logic bug that can cause a session to hang
-rw-r--r-- | smtpd/rfc2822.c | 5 | ||||
-rw-r--r-- | smtpd/smtp_session.c | 2 |
2 files changed, 7 insertions, 0 deletions
diff --git a/smtpd/rfc2822.c b/smtpd/rfc2822.c index 38c15428..27794751 100644 --- a/smtpd/rfc2822.c +++ b/smtpd/rfc2822.c @@ -50,6 +50,9 @@ header_callback(struct rfc2822_parser *rp) struct rfc2822_hdr_cb *hdr_cb; struct rfc2822_hdr_miss_cb *hdr_miss_cb; + if (!rp->in_hdr) + goto end; + TAILQ_FOREACH(hdr_cb, &rp->hdr_cb, next) if (strcasecmp(hdr_cb->name, rp->header.name) == 0) { hdr_cb->func(&rp->header, hdr_cb->arg); @@ -148,6 +151,8 @@ rfc2822_parser_flush(struct rfc2822_parser *rp) return; header_callback(rp); + + missing_headers_callback(rp); } void diff --git a/smtpd/smtp_session.c b/smtpd/smtp_session.c index 35122e54..b948a945 100644 --- a/smtpd/smtp_session.c +++ b/smtpd/smtp_session.c @@ -1343,6 +1343,8 @@ smtp_io(struct io *io, int evt) s->tx->dataeom = 1; if (iobuf_queued(&s->tx->obuf) == 0) smtp_data_io_done(s); + else + io_reload(&s->tx->oev); return; } |