another diff from the -portable repo: https://github.com/OpenSMTPD/OpenSMTPD/pull/1150
per rfc-5321 ยง 4.1.1.9 the NOOP command allows optionally one argument that we SHOULD ignore. The original diff set the check function in the commands table to NULL because NOOP is not a phase that can have filters. However, I prefer to stay on the safe side and add a smtp_check_noop() function. Alternatively, we could allow a NULL check function in smtp_session_imsg(). the rfc specifies only one optional string, while here for semplicity it's relaxed to allow anything. diff /usr/src commit - 8def1c1c2777f0b5175283f8116e1eaab1f1962a path + /usr/src blob - 1686f03e96deeb5e6ea8b065456e04c27c752c8c file + usr.sbin/smtpd/smtp_session.c --- usr.sbin/smtpd/smtp_session.c +++ usr.sbin/smtpd/smtp_session.c @@ -212,6 +212,7 @@ static int smtp_check_noparam(struct smtp_session *, static int smtp_check_mail_from(struct smtp_session *, const char *); static int smtp_check_rcpt_to(struct smtp_session *, const char *); static int smtp_check_data(struct smtp_session *, const char *); +static int smtp_check_noop(struct smtp_session *, const char *); static int smtp_check_noparam(struct smtp_session *, const char *); static void smtp_filter_phase(enum filter_phase, struct smtp_session *, const char *); @@ -276,7 +277,7 @@ static struct { { CMD_DATA, FILTER_DATA, "DATA", smtp_check_data, smtp_proceed_data }, { CMD_RSET, FILTER_RSET, "RSET", smtp_check_rset, smtp_proceed_rset }, { CMD_QUIT, FILTER_QUIT, "QUIT", smtp_check_noparam, smtp_proceed_quit }, - { CMD_NOOP, FILTER_NOOP, "NOOP", smtp_check_noparam, smtp_proceed_noop }, + { CMD_NOOP, FILTER_NOOP, "NOOP", smtp_check_noop, smtp_proceed_noop }, { CMD_HELP, FILTER_HELP, "HELP", smtp_check_noparam, smtp_proceed_help }, { CMD_WIZ, FILTER_WIZ, "WIZ", smtp_check_noparam, smtp_proceed_wiz }, { CMD_COMMIT, FILTER_COMMIT, ".", smtp_check_noparam, smtp_proceed_commit }, @@ -1343,8 +1344,8 @@ smtp_command(struct smtp_session *s, char *line) break; case CMD_NOOP: - if (!smtp_check_noparam(s, args)) - break; + if (!smtp_check_noop(s, args)) + break; smtp_filter_phase(FILTER_NOOP, s, NULL); break; @@ -1631,6 +1632,12 @@ smtp_check_noparam(struct smtp_session *s, const char } static int +smtp_check_noop(struct smtp_session *s, const char *args) +{ + return 1; +} + +static int smtp_check_noparam(struct smtp_session *s, const char *args) { if (args != NULL) {