aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgilles <gilles@poolp.org>2016-10-12 09:12:42 +0200
committergilles <gilles@poolp.org>2016-10-12 09:14:47 +0200
commit5b76d7694356c01bf8fb3a197b4379592a4356a8 (patch)
tree6e9a1a1bd1e8838cb793396977863323a6053a60
parentupdate version (diff)
downloadOpenSMTPD-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.c5
-rw-r--r--smtpd/smtp_session.c2
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;
}