>Synopsis:      smtpd does not reject -bs switch causing deadlock
>Category:      mail
>Environment:
        System      : OpenBSD 7.7
        Details     : OpenBSD 7.7 (GENERIC) #619: Sun Apr 13 08:19:34 MDT 2025
                         
dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC

        Architecture: OpenBSD.amd64
        Machine     : amd64
>Description:
        The default behavior of smtpctl(8) when invoked as `sendmail` is to 
ignore
        all unsupported flags, rather than reject them. Per the man page:

        "To maintain compatibility with Sendmail, Inc.'s implementation of
        sendmail, various other flags are accepted, but have no effect."

        In the original Sendmail, the -bs flag implies the following alternate 
mode:

        "Use the SMTP protocol as described in RFC821 on standard input and 
output.
        This flag implies all the operations of the -ba flag that are compatible
        with SMTP."

        i.e. running `sendmail -bs` should immediately write an SMTP greeting 
to stdout:

        220 foo.bar ESMTP Sendmail 8.14.8/8.14.8/Submit; Wed, 30 Apr 2025 
19:03:40 GMT

        Software that calls /usr/sbin/sendmail -bs when OpenSMTPD is the 
default MTA
        will deadlock if until such time it times out, as it is waiting for an 
SMTP
        greeting which never comes, and smtpctl is waiting for input on stdin.

>How-To-Repeat:
        1. run `sendmail -bs`
        2. note no greeting is returned
        3. smtpctl sits there waiting on stdin
>Fix:
        The below patch will explicitly throw an error if smtpctl is invoked as
        `sendmail` and -bs is specified on the command line, signaling to the
        caller that -bs mode is not supported by OpenSMTPD.

Index: smtpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtpctl.c,v
retrieving revision 1.176
diff -u -p -u -p -r1.176 smtpctl.c
--- smtpctl.c   21 Nov 2024 13:42:22 -0000      1.176
+++ smtpctl.c   30 Apr 2025 18:28:50 -0000
@@ -1115,10 +1115,16 @@ sendmail_compat(int argc, char **argv)
                /*
                 * determine whether we are called with flags
                 * that should invoke makemap/newaliases.
+                *
+                * if unsupported sendmail -bs mode is invoked,
+                * return an error to the calling application.
                 */
-               for (i = 1; i < argc; i++)
+               for (i = 1; i < argc; i++) {
                        if (strncmp(argv[i], "-bi", 3) == 0)
                                exit(makemap(P_SENDMAIL, argc, argv));
+                       if (strncmp(argv[i], "-bs", 3) == 0)
+                               errx(1, "-bs mode is not supported");
+               }

                if (!srv_connect())
                        offlinefp = offline_file();

Reply via email to