Hi.
When using the internal io api, the caller had to explicitely reset an
io event in some cases (basically when data is buffered outside of an
io callback context) which could easily be missed. This has been the
cause of some of smtpd bugs in the past (hanging sessions).
After the recent changes, it's now possible to make it a lot simpler
by triggering an event reload internally when data is queued. So the
api user does not have to worry about it.
Eric.
Index: ioev.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/ioev.c,v
retrieving revision 1.31
diff -u -p -r1.31 ioev.c
--- ioev.c 22 Nov 2016 07:28:42 -0000 1.31
+++ ioev.c 22 Nov 2016 22:24:25 -0000
@@ -370,13 +370,25 @@ io_set_write(struct io *io)
int
io_write(struct io *io, const void *buf, size_t len)
{
- return iobuf_queue(io->iobuf, buf, len);
+ int r;
+
+ r = iobuf_queue(io->iobuf, buf, len);
+
+ io_reload(io);
+
+ return r;
}
int
io_writev(struct io *io, const struct iovec *iov, int iovcount)
{
- return iobuf_queuev(io->iobuf, iov, iovcount);
+ int r;
+
+ r = iobuf_queuev(io->iobuf, iov, iovcount);
+
+ io_reload(io);
+
+ return r;
}
int
Index: mta_session.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/mta_session.c,v
retrieving revision 1.89
diff -u -p -r1.89 mta_session.c
--- mta_session.c 22 Nov 2016 07:28:42 -0000 1.89
+++ mta_session.c 22 Nov 2016 22:24:26 -0000
@@ -280,7 +280,6 @@ mta_session_imsg(struct mproc *p, struct
mta_flush_task(s, IMSG_MTA_DELIVERY_TEMPFAIL,
"Could not get message fd", 0, 0);
mta_enter_state(s, MTA_READY);
- io_reload(&s->io);
return;
}
@@ -289,7 +288,6 @@ mta_session_imsg(struct mproc *p, struct
fatal("mta: fdopen");
mta_enter_state(s, MTA_MAIL);
- io_reload(&s->io);
return;
case IMSG_MTA_DNS_PTR:
@@ -366,7 +364,6 @@ mta_session_imsg(struct mproc *p, struct
mta_tls_verified(s);
io_resume(&s->io, IO_PAUSE_IN);
- io_reload(&s->io);
return;
case IMSG_MTA_LOOKUP_HELO:
@@ -456,7 +453,6 @@ mta_on_timeout(struct runq *runq, void *
s->hangon++;
mta_enter_state(s, MTA_READY);
- io_reload(&s->io);
}
static void
Index: smtp_session.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtp_session.c,v
retrieving revision 1.295
diff -u -p -r1.295 smtp_session.c
--- smtp_session.c 22 Nov 2016 07:28:42 -0000 1.295
+++ smtp_session.c 22 Nov 2016 22:24:26 -0000
@@ -738,14 +738,12 @@ smtp_session_imsg(struct mproc *p, struc
smtp_filter_tx_rollback(s);
smtp_tx_free(s->tx);
smtp_reply(s, "%d %s", 530, "Sender rejected");
- io_reload(&s->io);
break;
case LKA_TEMPFAIL:
smtp_filter_tx_rollback(s);
smtp_tx_free(s->tx);
smtp_reply(s, "421 %s: Temporary Error",
esc_code(ESC_STATUS_TEMPFAIL,
ESC_OTHER_MAIL_SYSTEM_STATUS));
- io_reload(&s->io);
break;
}
return;
@@ -766,7 +764,6 @@ smtp_session_imsg(struct mproc *p, struc
case LKA_TEMPFAIL:
smtp_reply(s, "%s", line);
}
- io_reload(&s->io);
return;
case IMSG_SMTP_LOOKUP_HELO:
@@ -802,7 +799,6 @@ smtp_session_imsg(struct mproc *p, struc
smtp_enter_state(s, STATE_QUIT);
}
m_end(&m);
- io_reload(&s->io);
return;
case IMSG_SMTP_MESSAGE_OPEN:
@@ -818,7 +814,6 @@ smtp_session_imsg(struct mproc *p, struc
smtp_reply(s, "421 %s: Temporary Error",
esc_code(ESC_STATUS_TEMPFAIL,
ESC_OTHER_MAIL_SYSTEM_STATUS));
smtp_enter_state(s, STATE_QUIT);
- io_reload(&s->io);
return;
}
@@ -872,7 +867,6 @@ smtp_session_imsg(struct mproc *p, struc
esc_code(ESC_STATUS_OK,
ESC_DESTINATION_ADDRESS_VALID),
esc_description(ESC_DESTINATION_ADDRESS_VALID));
}
- io_reload(&s->io);
return;
case IMSG_SMTP_MESSAGE_COMMIT:
@@ -887,7 +881,6 @@ smtp_session_imsg(struct mproc *p, struc
smtp_reply(s, "421 %s: Temporary failure",
esc_code(ESC_STATUS_TEMPFAIL,
ESC_OTHER_MAIL_SYSTEM_STATUS));
smtp_enter_state(s, STATE_QUIT);
- io_reload(&s->io);
return;
}
@@ -915,7 +908,6 @@ smtp_session_imsg(struct mproc *p, struc
smtp_tx_free(s->tx);
s->mailcount++;
smtp_enter_state(s, STATE_HELO);
- io_reload(&s->io);
return;
case IMSG_SMTP_AUTHENTICATE:
@@ -955,7 +947,6 @@ smtp_session_imsg(struct mproc *p, struc
fatalx("bad lka response");
smtp_enter_state(s, STATE_HELO);
- io_reload(&s->io);
return;
case IMSG_SMTP_TLS_INIT:
@@ -1045,7 +1036,6 @@ smtp_filter_response(uint64_t id, int qu
line = line ? line : "Temporary failure";
smtp_reply(s, "%d %s", code, line);
smtp_enter_state(s, STATE_QUIT);
- io_reload(&s->io);
return;
}
@@ -1085,7 +1075,6 @@ smtp_filter_response(uint64_t id, int qu
code = code ? code : 530;
line = line ? line : "Hello rejected";
smtp_reply(s, "%d %s", code, line);
- io_reload(&s->io);
return;
}
@@ -1108,7 +1097,6 @@ smtp_filter_response(uint64_t id, int qu
smtp_reply(s, "250-AUTH PLAIN LOGIN");
smtp_reply(s, "250 HELP");
}
- io_reload(&s->io);
return;
case QUERY_MAIL:
@@ -1118,7 +1106,6 @@ smtp_filter_response(uint64_t id, int qu
code = code ? code : 530;
line = line ? line : "Sender rejected";
smtp_reply(s, "%d %s", code, line);
- io_reload(&s->io);
return;
}
@@ -1141,7 +1128,6 @@ smtp_filter_response(uint64_t id, int qu
code = code ? code : 530;
line = line ? line : "Recipient rejected";
smtp_reply(s, "%d %s", code, line);
- io_reload(&s->io);
return;
}
@@ -1157,7 +1143,6 @@ smtp_filter_response(uint64_t id, int qu
code = code ? code : 530;
line = line ? line : "Message rejected";
smtp_reply(s, "%d %s", code, line);
- io_reload(&s->io);
return;
}
smtp_queue_open_message(s);
@@ -1173,7 +1158,6 @@ smtp_filter_response(uint64_t id, int qu
line = line ? line : "Message rejected";
smtp_reply(s, "%d %s", code, line);
smtp_enter_state(s, STATE_HELO);
- io_reload(&s->io);
return;
}
smtp_message_end(s);
@@ -1198,7 +1182,6 @@ smtp_filter_fd(uint64_t id, int fd)
smtp_reply(s, "421 %s: Temporary Error",
esc_code(ESC_STATUS_TEMPFAIL,
ESC_OTHER_MAIL_SYSTEM_STATUS));
smtp_enter_state(s, STATE_QUIT);
- io_reload(&s->io);
return;
}
@@ -1257,7 +1240,6 @@ smtp_filter_fd(uint64_t id, int fd)
" on a line by itself");
tree_xset(&wait_filter_data, s->id, s);
- io_reload(&s->io);
}
static void
@@ -1341,8 +1323,6 @@ smtp_io(struct io *io, int evt, void *ar
s->tx->dataeom = 1;
if (io_queued(&s->tx->oev) == 0)
smtp_data_io_done(s);
- else
- io_reload(&s->tx->oev);
return;
}
@@ -1547,7 +1527,6 @@ smtp_data_io_done(struct smtp_session *s
smtp_reply(s, "421 Internal server error");
smtp_tx_free(s->tx);
smtp_enter_state(s, STATE_HELO);
- io_reload(&s->io);
}
else {
smtp_filter_eom(s);
@@ -2137,7 +2116,6 @@ static void
smtp_send_banner(struct smtp_session *s)
{
smtp_reply(s, "220 %s ESMTP %s", s->smtpname, SMTPD_NAME);
- io_reload(&s->io);
}
void
@@ -2466,7 +2444,6 @@ smtp_auth_failure_resume(int fd, short e
smtp_reply(s, "535 Authentication failed");
smtp_enter_state(s, STATE_HELO);
- io_reload(&s->io);
}
static void
@@ -2662,7 +2639,6 @@ smtp_filter_dataline(struct smtp_session
log_debug("debug: smtp: %p: filter congestion over: pausing
session", s);
io_pause(&s->io, IO_PAUSE_IN);
}
- io_reload(&s->tx->oev);
}
#define CASE(x) case x : return #x