This diff removes the IO_TLSVERIFIED which is not a io event, and inlines the necessary code where the callback functions are called for this event.
Eric. Index: ioev.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/ioev.c,v retrieving revision 1.27 diff -u -p -r1.27 ioev.c --- ioev.c 16 Nov 2016 21:30:37 -0000 1.27 +++ ioev.c 16 Nov 2016 21:56:25 -0000 @@ -118,7 +118,6 @@ io_strevent(int evt) switch (evt) { CASE(IO_CONNECTED); CASE(IO_TLSREADY); - CASE(IO_TLSVERIFIED); CASE(IO_DATAIN); CASE(IO_LOWAT); CASE(IO_DISCONNECTED); Index: ioev.h =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/ioev.h,v retrieving revision 1.7 diff -u -p -r1.7 ioev.h --- ioev.h 16 Nov 2016 21:30:37 -0000 1.7 +++ ioev.h 16 Nov 2016 21:56:25 -0000 @@ -20,7 +20,6 @@ enum { IO_CONNECTED = 0, /* connection successful */ IO_TLSREADY, /* TLS started successfully */ - IO_TLSVERIFIED, /* XXX - needs more work */ IO_TLSERROR, /* XXX - needs more work */ IO_DATAIN, /* new data in input buffer */ IO_LOWAT, /* output queue running low */ Index: mta_session.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/mta_session.c,v retrieving revision 1.84 diff -u -p -r1.84 mta_session.c --- mta_session.c 16 Nov 2016 21:30:37 -0000 1.84 +++ mta_session.c 16 Nov 2016 21:56:25 -0000 @@ -259,6 +259,7 @@ mta_session_imsg(struct mproc *p, struct const char *name; void *ssl; int dnserror, status; + X509 *x; switch (imsg->hdr.type) { @@ -363,7 +364,22 @@ mta_session_imsg(struct mproc *p, struct return; } - mta_io(&s->io, IO_TLSVERIFIED, s->io.arg); + x = SSL_get_peer_certificate(s->io.ssl); + if (x) { + log_info("smtp-out: Server certificate verification %s " + "on session %016"PRIx64, + (s->flags & MTA_VERIFIED) ? "succeeded" : "failed", + s->id); + X509_free(x); + } + + if (s->use_smtps) { + mta_enter_state(s, MTA_BANNER); + io_set_read(&s->io); + } + else + mta_enter_state(s, MTA_EHLO); + io_resume(&s->io, IO_PAUSE_IN); io_reload(&s->io); return; @@ -1141,7 +1157,6 @@ mta_io(struct io *io, int evt, void *arg size_t len; const char *error; int cont; - X509 *x; log_trace(TRACE_IO, "mta: %p: %s %s", s, io_strevent(evt), io_strio(io)); @@ -1170,24 +1185,6 @@ mta_io(struct io *io, int evt, void *arg io_pause(&s->io, IO_PAUSE_IN); break; } - - case IO_TLSVERIFIED: - x = SSL_get_peer_certificate(s->io.ssl); - if (x) { - log_info("smtp-out: Server certificate verification %s " - "on session %016"PRIx64, - (s->flags & MTA_VERIFIED) ? "succeeded" : "failed", - s->id); - X509_free(x); - } - - if (s->use_smtps) { - mta_enter_state(s, MTA_BANNER); - io_set_read(io); - } - else - mta_enter_state(s, MTA_EHLO); - break; case IO_DATAIN: nextline: Index: smtp_session.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/smtp_session.c,v retrieving revision 1.290 diff -u -p -r1.290 smtp_session.c --- smtp_session.c 16 Nov 2016 21:30:37 -0000 1.290 +++ smtp_session.c 16 Nov 2016 21:56:26 -0000 @@ -698,6 +698,7 @@ smtp_session_imsg(struct mproc *p, struc uint32_t msgid; int status, success, dnserror; void *ssl_ctx; + X509 *x; switch (imsg->hdr.type) { case IMSG_SMTP_DNS_PTR: @@ -993,7 +994,26 @@ smtp_session_imsg(struct mproc *p, struc smtp_free(s, "SSL certificate check failed"); return; } - smtp_io(&s->io, IO_TLSVERIFIED, s->io.arg); + + x = SSL_get_peer_certificate(s->io.ssl); + if (x) { + log_info("%016"PRIx64" smtp " + "event=client-cert-check address=%s host=%s result=\"%s\"", + s->id, ss_to_text(&s->ss), s->hostname, + (s->flags & SF_VERIFIED) ? "success" : "failure"); + X509_free(x); + } + + if (s->listener->flags & F_SMTPS) { + stat_increment("smtp.smtps", 1); + io_set_write(&s->io); + smtp_send_banner(s); + } + else { + stat_increment("smtp.tls", 1); + smtp_enter_state(s, STATE_HELO); + } + io_resume(&s->io, IO_PAUSE_IN); return; } @@ -1238,7 +1258,6 @@ smtp_io(struct io *io, int evt, void *ar struct smtp_session *s = arg; char *line; size_t len; - X509 *x; log_trace(TRACE_IO, "smtp: %p: %s %s", s, io_strevent(evt), io_strio(io)); @@ -1266,27 +1285,6 @@ smtp_io(struct io *io, int evt, void *ar } /* No verification required, cascade */ - - case IO_TLSVERIFIED: - x = SSL_get_peer_certificate(s->io.ssl); - if (x) { - log_info("%016"PRIx64" smtp " - "event=client-cert-check address=%s host=%s result=\"%s\"", - s->id, ss_to_text(&s->ss), s->hostname, - (s->flags & SF_VERIFIED) ? "success" : "failure"); - X509_free(x); - } - - if (s->listener->flags & F_SMTPS) { - stat_increment("smtp.smtps", 1); - io_set_write(&s->io); - smtp_send_banner(s); - } - else { - stat_increment("smtp.tls", 1); - smtp_enter_state(s, STATE_HELO); - } - break; case IO_DATAIN: nextline: