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

Reply via email to