Fix mismerge
[exim.git] / src / src / smtp_in.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim Maintainers 2020 - 2024 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* See the file NOTICE for conditions of use and distribution. */
8 /* SPDX-License-Identifier: GPL-2.0-or-later */
9
10 /* Functions for handling an incoming SMTP call. */
11
12
13 #include "exim.h"
14 #include <assert.h>
15
16
17 /* Initialize for TCP wrappers if so configured. It appears that the macro
18 HAVE_IPV6 is used in some versions of the tcpd.h header, so we unset it before
19 including that header, and restore its value afterwards. */
20
21 #ifdef USE_TCP_WRAPPERS
22
23   #if HAVE_IPV6
24   #define EXIM_HAVE_IPV6
25   #endif
26   #undef HAVE_IPV6
27   #include <tcpd.h>
28   #undef HAVE_IPV6
29   #ifdef EXIM_HAVE_IPV6
30   #define HAVE_IPV6 TRUE
31   #endif
32
33 int allow_severity = LOG_INFO;
34 int deny_severity  = LOG_NOTICE;
35 uschar *tcp_wrappers_name;
36 #endif
37
38
39 /* Size of buffer for reading SMTP commands. We used to use 512, as defined
40 by RFC 821. However, RFC 1869 specifies that this must be increased for SMTP
41 commands that accept arguments, and this in particular applies to AUTH, where
42 the data can be quite long.  More recently this value was 2048 in Exim;
43 however, RFC 4954 (circa 2007) recommends 12288 bytes to handle AUTH.  Clients
44 such as Thunderbird will send an AUTH with an initial-response for GSSAPI.
45 The maximum size of a Kerberos ticket under Windows 2003 is 12000 bytes, and
46 we need room to handle large base64-encoded AUTHs for GSSAPI.
47 */
48
49 #define SMTP_CMD_BUFFER_SIZE  16384
50
51 /* Size of buffer for reading SMTP incoming packets */
52
53 #define IN_BUFFER_SIZE  8192
54
55 /* Structure for SMTP command list */
56
57 typedef struct {
58   const char *name;
59   int len;
60   short int cmd;
61   short int has_arg;
62   short int is_mail_cmd;
63 } smtp_cmd_list;
64
65 /* Codes for identifying commands. We order them so that those that come first
66 are those for which synchronization is always required. Checking this can help
67 block some spam.  */
68
69 enum {
70   /* These commands are required to be synchronized, i.e. to be the last in a
71   block of commands when pipelining. */
72
73   HELO_CMD, EHLO_CMD, DATA_CMD, /* These are listed in the pipelining */
74   VRFY_CMD, EXPN_CMD, NOOP_CMD, /* RFC as requiring synchronization */
75   ATRN_CMD, ETRN_CMD,           /* This by analogy with TURN from the RFC */
76   STARTTLS_CMD,                 /* Required by the STARTTLS RFC */
77   TLS_AUTH_CMD,                 /* auto-command at start of SSL */
78 #ifdef EXPERIMENTAL_XCLIENT
79   XCLIENT_CMD,                  /* per xlexkiro implementation */
80 #endif
81
82   /* This is a dummy to identify the non-sync commands when pipelining */
83
84   NON_SYNC_CMD_PIPELINING,
85
86   /* These commands need not be synchronized when pipelining */
87
88   MAIL_CMD, RCPT_CMD, RSET_CMD,
89 #ifndef DISABLE_WELLKNOWN
90   WELLKNOWN_CMD,
91 #endif
92
93   /* This is a dummy to identify the non-sync commands when not pipelining */
94
95   NON_SYNC_CMD_NON_PIPELINING,
96
97   /* RFC3030 section 2: "After all MAIL and RCPT responses are collected and
98   processed the message is sent using a series of BDAT commands"
99   implies that BDAT should be synchronized.  However, we see Google, at least,
100   sending MAIL,RCPT,BDAT-LAST in a single packet, clearly not waiting for
101   processing of the RCPT response(s).  We shall do the same, and not require
102   synch for BDAT.  Worse, as the chunk may (very likely will) follow the
103   command-header in the same packet we cannot do the usual "is there any
104   follow-on data after the command line" even for non-pipeline mode.
105   So we'll need an explicit check after reading the expected chunk amount
106   when non-pipe, before sending the ACK. */
107
108   BDAT_CMD,
109
110   /* I have been unable to find a statement about the use of pipelining
111   with AUTH, so to be on the safe side it is here, though I kind of feel
112   it should be up there with the synchronized commands. */
113
114   AUTH_CMD,
115
116   /* I'm not sure about these, but I don't think they matter. */
117
118   QUIT_CMD, HELP_CMD,
119
120 #ifdef SUPPORT_PROXY
121   PROXY_FAIL_IGNORE_CMD,
122 #endif
123
124   /* These are specials that don't correspond to actual commands */
125
126   EOF_CMD, OTHER_CMD, BADARG_CMD, BADCHAR_CMD, BADSYN_CMD,
127   TOO_MANY_NONMAIL_CMD
128 };
129
130
131 /* This is a convenience macro for adding the identity of an SMTP command
132 to the circular buffer that holds a list of the last n received. */
133
134 #define HAD(n) \
135     smtp_connection_had[smtp_ch_index++] = n; \
136     if (smtp_ch_index >= SMTP_HBUFF_SIZE) smtp_ch_index = 0
137
138
139 /*************************************************
140 *                Local static variables          *
141 *************************************************/
142
143 static struct {
144   BOOL auth_advertised                  :1;
145 #ifndef DISABLE_TLS
146   BOOL tls_advertised                   :1;
147 #endif
148   BOOL dsn_advertised                   :1;
149   BOOL esmtp                            :1;
150   BOOL helo_verify_required             :1;
151   BOOL helo_verify                      :1;
152   BOOL helo_seen                        :1;
153   BOOL helo_accept_junk                 :1;
154 #ifndef DISABLE_PIPE_CONNECT
155   BOOL pipe_connect_acceptable          :1;
156 #endif
157   BOOL rcpt_smtp_response_same          :1;
158   BOOL rcpt_in_progress                 :1;
159   BOOL smtp_exit_function_called        :1;
160 #ifdef SUPPORT_I18N
161   BOOL smtputf8_advertised              :1;
162 #endif
163 } fl = {
164   .helo_verify_required = FALSE,
165   .helo_verify = FALSE,
166   .smtp_exit_function_called = FALSE,
167 };
168
169 static auth_instance *authenticated_by;
170 static int  count_nonmail;
171 static int  nonmail_command_count;
172 static int  synprot_error_count;
173 static int  unknown_command_count;
174 static int  sync_cmd_limit;
175 static int  smtp_write_error = 0;
176
177 static uschar *rcpt_smtp_response;
178 static uschar *smtp_data_buffer;
179 static uschar *smtp_cmd_data;
180
181 /* We need to know the position of RSET, HELO, EHLO, AUTH, and STARTTLS. Their
182 final fields of all except AUTH are forced TRUE at the start of a new message
183 setup, to allow one of each between messages that is not counted as a nonmail
184 command. (In fact, only one of HELO/EHLO is not counted.) Also, we have to
185 allow a new EHLO after starting up TLS.
186
187 AUTH is "falsely" labelled as a mail command initially, so that it doesn't get
188 counted. However, the flag is changed when AUTH is received, so that multiple
189 failing AUTHs will eventually hit the limit. After a successful AUTH, another
190 AUTH is already forbidden. After a TLS session is started, AUTH's flag is again
191 forced TRUE, to allow for the re-authentication that can happen at that point.
192
193 QUIT is also "falsely" labelled as a mail command so that it doesn't up the
194 count of non-mail commands and possibly provoke an error.
195
196 tls_auth is a pseudo-command, never expected in input.  It is activated
197 on TLS startup and looks for a tls authenticator. */
198
199 enum {
200         CL_RSET = 0,
201         CL_HELO,
202         CL_EHLO,
203         CL_AUTH,
204 #ifndef DISABLE_TLS
205         CL_STLS,
206         CL_TLAU,
207 #endif
208 #ifdef EXPERIMENTAL_XCLIENT
209         CL_XCLI,
210 #endif
211 };
212
213 static smtp_cmd_list cmd_list[] = {
214   /*             name         len                     cmd     has_arg is_mail_cmd */
215
216   [CL_RSET] = { "rset",       sizeof("rset")-1,       RSET_CMD, FALSE, FALSE },  /* First */
217   [CL_HELO] = { "helo",       sizeof("helo")-1,       HELO_CMD, TRUE,  FALSE },
218   [CL_EHLO] = { "ehlo",       sizeof("ehlo")-1,       EHLO_CMD, TRUE,  FALSE },
219   [CL_AUTH] = { "auth",       sizeof("auth")-1,       AUTH_CMD,     TRUE,  TRUE  },
220 #ifndef DISABLE_TLS
221   [CL_STLS] = { "starttls",   sizeof("starttls")-1,   STARTTLS_CMD, FALSE, FALSE },
222   [CL_TLAU] = { "tls_auth",   0,                      TLS_AUTH_CMD, FALSE, FALSE },
223 #endif
224 #ifdef EXPERIMENTAL_XCLIENT
225   [CL_XCLI] = { "xclient",    sizeof("xclient")-1,    XCLIENT_CMD, TRUE,  FALSE },
226 #endif
227
228   { "mail from:", sizeof("mail from:")-1, MAIL_CMD, TRUE,  TRUE  },
229   { "rcpt to:",   sizeof("rcpt to:")-1,   RCPT_CMD, TRUE,  TRUE  },
230   { "data",       sizeof("data")-1,       DATA_CMD, FALSE, TRUE  },
231   { "bdat",       sizeof("bdat")-1,       BDAT_CMD, TRUE,  TRUE  },
232   { "quit",       sizeof("quit")-1,       QUIT_CMD, FALSE, TRUE  },
233   { "noop",       sizeof("noop")-1,       NOOP_CMD, TRUE,  FALSE },
234   { "atrn",       sizeof("atrn")-1,       ATRN_CMD, TRUE,  FALSE },
235   { "etrn",       sizeof("etrn")-1,       ETRN_CMD, TRUE,  FALSE },
236   { "vrfy",       sizeof("vrfy")-1,       VRFY_CMD, TRUE,  FALSE },
237   { "expn",       sizeof("expn")-1,       EXPN_CMD, TRUE,  FALSE },
238   { "help",       sizeof("help")-1,       HELP_CMD, TRUE,  FALSE },
239 #ifndef DISABLE_WELLKNOWN
240   { "wellknown",  sizeof("wellknown")-1,  WELLKNOWN_CMD, TRUE,  FALSE },
241 #endif
242 };
243
244 /* This list of names is used for performing the smtp_no_mail logging action. */
245
246 uschar * smtp_names[] =
247   {
248   [SCH_NONE] = US"NONE",
249   [SCH_AUTH] = US"AUTH",
250   [SCH_DATA] = US"DATA",
251   [SCH_BDAT] = US"BDAT",
252   [SCH_EHLO] = US"EHLO",
253   [SCH_ETRN] = US"ETRN",
254   [SCH_EXPN] = US"EXPN",
255   [SCH_HELO] = US"HELO",
256   [SCH_HELP] = US"HELP",
257   [SCH_MAIL] = US"MAIL",
258   [SCH_NOOP] = US"NOOP",
259   [SCH_QUIT] = US"QUIT",
260   [SCH_RCPT] = US"RCPT",
261   [SCH_RSET] = US"RSET",
262   [SCH_STARTTLS] = US"STARTTLS",
263   [SCH_VRFY] = US"VRFY",
264 #ifndef DISABLE_WELLKNOWN
265   [SCH_WELLKNOWN] = US"WELLKNOWN",
266 #endif
267 #ifdef EXPERIMENTAL_XCLIENT
268   [SCH_XCLIENT] = US"XCLIENT",
269 #endif
270   };
271
272 static uschar *protocols_local[] = {
273   US"local-smtp",        /* HELO */
274   US"local-smtps",       /* The rare case EHLO->STARTTLS->HELO */
275   US"local-esmtp",       /* EHLO */
276   US"local-esmtps",      /* EHLO->STARTTLS->EHLO */
277   US"local-esmtpa",      /* EHLO->AUTH */
278   US"local-esmtpsa"      /* EHLO->STARTTLS->EHLO->AUTH */
279   };
280 static uschar *protocols[] = {
281   US"smtp",              /* HELO */
282   US"smtps",             /* The rare case EHLO->STARTTLS->HELO */
283   US"esmtp",             /* EHLO */
284   US"esmtps",            /* EHLO->STARTTLS->EHLO */
285   US"esmtpa",            /* EHLO->AUTH */
286   US"esmtpsa"            /* EHLO->STARTTLS->EHLO->AUTH */
287   };
288
289 #define pnormal  0
290 #define pextend  2
291 #define pcrpted  1  /* added to pextend or pnormal */
292 #define pauthed  2  /* added to pextend */
293
294 /* Sanity check and validate optional args to MAIL FROM: envelope */
295 enum {
296   ENV_MAIL_OPT_NULL,
297   ENV_MAIL_OPT_SIZE, ENV_MAIL_OPT_BODY, ENV_MAIL_OPT_AUTH,
298 #ifndef DISABLE_PRDR
299   ENV_MAIL_OPT_PRDR,
300 #endif
301   ENV_MAIL_OPT_RET, ENV_MAIL_OPT_ENVID,
302 #ifdef SUPPORT_I18N
303   ENV_MAIL_OPT_UTF8,
304 #endif
305   };
306 typedef struct {
307   uschar *   name;  /* option requested during MAIL cmd */
308   int       value;  /* enum type */
309   BOOL need_value;  /* TRUE requires value (name=value pair format)
310                        FALSE is a singleton */
311   } env_mail_type_t;
312 static env_mail_type_t env_mail_type_list[] = {
313     { US"SIZE",   ENV_MAIL_OPT_SIZE,   TRUE  },
314     { US"BODY",   ENV_MAIL_OPT_BODY,   TRUE  },
315     { US"AUTH",   ENV_MAIL_OPT_AUTH,   TRUE  },
316 #ifndef DISABLE_PRDR
317     { US"PRDR",   ENV_MAIL_OPT_PRDR,   FALSE },
318 #endif
319     { US"RET",    ENV_MAIL_OPT_RET,    TRUE },
320     { US"ENVID",  ENV_MAIL_OPT_ENVID,  TRUE },
321 #ifdef SUPPORT_I18N
322     { US"SMTPUTF8",ENV_MAIL_OPT_UTF8,  FALSE },         /* rfc6531 */
323 #endif
324     /* keep this the last entry */
325     { US"NULL",   ENV_MAIL_OPT_NULL,   FALSE },
326   };
327
328 /* When reading SMTP from a remote host, we have to use our own versions of the
329 C input-reading functions, in order to be able to flush the SMTP output only
330 when about to read more data from the socket. This is the only way to get
331 optimal performance when the client is using pipelining. Flushing for every
332 command causes a separate packet and reply packet each time; saving all the
333 responses up (when pipelining) combines them into one packet and one response.
334
335 For simplicity, these functions are used for *all* SMTP input, not only when
336 receiving over a socket. However, after setting up a secure socket (SSL), input
337 is read via the OpenSSL library, and another set of functions is used instead
338 (see tls.c).
339
340 These functions are set in the receive_getc etc. variables and called with the
341 same interface as the C functions. However, since there can only ever be
342 one incoming SMTP call, we just use a single buffer and flags. There is no need
343 to implement a complicated private FILE-like structure.*/
344
345 static uschar *smtp_inbuffer;
346 static uschar *smtp_inptr;
347 static uschar *smtp_inend;
348 static int     smtp_had_eof;
349 static int     smtp_had_error;
350
351
352 /* forward declarations */
353 static int smtp_read_command(BOOL check_sync, unsigned buffer_lim);
354 static void smtp_quit_handler(uschar **, uschar **);
355 static void smtp_rset_handler(void);
356
357 /*************************************************
358 *          Log incomplete transactions           *
359 *************************************************/
360
361 /* This function is called after a transaction has been aborted by RSET, QUIT,
362 connection drops or other errors. It logs the envelope information received
363 so far in order to preserve address verification attempts.
364
365 Argument:   string to indicate what aborted the transaction
366 Returns:    nothing
367 */
368
369 static void
370 incomplete_transaction_log(uschar * what)
371 {
372 if (!sender_address                             /* No transaction in progress */
373    || !LOGGING(smtp_incomplete_transaction))
374   return;
375
376 /* Build list of recipients for logging */
377
378 if (recipients_count > 0)
379   {
380   raw_recipients = store_get(recipients_count * sizeof(uschar *), GET_UNTAINTED);
381   for (int i = 0; i < recipients_count; i++)
382     raw_recipients[i] = recipients_list[i].address;
383   raw_recipients_count = recipients_count;
384   }
385
386 log_write(L_smtp_incomplete_transaction, LOG_MAIN|LOG_SENDER|LOG_RECIPIENTS,
387   "%s incomplete transaction (%s)", host_and_ident(TRUE), what);
388 }
389
390
391
392 static void
393 log_close_event(const uschar * reason)
394 {
395 log_write(L_smtp_connection, LOG_MAIN, "%s D=%s closed %s",
396   smtp_get_connection_info(), string_timesince(&smtp_connection_start), reason);
397 }
398
399
400 void
401 smtp_command_timeout_exit(void)
402 {
403 log_write(L_lost_incoming_connection,
404           LOG_MAIN, "SMTP command timeout on%s connection from %s D=%s",
405           tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE),
406           string_timesince(&smtp_connection_start));
407 if (smtp_batched_input)
408   moan_smtp_batch(NULL, "421 SMTP command timeout"); /* Does not return */
409 smtp_notquit_exit(US"command-timeout", US"421",
410   US"%s: SMTP command timeout - closing connection",
411   smtp_active_hostname);
412 exim_exit(EXIT_FAILURE);
413 }
414
415 void
416 smtp_command_sigterm_exit(void)
417 {
418 log_close_event(US"after SIGTERM");
419 if (smtp_batched_input)
420   moan_smtp_batch(NULL, "421 SIGTERM received");  /* Does not return */
421 smtp_notquit_exit(US"signal-exit", US"421",
422   US"%s: Service not available - closing connection", smtp_active_hostname);
423 exim_exit(EXIT_FAILURE);
424 }
425
426 void
427 smtp_data_timeout_exit(void)
428 {
429 log_write(L_lost_incoming_connection, LOG_MAIN,
430   "SMTP data timeout (message abandoned) on connection from %s F=<%s> D=%s",
431   sender_fullhost ? sender_fullhost : US"local process", sender_address,
432   string_timesince(&smtp_connection_start));
433 receive_bomb_out(US"data-timeout", US"SMTP incoming data timeout");
434 /* Does not return */
435 }
436
437 void
438 smtp_data_sigint_exit(void)
439 {
440 log_close_event(had_data_sigint == SIGTERM ? US"SIGTERM":US"SIGINT");
441 receive_bomb_out(US"signal-exit",
442   US"Service not available - SIGTERM or SIGINT received");
443 /* Does not return */
444 }
445
446
447 /******************************************************************************/
448 /* SMTP input buffer handling.  Most of these are similar to stdio routines.  */
449
450 static void
451 smtp_buf_init(void)
452 {
453 /* Set up the buffer for inputting using direct read() calls, and arrange to
454 call the local functions instead of the standard C ones.  Place a NUL at the
455 end of the buffer to safety-stop C-string reads from it. */
456
457 if (!(smtp_inbuffer = US malloc(IN_BUFFER_SIZE)))
458   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malloc() failed for SMTP input buffer");
459 smtp_inbuffer[IN_BUFFER_SIZE-1] = '\0';
460
461 smtp_inptr = smtp_inend = smtp_inbuffer;
462 smtp_had_eof = smtp_had_error = 0;
463 }
464
465
466
467 #ifndef DISABLE_DKIM
468 /* Feed received message data to the dkim module */
469 /*XXX maybe a global dkim_info? */
470 void
471 smtp_verify_feed(const uschar * s, unsigned n)
472 {
473 static misc_module_info * dkim_mi = NULL;
474 typedef void (*fn_t)(const uschar *, int);
475
476 if (!dkim_mi && !(dkim_mi = misc_mod_findonly(US"dkim")))
477   return;
478
479 (((fn_t *) dkim_mi->functions)[DKIM_VERIFY_FEED]) (s, n);
480 }
481 #endif
482
483
484 /* Refill the buffer, and notify DKIM verification code.
485 Return false for error or EOF.
486 */
487
488 static BOOL
489 smtp_refill(unsigned lim)
490 {
491 int rc, save_errno;
492
493 if (!smtp_out) return FALSE;
494 fflush(smtp_out);
495 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
496
497 /* Limit amount read, so non-message data is not fed to DKIM.
498 Take care to not touch the safety NUL at the end of the buffer. */
499
500 rc = read(fileno(smtp_in), smtp_inbuffer, MIN(IN_BUFFER_SIZE-1, lim));
501 save_errno = errno;
502 if (smtp_receive_timeout > 0) ALARM_CLR(0);
503 if (rc <= 0)
504   {
505   /* Must put the error text in fixed store, because this might be during
506   header reading, where it releases unused store above the header. */
507   if (rc < 0)
508     {
509     if (had_command_timeout)            /* set by signal handler */
510       smtp_command_timeout_exit();      /* does not return */
511     if (had_command_sigterm)
512       smtp_command_sigterm_exit();
513     if (had_data_timeout)
514       smtp_data_timeout_exit();
515     if (had_data_sigint)
516       smtp_data_sigint_exit();
517
518     smtp_had_error = save_errno;
519     smtp_read_error = string_copy_perm(
520       string_sprintf(" (error: %s)", strerror(save_errno)), FALSE);
521     }
522   else
523     smtp_had_eof = 1;
524   return FALSE;
525   }
526 #ifndef DISABLE_DKIM
527 smtp_verify_feed(smtp_inbuffer, rc);
528 #endif
529 smtp_inend = smtp_inbuffer + rc;
530 smtp_inptr = smtp_inbuffer;
531 return TRUE;
532 }
533
534
535 /* Check if there is buffered data */
536
537 BOOL
538 smtp_hasc(void)
539 {
540 return smtp_inptr < smtp_inend;
541 }
542
543 /* SMTP version of getc()
544
545 This gets the next byte from the SMTP input buffer. If the buffer is empty,
546 it flushes the output, and refills the buffer, with a timeout. The signal
547 handler is set appropriately by the calling function. This function is not used
548 after a connection has negotiated itself into an TLS/SSL state.
549
550 Arguments:  lim         Maximum amount to read/buffer
551 Returns:    the next character or EOF
552 */
553
554 int
555 smtp_getc(unsigned lim)
556 {
557 if (!smtp_hasc() && !smtp_refill(lim)) return EOF;
558 return *smtp_inptr++;
559 }
560
561 /* Get many bytes, refilling buffer if needed */
562
563 uschar *
564 smtp_getbuf(unsigned * len)
565 {
566 unsigned size;
567 uschar * buf;
568
569 if (!smtp_hasc() && !smtp_refill(*len))
570   { *len = 0; return NULL; }
571
572 if ((size = smtp_inend - smtp_inptr) > *len) size = *len;
573 buf = smtp_inptr;
574 smtp_inptr += size;
575 *len = size;
576 return buf;
577 }
578
579 /* Copy buffered data to the dkim feed.
580 Called, unless TLS, just before starting to read message headers. */
581
582 void
583 smtp_get_cache(unsigned lim)
584 {
585 #ifndef DISABLE_DKIM
586 int n = smtp_inend - smtp_inptr;
587 if (n > lim)
588   n = lim;
589 if (n > 0)
590   smtp_verify_feed(smtp_inptr, n);
591 #endif
592 }
593
594
595 /* SMTP version of ungetc()
596 Puts a character back in the input buffer. Only ever called once.
597
598 Arguments:
599   ch           the character
600
601 Returns:       the character
602 */
603
604 int
605 smtp_ungetc(int ch)
606 {
607 if (smtp_inptr <= smtp_inbuffer)        /* NB: NOT smtp_hasc() ! */
608   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "buffer underflow in smtp_ungetc");
609
610 *--smtp_inptr = ch;
611 return ch;
612 }
613
614
615 /* SMTP version of feof()
616 Tests for a previous EOF
617
618 Arguments:     none
619 Returns:       non-zero if the eof flag is set
620 */
621
622 int
623 smtp_feof(void)
624 {
625 return smtp_had_eof;
626 }
627
628
629 /* SMTP version of ferror()
630 Tests for a previous read error, and returns with errno
631 restored to what it was when the error was detected.
632
633 Arguments:     none
634 Returns:       non-zero if the error flag is set
635 */
636
637 int
638 smtp_ferror(void)
639 {
640 errno = smtp_had_error;
641 return smtp_had_error;
642 }
643
644
645 /* Check if a getc will block or not */
646
647 static BOOL
648 smtp_could_getc(void)
649 {
650 int fd, rc;
651 fd_set fds;
652 struct timeval tzero = {.tv_sec = 0, .tv_usec = 0};
653
654 if (smtp_inptr < smtp_inend)
655   return TRUE;
656
657 fd = fileno(smtp_in);
658 FD_ZERO(&fds);
659 FD_SET(fd, &fds);
660 rc = select(fd + 1, (SELECT_ARG2_TYPE *)&fds, NULL, NULL, &tzero);
661
662 if (rc <= 0) return FALSE;     /* Not ready to read */
663 rc = smtp_getc(GETC_BUFFER_UNLIMITED);
664 if (rc < 0) return FALSE;      /* End of file or error */
665
666 smtp_ungetc(rc);
667 return TRUE;
668 }
669
670
671 /******************************************************************************/
672 /*************************************************
673 *          Recheck synchronization               *
674 *************************************************/
675
676 /* Synchronization checks can never be perfect because a packet may be on its
677 way but not arrived when the check is done.  Normally, the checks happen when
678 commands are read: Exim ensures that there is no more input in the input buffer.
679 In normal cases, the response to the command will be fast, and there is no
680 further check.
681
682 However, for some commands an ACL is run, and that can include delays. In those
683 cases, it is useful to do another check on the input just before sending the
684 response. This also applies at the start of a connection. This function does
685 that check by means of the select() function, as long as the facility is not
686 disabled or inappropriate. A failure of select() is ignored.
687
688 When there is unwanted input, we read it so that it appears in the log of the
689 error.
690
691 Arguments: none
692 Returns:   TRUE if all is well; FALSE if there is input pending
693 */
694
695 static BOOL
696 wouldblock_reading(void)
697 {
698 #ifndef DISABLE_TLS
699 if (tls_in.active.sock >= 0)
700  return !tls_could_getc();
701 #endif
702
703 return !smtp_could_getc();
704 }
705
706 static BOOL
707 check_sync(void)
708 {
709 if (!smtp_enforce_sync || !sender_host_address || f.sender_host_notsocket)
710   return TRUE;
711
712 return wouldblock_reading();
713 }
714
715
716 /******************************************************************************/
717 /* Variants of the smtp_* input handling functions for use in CHUNKING mode */
718
719 /* Forward declarations */
720 static inline void bdat_push_receive_functions(void);
721 static inline void bdat_pop_receive_functions(void);
722
723
724 /* Get a byte from the smtp input, in CHUNKING mode.  Handle ack of the
725 previous BDAT chunk and getting new ones when we run out.  Uses the
726 underlying smtp_getc or tls_getc both for that and for getting the
727 (buffered) data byte.  EOD signals (an expected) no further data.
728 ERR signals a protocol error, and EOF a closed input stream.
729
730 Called from read_bdat_smtp() in receive.c for the message body, but also
731 by the headers read loop in receive_msg(); manipulates chunking_state
732 to handle the BDAT command/response.
733 Placed here due to the correlation with the above smtp_getc(), which it wraps,
734 and also by the need to do smtp command/response handling.
735
736 Arguments:  lim         (ignored)
737 Returns:    the next character or ERR, EOD or EOF
738 */
739
740 int
741 bdat_getc(unsigned lim)
742 {
743 uschar * user_msg = NULL;
744 uschar * log_msg;
745
746 #ifndef DISABLE_DKIM
747 misc_module_info * dkim_info = misc_mod_findonly(US"dkim");
748 typedef void (*dkim_pause_t)(BOOL);
749 dkim_pause_t dkim_pause;
750
751 dkim_pause = dkim_info
752   ? ((dkim_pause_t *) dkim_info->functions)[DKIM_VERIFY_PAUSE] : NULL;
753 #endif
754
755 for(;;)
756   {
757
758   if (chunking_data_left > 0)
759     return lwr_receive_getc(chunking_data_left--);
760
761   bdat_pop_receive_functions();
762 #ifndef DISABLE_DKIM
763   if (dkim_pause) dkim_pause(TRUE);
764 #endif
765
766   /* Unless PIPELINING was offered, there should be no next command
767   until after we ack that chunk */
768
769   if (!f.smtp_in_pipelining_advertised && !check_sync())
770     {
771     unsigned n = smtp_inend - smtp_inptr;
772     if (n > 32) n = 32;
773
774     incomplete_transaction_log(US"sync failure");
775     log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
776       "(next input sent too soon: pipelining was not advertised): "
777       "rejected \"%s\" %s next input=\"%s\"%s",
778       smtp_cmd_buffer, host_and_ident(TRUE),
779       string_printing(string_copyn(smtp_inptr, n)),
780       smtp_inend - smtp_inptr > n ? "..." : "");
781     (void) synprot_error(L_smtp_protocol_error, 554, NULL,
782       US"SMTP synchronization error");
783     goto repeat_until_rset;
784     }
785
786   /* If not the last, ack the received chunk.  The last response is delayed
787   until after the data ACL decides on it */
788
789   if (chunking_state == CHUNKING_LAST)
790     {
791 #ifndef DISABLE_DKIM
792     smtp_verify_feed(NULL, 0);  /* notify EOD */
793 #endif
794     return EOD;
795     }
796
797   smtp_printf("250 %u byte chunk received\r\n", SP_NO_MORE, chunking_datasize);
798   chunking_state = CHUNKING_OFFERED;
799   DEBUG(D_receive) debug_printf("chunking state %d\n", (int)chunking_state);
800
801   /* Expect another BDAT cmd from input. RFC 3030 says nothing about
802   QUIT, RSET or NOOP but handling them seems obvious */
803
804 next_cmd:
805   switch(smtp_read_command(TRUE, 1))
806     {
807     default:
808       (void) synprot_error(L_smtp_protocol_error, 503, NULL,
809         US"only BDAT permissible after non-LAST BDAT");
810
811   repeat_until_rset:
812       switch(smtp_read_command(TRUE, 1))
813         {
814         case QUIT_CMD:  smtp_quit_handler(&user_msg, &log_msg); /*FALLTHROUGH */
815         case EOF_CMD:   return EOF;
816         case RSET_CMD:  smtp_rset_handler(); return ERR;
817         default:        if (synprot_error(L_smtp_protocol_error, 503, NULL,
818                                           US"only RSET accepted now") > 0)
819                           return EOF;
820                         goto repeat_until_rset;
821         }
822
823     case QUIT_CMD:
824       smtp_quit_handler(&user_msg, &log_msg);
825       /*FALLTHROUGH*/
826     case EOF_CMD:
827       return EOF;
828
829     case RSET_CMD:
830       smtp_rset_handler();
831       return ERR;
832
833     case NOOP_CMD:
834       HAD(SCH_NOOP);
835       smtp_printf("250 OK\r\n", SP_NO_MORE);
836       goto next_cmd;
837
838     case BDAT_CMD:
839       {
840       int n;
841
842       if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
843         {
844         (void) synprot_error(L_smtp_protocol_error, 501, NULL,
845           US"missing size for BDAT command");
846         return ERR;
847         }
848       chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
849         ? CHUNKING_LAST : CHUNKING_ACTIVE;
850       chunking_data_left = chunking_datasize;
851       DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
852                                     (int)chunking_state, chunking_data_left);
853
854       if (chunking_datasize == 0)
855         if (chunking_state == CHUNKING_LAST)
856           return EOD;
857         else
858           {
859           (void) synprot_error(L_smtp_protocol_error, 504, NULL,
860             US"zero size for BDAT command");
861           goto repeat_until_rset;
862           }
863
864       bdat_push_receive_functions();
865 #ifndef DISABLE_DKIM
866       if (dkim_pause) dkim_pause(FALSE);
867 #endif
868       break;    /* to top of main loop */
869       }
870     }
871   }
872 }
873
874 BOOL
875 bdat_hasc(void)
876 {
877 if (chunking_data_left > 0)
878   return lwr_receive_hasc();
879 return TRUE;
880 }
881
882 uschar *
883 bdat_getbuf(unsigned * len)
884 {
885 uschar * buf;
886
887 if (chunking_data_left <= 0)
888   { *len = 0; return NULL; }
889
890 if (*len > chunking_data_left) *len = chunking_data_left;
891 buf = lwr_receive_getbuf(len);  /* Either smtp_getbuf or tls_getbuf */
892 chunking_data_left -= *len;
893 return buf;
894 }
895
896 void
897 bdat_flush_data(void)
898 {
899 while (chunking_data_left)
900   {
901   unsigned n = chunking_data_left;
902   if (!bdat_getbuf(&n)) break;
903   }
904
905 bdat_pop_receive_functions();
906 chunking_state = CHUNKING_OFFERED;
907 DEBUG(D_receive) debug_printf("chunking state %d\n", (int)chunking_state);
908 }
909
910
911 static inline void
912 bdat_push_receive_functions(void)
913 {
914 /* push the current receive_* function on the "stack", and
915 replace them by bdat_getc(), which in turn will use the lwr_receive_*
916 functions to do the dirty work. */
917 if (!lwr_receive_getc)
918   {
919   lwr_receive_getc = receive_getc;
920   lwr_receive_getbuf = receive_getbuf;
921   lwr_receive_hasc = receive_hasc;
922   lwr_receive_ungetc = receive_ungetc;
923   }
924 else
925   {
926   DEBUG(D_receive) debug_printf("chunking double-push receive functions\n");
927   }
928
929 receive_getc = bdat_getc;
930 receive_getbuf = bdat_getbuf;
931 receive_hasc = bdat_hasc;
932 receive_ungetc = bdat_ungetc;
933 }
934
935 static inline void
936 bdat_pop_receive_functions(void)
937 {
938 if (!lwr_receive_getc)
939   {
940   DEBUG(D_receive) debug_printf("chunking double-pop receive functions\n");
941   return;
942   }
943 receive_getc = lwr_receive_getc;
944 receive_getbuf = lwr_receive_getbuf;
945 receive_hasc = lwr_receive_hasc;
946 receive_ungetc = lwr_receive_ungetc;
947
948 lwr_receive_getc = NULL;
949 lwr_receive_getbuf = NULL;
950 lwr_receive_hasc = NULL;
951 lwr_receive_ungetc = NULL;
952 }
953
954 int
955 bdat_ungetc(int ch)
956 {
957 chunking_data_left++;
958 bdat_push_receive_functions();  /* we're not done yet, calling push is safe, because it checks the state before pushing anything */
959 return lwr_receive_ungetc(ch);
960 }
961
962
963
964 /******************************************************************************/
965
966 /*************************************************
967 *     Write formatted string to SMTP channel     *
968 *************************************************/
969
970 /* This is a separate function so that we don't have to repeat everything for
971 TLS support or debugging. It is global so that the daemon and the
972 authentication functions can use it. It does not return any error indication,
973 because major problems such as dropped connections won't show up till an output
974 flush for non-TLS connections. The smtp_fflush() function is available for
975 checking that: for convenience, TLS output errors are remembered here so that
976 they are also picked up later by smtp_fflush().
977
978 This function is exposed to the local_scan API; do not change the signature.
979
980 Arguments:
981   format      format string
982   more        further data expected
983   ...         optional arguments
984
985 Returns:      nothing
986 */
987
988 void
989 smtp_printf(const char *format, BOOL more, ...)
990 {
991 va_list ap;
992
993 va_start(ap, more);
994 smtp_vprintf(format, more, ap);
995 va_end(ap);
996 }
997
998 /* This is split off so that verify.c:respond_printf() can, in effect, call
999 smtp_printf(), bearing in mind that in C a vararg function can't directly
1000 call another vararg function, only a function which accepts a va_list.
1001
1002 This function is exposed to the local_scan API; do not change the signature.
1003 */
1004 /*XXX consider passing caller-info in, for string_vformat-onward */
1005
1006 void
1007 smtp_vprintf(const char *format, BOOL more, va_list ap)
1008 {
1009 gstring gs = { .size = big_buffer_size, .ptr = 0, .s = big_buffer };
1010 BOOL yield;
1011
1012 /* Use taint-unchecked routines for writing into big_buffer, trusting
1013 that we'll never expand it. */
1014
1015 yield = !! string_vformat(&gs, SVFMT_TAINT_NOCHK, format, ap);
1016 string_from_gstring(&gs);
1017
1018 DEBUG(D_receive) for (const uschar * t, * s = gs.s;
1019                       s && (t = Ustrchr(s, '\r'));
1020                       s = t + 2)                                /* \r\n */
1021     debug_printf("%s %.*s\n",
1022                   s == gs.s ? "SMTP>>" : "      ",
1023                   (int)(t - s), s);
1024
1025 if (!yield)
1026   {
1027   log_write(0, LOG_MAIN|LOG_PANIC, "string too large in smtp_printf()");
1028   smtp_closedown(US"Unexpected error");
1029   exim_exit(EXIT_FAILURE);
1030   }
1031
1032 /* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
1033 have had the same. Note: this code is also present in smtp_respond(). It would
1034 be tidier to have it only in one place, but when it was added, it was easier to
1035 do it that way, so as not to have to mess with the code for the RCPT command,
1036 which sometimes uses smtp_printf() and sometimes smtp_respond(). */
1037
1038 if (fl.rcpt_in_progress)
1039   {
1040   if (!rcpt_smtp_response)
1041     rcpt_smtp_response = string_copy(big_buffer);
1042   else if (fl.rcpt_smtp_response_same &&
1043            Ustrcmp(rcpt_smtp_response, big_buffer) != 0)
1044     fl.rcpt_smtp_response_same = FALSE;
1045   fl.rcpt_in_progress = FALSE;
1046   }
1047
1048 /* Now write the string */
1049
1050 if (
1051 #ifndef DISABLE_TLS
1052     tls_in.active.sock >= 0 ? (tls_write(NULL, gs.s, gs.ptr, more) < 0) :
1053 #endif
1054     (fwrite(gs.s, gs.ptr, 1, smtp_out) == 0)
1055    )
1056     smtp_write_error = -1;
1057 }
1058
1059
1060
1061 /*************************************************
1062 *        Flush SMTP out and check for error      *
1063 *************************************************/
1064
1065 /* This function isn't currently used within Exim (it detects errors when it
1066 tries to read the next SMTP input), but is available for use in local_scan().
1067 It flushes the output and checks for errors.
1068
1069 Arguments:  none
1070 Returns:    0 for no error; -1 after an error
1071 */
1072
1073 int
1074 smtp_fflush(void)
1075 {
1076 if (tls_in.active.sock < 0 && fflush(smtp_out) != 0) smtp_write_error = -1;
1077
1078 if (
1079 #ifndef DISABLE_TLS
1080     tls_in.active.sock >= 0 ? (tls_write(NULL, NULL, 0, FALSE) < 0) :
1081 #endif
1082     (fflush(smtp_out) != 0)
1083    )
1084     smtp_write_error = -1;
1085
1086 return smtp_write_error;
1087 }
1088
1089
1090
1091 /* If there's input waiting (and we're doing pipelineing) then we can pipeline
1092 a reponse with the one following. */
1093
1094 static BOOL
1095 pipeline_response(void)
1096 {
1097 if (  !smtp_enforce_sync || !sender_host_address
1098    || f.sender_host_notsocket || !f.smtp_in_pipelining_advertised)
1099   return FALSE;
1100
1101 if (wouldblock_reading()) return FALSE;
1102 f.smtp_in_pipelining_used = TRUE;
1103 return TRUE;
1104 }
1105
1106
1107 #ifndef DISABLE_PIPE_CONNECT
1108 static BOOL
1109 pipeline_connect_sends(void)
1110 {
1111 if (!sender_host_address || f.sender_host_notsocket || !fl.pipe_connect_acceptable)
1112   return FALSE;
1113
1114 if (wouldblock_reading()) return FALSE;
1115 f.smtp_in_early_pipe_used = TRUE;
1116 return TRUE;
1117 }
1118 #endif
1119
1120 /*************************************************
1121 *          SMTP command read timeout             *
1122 *************************************************/
1123
1124 /* Signal handler for timing out incoming SMTP commands. This attempts to
1125 finish off tidily.
1126
1127 Argument: signal number (SIGALRM)
1128 Returns:  nothing
1129 */
1130
1131 static void
1132 command_timeout_handler(int sig)
1133 {
1134 had_command_timeout = sig;
1135 }
1136
1137
1138
1139 /*************************************************
1140 *               SIGTERM received                 *
1141 *************************************************/
1142
1143 /* Signal handler for handling SIGTERM. Again, try to finish tidily.
1144
1145 Argument: signal number (SIGTERM)
1146 Returns:  nothing
1147 */
1148
1149 static void
1150 command_sigterm_handler(int sig)
1151 {
1152 had_command_sigterm = sig;
1153 }
1154
1155
1156
1157
1158 /*************************************************
1159 *           Read one command line                *
1160 *************************************************/
1161
1162 /* Strictly, SMTP commands coming over the net are supposed to end with CRLF.
1163 There are sites that don't do this, and in any case internal SMTP probably
1164 should check only for LF. Consequently, we check here for LF only. The line
1165 ends up with [CR]LF removed from its end. If we get an overlong line, treat as
1166 an unknown command. The command is read into the global smtp_cmd_buffer so that
1167 it is available via $smtp_command.
1168
1169 The character reading routine sets up a timeout for each block actually read
1170 from the input (which may contain more than one command). We set up a special
1171 signal handler that closes down the session on a timeout. Control does not
1172 return when it runs.
1173
1174 Arguments:
1175   check_sync    if TRUE, check synchronization rules if global option is TRUE
1176   buffer_lim    maximum to buffer in lower layer
1177
1178 Returns:       a code identifying the command (enumerated above)
1179 */
1180
1181 static int
1182 smtp_read_command(BOOL check_sync, unsigned buffer_lim)
1183 {
1184 int c;
1185 int ptr = 0;
1186 BOOL hadnull = FALSE;
1187
1188 had_command_timeout = 0;
1189 os_non_restarting_signal(SIGALRM, command_timeout_handler);
1190
1191 while ((c = (receive_getc)(buffer_lim)) != '\n' && c != EOF)
1192   {
1193   if (ptr >= SMTP_CMD_BUFFER_SIZE)
1194     {
1195     os_non_restarting_signal(SIGALRM, sigalrm_handler);
1196     return OTHER_CMD;
1197     }
1198   if (c == 0)
1199     {
1200     hadnull = TRUE;
1201     c = '?';
1202     }
1203   smtp_cmd_buffer[ptr++] = c;
1204   }
1205
1206 receive_linecount++;    /* For BSMTP errors */
1207 os_non_restarting_signal(SIGALRM, sigalrm_handler);
1208
1209 /* If hit end of file, return pseudo EOF command. Whether we have a
1210 part-line already read doesn't matter, since this is an error state. */
1211
1212 if (c == EOF) return EOF_CMD;
1213
1214 /* Remove any CR and white space at the end of the line, and terminate the
1215 string. */
1216
1217 while (ptr > 0 && isspace(smtp_cmd_buffer[ptr-1])) ptr--;
1218 smtp_cmd_buffer[ptr] = 0;
1219
1220 DEBUG(D_receive) debug_printf("SMTP<< %s\n", smtp_cmd_buffer);
1221
1222 /* NULLs are not allowed in SMTP commands */
1223
1224 if (hadnull) return BADCHAR_CMD;
1225
1226 /* Scan command list and return identity, having set the data pointer
1227 to the start of the actual data characters. Check for SMTP synchronization
1228 if required. */
1229
1230 for (smtp_cmd_list * p = cmd_list; p < cmd_list + nelem(cmd_list); p++)
1231   {
1232 #ifdef SUPPORT_PROXY
1233   /* Only allow QUIT command if Proxy Protocol parsing failed */
1234   if (proxy_session && f.proxy_session_failed && p->cmd != QUIT_CMD)
1235     continue;
1236 #endif
1237   if (  p->len
1238      && strncmpic(smtp_cmd_buffer, US p->name, p->len) == 0
1239      && (  smtp_cmd_buffer[p->len-1] == ':'    /* "mail from:" or "rcpt to:" */
1240         || smtp_cmd_buffer[p->len] == 0
1241         || smtp_cmd_buffer[p->len] == ' '
1242      )  )
1243     {
1244     if (   smtp_inptr < smtp_inend              /* Outstanding input */
1245        &&  p->cmd < sync_cmd_limit              /* Command should sync */
1246        &&  check_sync                           /* Local flag set */
1247        &&  smtp_enforce_sync                    /* Global flag set */
1248        &&  sender_host_address != NULL          /* Not local input */
1249        &&  !f.sender_host_notsocket             /* Really is a socket */
1250        )
1251       return BADSYN_CMD;
1252
1253     /* The variables $smtp_command and $smtp_command_argument point into the
1254     unmodified input buffer. A copy of the latter is taken for actual
1255     processing, so that it can be chopped up into separate parts if necessary,
1256     for example, when processing a MAIL command options such as SIZE that can
1257     follow the sender address. */
1258
1259     smtp_cmd_argument = smtp_cmd_buffer + p->len;
1260     Uskip_whitespace(&smtp_cmd_argument);
1261     Ustrcpy(smtp_data_buffer, smtp_cmd_argument);
1262     smtp_cmd_data = smtp_data_buffer;
1263
1264     /* Count non-mail commands from those hosts that are controlled in this
1265     way. The default is all hosts. We don't waste effort checking the list
1266     until we get a non-mail command, but then cache the result to save checking
1267     again. If there's a DEFER while checking the host, assume it's in the list.
1268
1269     Note that one instance of RSET, EHLO/HELO, and STARTTLS is allowed at the
1270     start of each incoming message by fiddling with the value in the table. */
1271
1272     if (!p->is_mail_cmd)
1273       {
1274       if (count_nonmail == TRUE_UNSET) count_nonmail =
1275         verify_check_host(&smtp_accept_max_nonmail_hosts) != FAIL;
1276       if (count_nonmail && ++nonmail_command_count > smtp_accept_max_nonmail)
1277         return TOO_MANY_NONMAIL_CMD;
1278       }
1279
1280     /* If there is data for a command that does not expect it, generate the
1281     error here. */
1282
1283     return (p->has_arg || *smtp_cmd_data == 0)? p->cmd : BADARG_CMD;
1284     }
1285   }
1286
1287 #ifdef SUPPORT_PROXY
1288 /* Only allow QUIT command if Proxy Protocol parsing failed */
1289 if (proxy_session && f.proxy_session_failed)
1290   return PROXY_FAIL_IGNORE_CMD;
1291 #endif
1292
1293 /* Enforce synchronization for unknown commands */
1294
1295 if (  smtp_inptr < smtp_inend           /* Outstanding input */
1296    && check_sync                        /* Local flag set */
1297    && smtp_enforce_sync                 /* Global flag set */
1298    && sender_host_address               /* Not local input */
1299    && !f.sender_host_notsocket          /* Really is a socket */
1300    )
1301   return BADSYN_CMD;
1302
1303 return OTHER_CMD;
1304 }
1305
1306
1307
1308
1309 /*************************************************
1310 *          Forced closedown of call              *
1311 *************************************************/
1312
1313 /* This function is called from log.c when Exim is dying because of a serious
1314 disaster, and also from some other places. If an incoming non-batched SMTP
1315 channel is open, it swallows the rest of the incoming message if in the DATA
1316 phase, sends the reply string, and gives an error to all subsequent commands
1317 except QUIT. The existence of an SMTP call is detected by the non-NULLness of
1318 smtp_in.
1319
1320 Arguments:
1321   message   SMTP reply string to send, excluding the code
1322
1323 Returns:    nothing
1324 */
1325
1326 void
1327 smtp_closedown(uschar * message)
1328 {
1329 if (!smtp_in || smtp_batched_input) return;
1330 receive_swallow_smtp();
1331 smtp_printf("421 %s\r\n", SP_NO_MORE, message);
1332
1333 for (;;) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
1334   {
1335   case EOF_CMD:
1336     return;
1337
1338   case QUIT_CMD:
1339     f.smtp_in_quit = TRUE;
1340     smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
1341     mac_smtp_fflush();
1342     return;
1343
1344   case RSET_CMD:
1345     smtp_printf("250 Reset OK\r\n", SP_NO_MORE);
1346     break;
1347
1348   default:
1349     smtp_printf("421 %s\r\n", SP_NO_MORE, message);
1350     break;
1351   }
1352 }
1353
1354
1355
1356
1357 /*************************************************
1358 *        Set up connection info for logging      *
1359 *************************************************/
1360
1361 /* This function is called when logging information about an SMTP connection.
1362 It sets up appropriate source information, depending on the type of connection.
1363 If sender_fullhost is NULL, we are at a very early stage of the connection;
1364 just use the IP address.
1365
1366 Argument:    none
1367 Returns:     a string describing the connection
1368 */
1369
1370 uschar *
1371 smtp_get_connection_info(void)
1372 {
1373 const uschar * hostname = sender_fullhost
1374   ? sender_fullhost : sender_host_address;
1375 gstring * g = string_catn(NULL, US"SMTP connection", 15);
1376
1377 if (LOGGING(connection_id))
1378   g = string_fmt_append(g, " Ci=%s", connection_id);
1379 g = string_catn(g, US" from ", 6);
1380
1381 if (host_checking)
1382   g = string_cat(g, hostname);
1383
1384 else if (f.sender_host_unknown || f.sender_host_notsocket)
1385   g = string_cat(g, sender_ident ? sender_ident : US"NULL");
1386
1387 else if (atrn_mode)
1388   g = string_append(g, 2, hostname, US" (ODMR customer)");
1389
1390 else if (f.is_inetd)
1391   g = string_append(g, 2, hostname, US" (via inetd)");
1392
1393 else if (LOGGING(incoming_interface) && interface_address)
1394   g = string_fmt_append(g, "%s I=[%s]:%d", hostname, interface_address, interface_port);
1395
1396 else
1397   g = string_cat(g, hostname);
1398
1399 gstring_release_unused(g);
1400 return string_from_gstring(g);
1401 }
1402
1403
1404
1405 #ifndef DISABLE_TLS
1406 /* Append TLS-related information to a log line
1407
1408 Arguments:
1409   g             String under construction: allocated string to extend, or NULL
1410
1411 Returns:        Allocated string or NULL
1412 */
1413 static gstring *
1414 s_tlslog(gstring * g)
1415 {
1416 if (LOGGING(tls_cipher) && tls_in.cipher)
1417   {
1418   g = string_append(g, 2, US" X=", tls_in.cipher);
1419 #ifndef DISABLE_TLS_RESUME
1420   if (LOGGING(tls_resumption) && tls_in.resumption & RESUME_USED)
1421     g = string_catn(g, US"*", 1);
1422 #endif
1423   }
1424 if (LOGGING(tls_certificate_verified) && tls_in.cipher)
1425   g = string_append(g, 2, US" CV=", tls_in.certificate_verified? "yes":"no");
1426 if (LOGGING(tls_peerdn) && tls_in.peerdn)
1427   g = string_append(g, 3, US" DN=\"", string_printing(tls_in.peerdn), US"\"");
1428 if (LOGGING(tls_sni) && tls_in.sni)
1429   g = string_append(g, 2, US" SNI=", string_printing2(tls_in.sni, SP_TAB|SP_SPACE));
1430 return g;
1431 }
1432 #endif
1433
1434
1435
1436 static gstring *
1437 s_connhad_log(gstring * g)
1438 {
1439 const uschar * sep = smtp_connection_had[SMTP_HBUFF_SIZE-1] != SCH_NONE
1440   ? US" C=..." : US" C=";
1441
1442 for (int i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
1443   if (smtp_connection_had[i] != SCH_NONE)
1444     {
1445     g = string_append(g, 2, sep, smtp_names[smtp_connection_had[i]]);
1446     sep = US",";
1447     }
1448 for (int i = 0; i < smtp_ch_index; i++, sep = US",")
1449   g = string_append(g, 2, sep, smtp_names[smtp_connection_had[i]]);
1450 return g;
1451 }
1452
1453
1454 /*************************************************
1455 *      Log lack of MAIL if so configured         *
1456 *************************************************/
1457
1458 /* This function is called when an SMTP session ends. If the log selector
1459 smtp_no_mail is set, write a log line giving some details of what has happened
1460 in the SMTP session.
1461
1462 Arguments:   none
1463 Returns:     nothing
1464 */
1465
1466 void
1467 smtp_log_no_mail(void)
1468 {
1469 uschar * s;
1470 gstring * g = NULL;
1471
1472 if (smtp_mailcmd_count > 0 || !LOGGING(smtp_no_mail))
1473   return;
1474
1475 if (sender_host_authenticated)
1476   {
1477   g = string_append(g, 2, US" A=", sender_host_authenticated);
1478   if (authenticated_id) g = string_append(g, 2, US":", authenticated_id);
1479   }
1480
1481 #ifndef DISABLE_TLS
1482 g = s_tlslog(g);
1483 #endif
1484
1485 g = s_connhad_log(g);
1486
1487 if (!(s = string_from_gstring(g))) s = US"";
1488
1489 log_write(0, LOG_MAIN, "no MAIL in %sSMTP connection from %s D=%s%s",
1490   f.tcp_in_fastopen ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO " : US"",
1491   host_and_ident(FALSE), string_timesince(&smtp_connection_start), s);
1492 }
1493
1494
1495 /* Return list of recent smtp commands */
1496
1497 uschar *
1498 smtp_cmd_hist(void)
1499 {
1500 gstring * list = NULL;
1501 uschar * s;
1502
1503 for (int i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
1504   if (smtp_connection_had[i] != SCH_NONE)
1505     list = string_append_listele(list, ',', smtp_names[smtp_connection_had[i]]);
1506
1507 for (int i = 0; i < smtp_ch_index; i++)
1508   list = string_append_listele(list, ',', smtp_names[smtp_connection_had[i]]);
1509
1510 s = string_from_gstring(list);
1511 return s ? s : US"";
1512 }
1513
1514
1515
1516
1517 /*************************************************
1518 *   Check HELO line and set sender_helo_name     *
1519 *************************************************/
1520
1521 /* Check the format of a HELO line. The data for HELO/EHLO is supposed to be
1522 the domain name of the sending host, or an ip literal in square brackets. The
1523 argument is placed in sender_helo_name, which is in malloc store, because it
1524 must persist over multiple incoming messages. If helo_accept_junk is set, this
1525 host is permitted to send any old junk (needed for some broken hosts).
1526 Otherwise, helo_allow_chars can be used for rogue characters in general
1527 (typically people want to let in underscores).
1528
1529 Argument:
1530   s       the data portion of the line (already past any white space)
1531
1532 Returns:  TRUE or FALSE
1533 */
1534
1535 static BOOL
1536 check_helo(uschar *s)
1537 {
1538 uschar *start = s;
1539 uschar *end = s + Ustrlen(s);
1540 BOOL yield = fl.helo_accept_junk;
1541
1542 /* Discard any previous helo name */
1543
1544 sender_helo_name = NULL;
1545
1546 /* Skip tests if junk is permitted. */
1547
1548 if (!yield)
1549
1550   /* Allow the new standard form for IPv6 address literals, namely,
1551   [IPv6:....], and because someone is bound to use it, allow an equivalent
1552   IPv4 form. Allow plain addresses as well. */
1553
1554   if (*s == '[')
1555     {
1556     if (end[-1] == ']')
1557       {
1558       end[-1] = 0;
1559       if (strncmpic(s, US"[IPv6:", 6) == 0)
1560         yield = (string_is_ip_address(s+6, NULL) == 6);
1561       else if (strncmpic(s, US"[IPv4:", 6) == 0)
1562         yield = (string_is_ip_address(s+6, NULL) == 4);
1563       else
1564         yield = (string_is_ip_address(s+1, NULL) != 0);
1565       end[-1] = ']';
1566       }
1567     }
1568
1569   /* Non-literals must be alpha, dot, hyphen, plus any non-valid chars
1570   that have been configured (usually underscore - sigh). */
1571
1572   else if (*s)
1573     for (yield = TRUE; *s; s++)
1574       if (!isalnum(*s) && *s != '.' && *s != '-' &&
1575           Ustrchr(helo_allow_chars, *s) == NULL)
1576         {
1577         yield = FALSE;
1578         break;
1579         }
1580
1581 /* Save argument if OK */
1582
1583 if (yield) sender_helo_name = string_copy_perm(start, TRUE);
1584 return yield;
1585 }
1586
1587
1588
1589
1590
1591 /*************************************************
1592 *         Extract SMTP command option            *
1593 *************************************************/
1594
1595 /* This function picks the next option setting off the end of smtp_cmd_data. It
1596 is called for MAIL FROM and RCPT TO commands, to pick off the optional ESMTP
1597 things that can appear there.
1598
1599 Arguments:
1600    name           point this at the name
1601    value          point this at the data string
1602
1603 Returns:          TRUE if found an option
1604 */
1605
1606 static BOOL
1607 extract_option(uschar **name, uschar **value)
1608 {
1609 uschar *n;
1610 uschar *v;
1611 if (Ustrlen(smtp_cmd_data) <= 0) return FALSE;
1612 v = smtp_cmd_data + Ustrlen(smtp_cmd_data) - 1;
1613 while (v > smtp_cmd_data && isspace(*v)) v--;
1614 v[1] = 0;
1615
1616 while (v > smtp_cmd_data && *v != '=' && !isspace(*v))
1617   {
1618   /* Take care to not stop at a space embedded in a quoted local-part */
1619   if (*v == '"')
1620     {
1621     do v--; while (v > smtp_cmd_data && *v != '"');
1622     if (v <= smtp_cmd_data) return FALSE;
1623     }
1624   v--;
1625   }
1626 if (v <= smtp_cmd_data) return FALSE;
1627
1628 n = v;
1629 if (*v == '=')
1630   {
1631   while (n > smtp_cmd_data && isalpha(n[-1])) n--;
1632   /* RFC says SP, but TAB seen in wild and other major MTAs accept it */
1633   if (n <= smtp_cmd_data || !isspace(n[-1])) return FALSE;
1634   n[-1] = 0;
1635   }
1636 else
1637   {
1638   n++;
1639   }
1640 *v++ = 0;
1641 *name = n;
1642 *value = v;
1643 return TRUE;
1644 }
1645
1646
1647
1648
1649
1650 /*************************************************
1651 *         Reset for new message                  *
1652 *************************************************/
1653
1654 /* This function is called whenever the SMTP session is reset from
1655 within either of the setup functions; also from the daemon loop.
1656
1657 Argument:   the stacking pool storage reset point
1658 Returns:    nothing
1659 */
1660
1661 void *
1662 smtp_reset(void *reset_point)
1663 {
1664 recipients_list = NULL;
1665 rcpt_count = rcpt_defer_count = rcpt_fail_count =
1666   raw_recipients_count = recipients_count = recipients_list_max = 0;
1667 message_linecount = 0;
1668 message_size = -1;
1669 message_body = message_body_end = NULL;
1670 acl_added_headers = NULL;
1671 acl_removed_headers = NULL;
1672 f.queue_only_policy = FALSE;
1673 rcpt_smtp_response = NULL;
1674 fl.rcpt_smtp_response_same = TRUE;
1675 fl.rcpt_in_progress = FALSE;
1676 f.deliver_freeze = FALSE;                               /* Can be set by ACL */
1677 freeze_tell = freeze_tell_config;                       /* Can be set by ACL */
1678 fake_response = OK;                                     /* Can be set by ACL */
1679 #ifdef WITH_CONTENT_SCAN
1680 f.no_mbox_unspool = FALSE;                              /* Can be set by ACL */
1681 #endif
1682 f.submission_mode = FALSE;                              /* Can be set by ACL */
1683 f.suppress_local_fixups = f.suppress_local_fixups_default; /* Can be set by ACL */
1684 f.active_local_from_check = local_from_check;           /* Can be set by ACL */
1685 f.active_local_sender_retain = local_sender_retain;     /* Can be set by ACL */
1686 sending_ip_address = NULL;
1687 return_path = sender_address = NULL;
1688 deliver_localpart_data = deliver_domain_data =
1689 recipient_data = sender_data = NULL;                    /* Can be set by ACL */
1690 recipient_verify_failure = NULL;
1691 deliver_localpart_parent = deliver_localpart_orig = NULL;
1692 deliver_domain_parent = deliver_domain_orig = NULL;
1693 callout_address = NULL;
1694 submission_name = NULL;                                 /* Can be set by ACL */
1695 raw_sender = NULL;                  /* After SMTP rewrite, before qualifying */
1696 sender_address_unrewritten = NULL;  /* Set only after verify rewrite */
1697 sender_verified_list = NULL;        /* No senders verified */
1698 memset(sender_address_cache, 0, sizeof(sender_address_cache));
1699 memset(sender_domain_cache, 0, sizeof(sender_domain_cache));
1700
1701 authenticated_sender = NULL;
1702 #ifdef EXPERIMENTAL_BRIGHTMAIL
1703 bmi_run = 0;
1704 bmi_verdicts = NULL;
1705 #endif
1706 dnslist_domain = dnslist_matched = NULL;
1707
1708 dsn_ret = 0;
1709 dsn_envid = NULL;
1710 deliver_host = deliver_host_address = NULL;     /* Can be set by ACL */
1711 #ifndef DISABLE_PRDR
1712 prdr_requested = FALSE;
1713 #endif
1714 #ifdef SUPPORT_I18N
1715 message_smtputf8 = FALSE;
1716 #endif
1717 #ifdef WITH_CONTENT_SCAN
1718 regex_vars_clear();
1719 #endif
1720 body_linecount = body_zerocount = 0;
1721
1722 lookup_value = NULL;                            /* Can be set by ACL */
1723 sender_rate = sender_rate_limit = sender_rate_period = NULL;
1724 ratelimiters_mail = NULL;           /* Updated by ratelimit ACL condition */
1725                    /* Note that ratelimiters_conn persists across resets. */
1726
1727 /* Reset message ACL variables */
1728
1729 acl_var_m = NULL;
1730
1731 /* Warning log messages are saved in malloc store. They are saved to avoid
1732 repetition in the same message, but it seems right to repeat them for different
1733 messages. */
1734
1735 while (acl_warn_logged)
1736   {
1737   string_item *this = acl_warn_logged;
1738   acl_warn_logged = acl_warn_logged->next;
1739   store_free(this);
1740   }
1741
1742 misc_mod_smtp_reset();
1743 message_tidyup();
1744 store_reset(reset_point);
1745
1746 message_start();
1747 return store_mark();
1748 }
1749
1750
1751
1752
1753
1754 /*************************************************
1755 *  Initialize for incoming batched SMTP message  *
1756 *************************************************/
1757
1758 /* This function is called from smtp_setup_msg() in the case when
1759 smtp_batched_input is true. This happens when -bS is used to pass a whole batch
1760 of messages in one file with SMTP commands between them. All errors must be
1761 reported by sending a message, and only MAIL FROM, RCPT TO, and DATA are
1762 relevant. After an error on a sender, or an invalid recipient, the remainder
1763 of the message is skipped. The value of received_protocol is already set.
1764
1765 Argument: none
1766 Returns:  > 0 message successfully started (reached DATA)
1767           = 0 QUIT read or end of file reached
1768           < 0 should not occur
1769 */
1770
1771 static int
1772 smtp_setup_batch_msg(void)
1773 {
1774 int done = 0;
1775 rmark reset_point = store_mark();
1776
1777 /* Save the line count at the start of each transaction - single commands
1778 like HELO and RSET count as whole transactions. */
1779
1780 bsmtp_transaction_linecount = receive_linecount;
1781
1782 if ((receive_feof)()) return 0;   /* Treat EOF as QUIT */
1783
1784 cancel_cutthrough_connection(TRUE, US"smtp_setup_batch_msg");
1785 reset_point = smtp_reset(reset_point);                /* Reset for start of message */
1786
1787 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
1788 value. The values are 2 larger than the required yield of the function. */
1789
1790 while (done <= 0)
1791   {
1792   uschar *errmess;
1793   uschar *recipient = NULL;
1794   int start, end, sender_domain, recipient_domain;
1795
1796   switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
1797     {
1798     /* The HELO/EHLO commands set sender_address_helo if they have
1799     valid data; otherwise they are ignored, except that they do
1800     a reset of the state. */
1801
1802     case HELO_CMD:
1803     case EHLO_CMD:
1804
1805       check_helo(smtp_cmd_data);
1806       /* Fall through */
1807
1808     case RSET_CMD:
1809       cancel_cutthrough_connection(TRUE, US"RSET received");
1810       reset_point = smtp_reset(reset_point);
1811       bsmtp_transaction_linecount = receive_linecount;
1812       break;
1813
1814     /* The MAIL FROM command requires an address as an operand. All we
1815     do here is to parse it for syntactic correctness. The form "<>" is
1816     a special case which converts into an empty string. The start/end
1817     pointers in the original are not used further for this address, as
1818     it is the canonical extracted address which is all that is kept. */
1819
1820     case MAIL_CMD:
1821       smtp_mailcmd_count++;              /* Count for no-mail log */
1822       if (sender_address)
1823         /* The function moan_smtp_batch() does not return. */
1824         moan_smtp_batch(smtp_cmd_buffer, "503 Sender already given");
1825
1826       if (smtp_cmd_data[0] == 0)
1827         /* The function moan_smtp_batch() does not return. */
1828         moan_smtp_batch(smtp_cmd_buffer, "501 MAIL FROM must have an address operand");
1829
1830       /* Reset to start of message */
1831
1832       cancel_cutthrough_connection(TRUE, US"MAIL received");
1833       reset_point = smtp_reset(reset_point);
1834
1835       /* Apply SMTP rewrite */
1836
1837       raw_sender = rewrite_existflags & rewrite_smtp
1838         /* deconst ok as smtp_cmd_data was not const */
1839         ? US rewrite_one(smtp_cmd_data, rewrite_smtp|rewrite_smtp_sender, NULL,
1840                       FALSE, US"", global_rewrite_rules)
1841         : smtp_cmd_data;
1842
1843       /* Extract the address; the TRUE flag allows <> as valid */
1844
1845       raw_sender =
1846         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
1847           TRUE);
1848
1849       if (!raw_sender)
1850         /* The function moan_smtp_batch() does not return. */
1851         moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
1852
1853       sender_address = string_copy(raw_sender);
1854
1855       /* Qualify unqualified sender addresses if permitted to do so. */
1856
1857       if (  !sender_domain
1858          && sender_address[0] != 0 && sender_address[0] != '@')
1859         if (f.allow_unqualified_sender)
1860           {
1861           /* deconst ok as sender_address was not const */
1862           sender_address = US rewrite_address_qualify(sender_address, FALSE);
1863           DEBUG(D_receive) debug_printf("unqualified address %s accepted "
1864             "and rewritten\n", raw_sender);
1865           }
1866         /* The function moan_smtp_batch() does not return. */
1867         else
1868           moan_smtp_batch(smtp_cmd_buffer, "501 sender address must contain "
1869             "a domain");
1870       break;
1871
1872
1873     /* The RCPT TO command requires an address as an operand. All we do
1874     here is to parse it for syntactic correctness. There may be any number
1875     of RCPT TO commands, specifying multiple senders. We build them all into
1876     a data structure that is in argc/argv format. The start/end values
1877     given by parse_extract_address are not used, as we keep only the
1878     extracted address. */
1879
1880     case RCPT_CMD:
1881       if (!sender_address)
1882         /* The function moan_smtp_batch() does not return. */
1883         moan_smtp_batch(smtp_cmd_buffer, "503 No sender yet given");
1884
1885       if (smtp_cmd_data[0] == 0)
1886         /* The function moan_smtp_batch() does not return. */
1887         moan_smtp_batch(smtp_cmd_buffer,
1888           "501 RCPT TO must have an address operand");
1889
1890       /* Check maximum number allowed */
1891
1892       if (  recipients_max_expanded > 0
1893          && recipients_count + 1 > recipients_max_expanded)
1894         /* The function moan_smtp_batch() does not return. */
1895         moan_smtp_batch(smtp_cmd_buffer, "%s too many recipients",
1896           recipients_max_reject ? "552": "452");
1897
1898       /* Apply SMTP rewrite, then extract address. Don't allow "<>" as a
1899       recipient address */
1900
1901       recipient = rewrite_existflags & rewrite_smtp
1902         /* deconst ok as smtp_cmd_data was not const */
1903         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
1904                       global_rewrite_rules)
1905         : smtp_cmd_data;
1906
1907       recipient = parse_extract_address(recipient, &errmess, &start, &end,
1908         &recipient_domain, FALSE);
1909
1910       if (!recipient)
1911         /* The function moan_smtp_batch() does not return. */
1912         moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
1913
1914       /* If the recipient address is unqualified, qualify it if permitted. Then
1915       add it to the list of recipients. */
1916
1917       if (!recipient_domain)
1918         if (f.allow_unqualified_recipient)
1919           {
1920           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
1921             recipient);
1922           /* deconst ok as recipient was not const */
1923           recipient = US rewrite_address_qualify(recipient, TRUE);
1924           }
1925         /* The function moan_smtp_batch() does not return. */
1926         else
1927           moan_smtp_batch(smtp_cmd_buffer,
1928             "501 recipient address must contain a domain");
1929
1930       receive_add_recipient(recipient, -1);
1931       break;
1932
1933
1934     /* The DATA command is legal only if it follows successful MAIL FROM
1935     and RCPT TO commands. This function is complete when a valid DATA
1936     command is encountered. */
1937
1938     case DATA_CMD:
1939       if (!sender_address || recipients_count <= 0)
1940         /* The function moan_smtp_batch() does not return. */
1941         if (!sender_address)
1942           moan_smtp_batch(smtp_cmd_buffer,
1943             "503 MAIL FROM:<sender> command must precede DATA");
1944         else
1945           moan_smtp_batch(smtp_cmd_buffer,
1946             "503 RCPT TO:<recipient> must precede DATA");
1947       else
1948         {
1949         done = 3;                      /* DATA successfully achieved */
1950         message_ended = END_NOTENDED;  /* Indicate in middle of message */
1951         }
1952       break;
1953
1954
1955     /* The VRFY, EXPN, HELP, ETRN, ATRN and NOOP commands are ignored. */
1956
1957     case VRFY_CMD: case EXPN_CMD: case HELP_CMD: case NOOP_CMD:
1958     case ETRN_CMD: case ATRN_CMD:
1959 #ifndef DISABLE_WELLKNOWN
1960     case WELLKNOWN_CMD:
1961 #endif
1962       bsmtp_transaction_linecount = receive_linecount;
1963       break;
1964
1965
1966     case QUIT_CMD:
1967       f.smtp_in_quit = TRUE;
1968     case EOF_CMD:
1969       done = 2;
1970       break;
1971
1972
1973     case BADARG_CMD:
1974       /* The function moan_smtp_batch() does not return. */
1975       moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected argument data");
1976       break;
1977
1978
1979     case BADCHAR_CMD:
1980       /* The function moan_smtp_batch() does not return. */
1981       moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected NULL in SMTP command");
1982       break;
1983
1984
1985     default:
1986       /* The function moan_smtp_batch() does not return. */
1987       moan_smtp_batch(smtp_cmd_buffer, "500 Command unrecognized");
1988       break;
1989     }
1990   }
1991
1992 return done - 2;  /* Convert yield values */
1993 }
1994
1995
1996
1997
1998 #ifndef DISABLE_TLS
1999 static BOOL
2000 smtp_log_tls_fail(const uschar * errstr)
2001 {
2002 const uschar * conn_info = smtp_get_connection_info();
2003
2004 if (Ustrncmp(conn_info, US"SMTP ", 5) == 0) conn_info += 5;
2005 /* I'd like to get separated H= here, but too hard for now */
2006
2007 log_write(0, LOG_MAIN, "TLS error on %s %s", conn_info, errstr);
2008 return FALSE;
2009 }
2010 #endif
2011
2012
2013
2014
2015 #ifdef TCP_FASTOPEN
2016 static void
2017 tfo_in_check(void)
2018 {
2019 # ifdef __FreeBSD__
2020 int is_fastopen;
2021 socklen_t len = sizeof(is_fastopen);
2022
2023 /* The tinfo TCPOPT_FAST_OPEN bit seems unreliable, and we don't see state
2024 TCP_SYN_RCV (as of 12.1) so no idea about data-use. */
2025
2026 if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_FASTOPEN, &is_fastopen, &len) == 0)
2027   {
2028   if (is_fastopen)
2029     {
2030     DEBUG(D_receive)
2031       debug_printf("TFO mode connection (TCP_FASTOPEN getsockopt)\n");
2032     f.tcp_in_fastopen = TRUE;
2033     }
2034   }
2035 else DEBUG(D_receive)
2036   debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2037
2038 # elif defined(TCP_INFO)
2039 struct tcp_info tinfo;
2040 socklen_t len = sizeof(tinfo);
2041
2042 if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
2043 #  ifdef TCPI_OPT_SYN_DATA      /* FreeBSD 11,12 do not seem to have this yet */
2044   if (tinfo.tcpi_options & TCPI_OPT_SYN_DATA)
2045     {
2046     DEBUG(D_receive)
2047       debug_printf("TFO mode connection (ACKd data-on-SYN)\n");
2048     f.tcp_in_fastopen_data = f.tcp_in_fastopen = TRUE;
2049     }
2050   else
2051 #  endif
2052     if (tinfo.tcpi_state == TCP_SYN_RECV)       /* Not seen on FreeBSD 12.1 */
2053     {
2054     DEBUG(D_receive)
2055       debug_printf("TFO mode connection (state TCP_SYN_RECV)\n");
2056     f.tcp_in_fastopen = TRUE;
2057     }
2058 else DEBUG(D_receive)
2059   debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2060 # endif
2061 }
2062 #endif
2063
2064
2065 static void
2066 log_connect_tls_drop(const uschar * what, const uschar * log_msg)
2067 {
2068 if (log_reject_target)
2069   {
2070 #ifdef DISABLE_TLS
2071   uschar * tls = NULL;
2072 #else
2073   gstring * g = s_tlslog(NULL);
2074   uschar * tls = string_from_gstring(g);
2075 #endif
2076   log_write(L_connection_reject,
2077     log_reject_target, "%s%s%s dropped by %s%s%s",
2078     LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
2079     host_and_ident(TRUE),
2080     tls ? tls : US"",
2081     what,
2082     log_msg ? US": " : US"", log_msg);
2083   }
2084 }
2085
2086
2087 /*************************************************
2088 *          Start an SMTP session                 *
2089 *************************************************/
2090
2091 /* This function is called at the start of an SMTP session. Thereafter,
2092 smtp_setup_msg() is called to initiate each separate message. This
2093 function does host-specific testing, and outputs the banner line.
2094
2095 Arguments:     none
2096 Returns:       FALSE if the session can not continue; something has
2097                gone wrong, or the connection to the host is blocked
2098 */
2099
2100 BOOL
2101 smtp_start_session(void)
2102 {
2103 int esclen;
2104 uschar *user_msg, *log_msg;
2105 uschar *code, *esc;
2106 uschar *p, *s;
2107 gstring * ss;
2108
2109 gettimeofday(&smtp_connection_start, NULL);
2110 for (smtp_ch_index = 0; smtp_ch_index < SMTP_HBUFF_SIZE; smtp_ch_index++)
2111   smtp_connection_had[smtp_ch_index] = SCH_NONE;
2112 smtp_ch_index = 0;
2113
2114 /* Default values for certain variables */
2115
2116 fl.helo_seen = fl.esmtp = fl.helo_accept_junk = FALSE;
2117 smtp_mailcmd_count = 0;
2118 count_nonmail = TRUE_UNSET;
2119 synprot_error_count = unknown_command_count = nonmail_command_count = 0;
2120 smtp_delay_mail = smtp_rlm_base;
2121 fl.auth_advertised = FALSE;
2122 f.smtp_in_pipelining_advertised = f.smtp_in_pipelining_used = FALSE;
2123 f.pipelining_enable = TRUE;
2124 sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
2125 fl.smtp_exit_function_called = FALSE;    /* For avoiding loop in not-quit exit */
2126
2127 /* If receiving by -bs from a trusted user, or testing with -bh, we allow
2128 authentication settings from -oMaa to remain in force. */
2129
2130 if (!host_checking && !f.sender_host_notsocket)
2131   sender_host_auth_pubname = sender_host_authenticated = NULL;
2132 authenticated_by = NULL;
2133
2134 #ifndef DISABLE_TLS
2135 if (!atrn_mode)
2136   {
2137   tls_in.ver = tls_in.cipher = tls_in.peerdn = NULL;
2138   tls_in.ourcert = tls_in.peercert = NULL;
2139   tls_in.sni = NULL;
2140   tls_in.ocsp = OCSP_NOT_REQ;
2141   }
2142 fl.tls_advertised = FALSE;
2143 #endif
2144 fl.dsn_advertised = FALSE;
2145 #ifdef SUPPORT_I18N
2146 fl.smtputf8_advertised = FALSE;
2147 #endif
2148
2149 /* Reset ACL connection variables */
2150
2151 acl_var_c = NULL;
2152
2153 /* Allow for trailing 0 in the command and data buffers.  Tainted. */
2154
2155 smtp_cmd_buffer = store_get_perm(2*SMTP_CMD_BUFFER_SIZE + 2, GET_TAINTED);
2156
2157 smtp_cmd_buffer[0] = 0;
2158 smtp_data_buffer = smtp_cmd_buffer + SMTP_CMD_BUFFER_SIZE + 1;
2159
2160 /* For batched input, the protocol setting can be overridden from the
2161 command line by a trusted caller. */
2162
2163 if (smtp_batched_input)
2164   {
2165   if (!received_protocol) received_protocol = US"local-bsmtp";
2166   }
2167
2168 /* For non-batched SMTP input, the protocol setting is forced here. It will be
2169 reset later if any of EHLO/AUTH/STARTTLS are received. */
2170
2171 else
2172   received_protocol =
2173     (sender_host_address ? protocols : protocols_local) [pnormal];
2174
2175 /* Set up the buffer for inputting using direct read() calls, and arrange to
2176 call the local functions instead of the standard C ones. */
2177
2178 smtp_buf_init();
2179
2180 #ifndef DISABLE_TLS
2181 if (atrn_mode && tls_in.active.sock >= 0)
2182   {
2183   receive_getc = tls_getc;
2184   receive_getbuf = tls_getbuf;
2185   receive_get_cache = tls_get_cache;
2186   receive_hasc = tls_hasc;
2187   receive_ungetc = tls_ungetc;
2188   receive_feof = tls_feof;
2189   receive_ferror = tls_ferror;
2190   }
2191 else
2192 #endif
2193   {
2194   receive_getc = smtp_getc;
2195   receive_getbuf = smtp_getbuf;
2196   receive_get_cache = smtp_get_cache;
2197   receive_hasc = smtp_hasc;
2198   receive_ungetc = smtp_ungetc;
2199   receive_feof = smtp_feof;
2200   receive_ferror = smtp_ferror;
2201   }
2202 lwr_receive_getc = NULL;
2203 lwr_receive_getbuf = NULL;
2204 lwr_receive_hasc = NULL;
2205 lwr_receive_ungetc = NULL;
2206
2207 /* Set up the message size limit; this may be host-specific */
2208
2209 GET_OPTION("message_size_limit");
2210 thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
2211 if (expand_string_message)
2212   {
2213   if (thismessage_size_limit == -1)
2214     log_write(0, LOG_MAIN|LOG_PANIC, "unable to expand message_size_limit: "
2215       "%s", expand_string_message);
2216   else
2217     log_write(0, LOG_MAIN|LOG_PANIC, "invalid message_size_limit: "
2218       "%s", expand_string_message);
2219   smtp_closedown(US"Temporary local problem - please try later");
2220   return FALSE;
2221   }
2222
2223 /* When a message is input locally via the -bs or -bS options, sender_host_
2224 unknown is set unless -oMa was used to force an IP address, in which case it
2225 is checked like a real remote connection. When -bs is used from inetd, this
2226 flag is not set, causing the sending host to be checked. The code that deals
2227 with IP source routing (if configured) is never required for -bs or -bS and
2228 the flag sender_host_notsocket is used to suppress it.
2229
2230 If smtp_accept_max and smtp_accept_reserve are set, keep some connections in
2231 reserve for certain hosts and/or networks. */
2232
2233 if (!f.sender_host_unknown)
2234   {
2235   int rc;
2236   BOOL reserved_host = FALSE;
2237
2238   /* Look up IP options (source routing info) on the socket if this is not an
2239   -oMa "host", and if any are found, log them and drop the connection.
2240
2241   Linux (and others now, see below) is different to everyone else, so there
2242   has to be some conditional compilation here. Versions of Linux before 2.1.15
2243   used a structure whose name was "options". Somebody finally realized that
2244   this name was silly, and it got changed to "ip_options". I use the
2245   newer name here, but there is a fudge in the script that sets up os.h
2246   to define a macro in older Linux systems.
2247
2248   Sigh. Linux is a fast-moving target. Another generation of Linux uses
2249   glibc 2, which has chosen ip_opts for the structure name. This is now
2250   really a glibc thing rather than a Linux thing, so the condition name
2251   has been changed to reflect this. It is relevant also to GNU/Hurd.
2252
2253   Mac OS 10.x (Darwin) is like the later glibc versions, but without the
2254   setting of the __GLIBC__ macro, so we can't detect it automatically. There's
2255   a special macro defined in the os.h file.
2256
2257   Some DGUX versions on older hardware appear not to support IP options at
2258   all, so there is now a general macro which can be set to cut out this
2259   support altogether.
2260
2261   How to do this properly in IPv6 is not yet known. */
2262
2263 #if !HAVE_IPV6 && !defined(NO_IP_OPTIONS)
2264
2265 # ifdef GLIBC_IP_OPTIONS
2266 #  if (!defined __GLIBC__) || (__GLIBC__ < 2)
2267 #   define OPTSTYLE 1
2268 #  else
2269 #   define OPTSTYLE 2
2270 #  endif
2271 # elif defined DARWIN_IP_OPTIONS
2272 # define OPTSTYLE 2
2273 # else
2274 # define OPTSTYLE 3
2275 # endif
2276
2277   if (!host_checking && !f.sender_host_notsocket)
2278     {
2279 # if OPTSTYLE == 1
2280     EXIM_SOCKLEN_T optlen = sizeof(struct ip_options) + MAX_IPOPTLEN;
2281     struct ip_options *ipopt = store_get(optlen, GET_UNTAINTED);
2282 # elif OPTSTYLE == 2
2283     struct ip_opts ipoptblock;
2284     struct ip_opts *ipopt = &ipoptblock;
2285     EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
2286 # else
2287     struct ipoption ipoptblock;
2288     struct ipoption *ipopt = &ipoptblock;
2289     EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
2290 # endif
2291
2292     /* Occasional genuine failures of getsockopt() have been seen - for
2293     example, "reset by peer". Therefore, just log and give up on this
2294     call, unless the error is ENOPROTOOPT. This error is given by systems
2295     that have the interfaces but not the mechanism - e.g. GNU/Hurd at the time
2296     of writing. So for that error, carry on - we just can't do an IP options
2297     check. */
2298
2299     DEBUG(D_receive) debug_printf("checking for IP options\n");
2300
2301     if (getsockopt(fileno(smtp_out), IPPROTO_IP, IP_OPTIONS, US (ipopt),
2302           &optlen) < 0)
2303       {
2304       if (errno != ENOPROTOOPT)
2305         {
2306         log_write(0, LOG_MAIN, "getsockopt() failed from %s: %s",
2307           host_and_ident(FALSE), strerror(errno));
2308         smtp_printf("451 SMTP service not available\r\n", SP_NO_MORE);
2309         return FALSE;
2310         }
2311       }
2312
2313     /* Deal with any IP options that are set. On the systems I have looked at,
2314     the value of MAX_IPOPTLEN has been 40, meaning that there should never be
2315     more logging data than will fit in big_buffer. Nevertheless, after somebody
2316     questioned this code, I've added in some paranoid checking. */
2317
2318     else if (optlen > 0)
2319       {
2320       uschar * p = big_buffer;
2321       uschar * pend = big_buffer + big_buffer_size;
2322       uschar * adptr;
2323       int optcount;
2324       struct in_addr addr;
2325
2326 # if OPTSTYLE == 1
2327       uschar * optstart = US (ipopt->__data);
2328 # elif OPTSTYLE == 2
2329       uschar * optstart = US (ipopt->ip_opts);
2330 # else
2331       uschar * optstart = US (ipopt->ipopt_list);
2332 # endif
2333
2334       DEBUG(D_receive) debug_printf("IP options exist\n");
2335
2336       Ustrcpy(p, "IP options on incoming call:");
2337       p += Ustrlen(p);
2338
2339       for (uschar * opt = optstart; opt && opt < US (ipopt) + optlen; )
2340         switch (*opt)
2341           {
2342           case IPOPT_EOL:
2343             opt = NULL;
2344             break;
2345
2346           case IPOPT_NOP:
2347             opt++;
2348             break;
2349
2350           case IPOPT_SSRR:
2351           case IPOPT_LSRR:
2352             if (!
2353 # if OPTSTYLE == 1
2354                  string_format(p, pend-p, " %s [@%s",
2355                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2356                  inet_ntoa(*((struct in_addr *)(&(ipopt->faddr)))))
2357 # elif OPTSTYLE == 2
2358                  string_format(p, pend-p, " %s [@%s",
2359                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2360                  inet_ntoa(ipopt->ip_dst))
2361 # else
2362                  string_format(p, pend-p, " %s [@%s",
2363                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2364                  inet_ntoa(ipopt->ipopt_dst))
2365 # endif
2366               )
2367               {
2368               opt = NULL;
2369               break;
2370               }
2371
2372             p += Ustrlen(p);
2373             optcount = (opt[1] - 3) / sizeof(struct in_addr);
2374             adptr = opt + 3;
2375             while (optcount-- > 0)
2376               {
2377               memcpy(&addr, adptr, sizeof(addr));
2378               if (!string_format(p, pend - p - 1, "%s%s",
2379                     (optcount == 0)? ":" : "@", inet_ntoa(addr)))
2380                 {
2381                 opt = NULL;
2382                 break;
2383                 }
2384               p += Ustrlen(p);
2385               adptr += sizeof(struct in_addr);
2386               }
2387             *p++ = ']';
2388             opt += opt[1];
2389             break;
2390
2391           default:
2392               {
2393               if (pend - p < 4 + 3*opt[1]) { opt = NULL; break; }
2394               Ustrcat(p, "[ ");
2395               p += 2;
2396               for (int i = 0; i < opt[1]; i++)
2397                 p += sprintf(CS p, "%2.2x ", opt[i]);
2398               *p++ = ']';
2399               }
2400             opt += opt[1];
2401             break;
2402           }
2403
2404       *p = 0;
2405       log_write(0, LOG_MAIN, "%s", big_buffer);
2406
2407       /* Refuse any call with IP options. This is what tcpwrappers 7.5 does. */
2408
2409       log_write(0, LOG_MAIN|LOG_REJECT,
2410         "connection from %s refused (IP options)", host_and_ident(FALSE));
2411
2412       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2413       return FALSE;
2414       }
2415
2416     /* Length of options = 0 => there are no options */
2417
2418     else DEBUG(D_receive) debug_printf("no IP options found\n");
2419     }
2420 #endif  /* HAVE_IPV6 && !defined(NO_IP_OPTIONS) */
2421
2422   /* Set keep-alive in socket options. The option is on by default. This
2423   setting is an attempt to get rid of some hanging connections that stick in
2424   read() when the remote end (usually a dialup) goes away. */
2425
2426   if (smtp_accept_keepalive && !f.sender_host_notsocket)
2427     ip_keepalive(fileno(smtp_out), sender_host_address, FALSE);
2428
2429   /* If the current host matches host_lookup, set the name by doing a
2430   reverse lookup. On failure, sender_host_name will be NULL and
2431   host_lookup_failed will be TRUE. This may or may not be serious - optional
2432   checks later. */
2433
2434   if (verify_check_host(&host_lookup) == OK)
2435     {
2436     (void)host_name_lookup();
2437     host_build_sender_fullhost();
2438     }
2439
2440   /* Delay this until we have the full name, if it is looked up. */
2441
2442   set_process_info("handling incoming connection from %s",
2443     host_and_ident(FALSE));
2444
2445   /* Expand smtp_receive_timeout, if needed */
2446
2447   if (smtp_receive_timeout_s)
2448     {
2449     uschar * exp;
2450     if (  !(exp = expand_string(smtp_receive_timeout_s))
2451        || !(*exp)
2452        || (smtp_receive_timeout = readconf_readtime(exp, 0, FALSE)) < 0
2453        )
2454       log_write(0, LOG_MAIN|LOG_PANIC,
2455         "bad value for smtp_receive_timeout: '%s'", exp ? exp : US"");
2456     }
2457
2458   /* Test for explicit connection rejection */
2459
2460   if (verify_check_host(&host_reject_connection) == OK)
2461     {
2462     log_write(L_connection_reject, LOG_MAIN|LOG_REJECT, "refused connection "
2463       "from %s (host_reject_connection)", host_and_ident(FALSE));
2464 #ifndef DISABLE_TLS
2465     if (!tls_in.on_connect)
2466 #endif
2467       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2468     return FALSE;
2469     }
2470
2471   /* Test with TCP Wrappers if so configured. There is a problem in that
2472   hosts_ctl() returns 0 (deny) under a number of system failure circumstances,
2473   such as disks dying. In these cases, it is desirable to reject with a 4xx
2474   error instead of a 5xx error. There isn't a "right" way to detect such
2475   problems. The following kludge is used: errno is zeroed before calling
2476   hosts_ctl(). If the result is "reject", a 5xx error is given only if the
2477   value of errno is 0 or ENOENT (which happens if /etc/hosts.{allow,deny} does
2478   not exist). */
2479
2480 #ifdef USE_TCP_WRAPPERS
2481   errno = 0;
2482   if (!(tcp_wrappers_name = expand_string(tcp_wrappers_daemon_name)))
2483     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" "
2484       "(tcp_wrappers_name) failed: %s", string_printing(tcp_wrappers_name),
2485         expand_string_message);
2486
2487   if (!hosts_ctl(tcp_wrappers_name,
2488          sender_host_name ? CS sender_host_name : STRING_UNKNOWN,
2489          sender_host_address ? CS sender_host_address : STRING_UNKNOWN,
2490          sender_ident ? CS sender_ident : STRING_UNKNOWN))
2491     {
2492     if (errno == 0 || errno == ENOENT)
2493       {
2494       HDEBUG(D_receive) debug_printf("tcp wrappers rejection\n");
2495       log_write(L_connection_reject,
2496                 LOG_MAIN|LOG_REJECT, "refused connection from %s "
2497                 "(tcp wrappers)", host_and_ident(FALSE));
2498       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2499       }
2500     else
2501       {
2502       int save_errno = errno;
2503       HDEBUG(D_receive) debug_printf("tcp wrappers rejected with unexpected "
2504         "errno value %d\n", save_errno);
2505       log_write(L_connection_reject,
2506                 LOG_MAIN|LOG_REJECT, "temporarily refused connection from %s "
2507                 "(tcp wrappers errno=%d)", host_and_ident(FALSE), save_errno);
2508       smtp_printf("451 Temporary local problem - please try later\r\n", SP_NO_MORE);
2509       }
2510     return FALSE;
2511     }
2512 #endif
2513
2514   /* Check for reserved slots. The value of smtp_accept_count has already been
2515   incremented to include this process. */
2516
2517   if (smtp_accept_max > 0 &&
2518       smtp_accept_count > smtp_accept_max - smtp_accept_reserve)
2519     {
2520     if ((rc = verify_check_host(&smtp_reserve_hosts)) != OK)
2521       {
2522       log_write(L_connection_reject,
2523         LOG_MAIN, "temporarily refused connection from %s: not in "
2524         "reserve list: connected=%d max=%d reserve=%d%s",
2525         host_and_ident(FALSE), smtp_accept_count - 1, smtp_accept_max,
2526         smtp_accept_reserve, (rc == DEFER)? " (lookup deferred)" : "");
2527       smtp_printf("421 %s: Too many concurrent SMTP connections; "
2528         "please try again later\r\n", SP_NO_MORE, smtp_active_hostname);
2529       return FALSE;
2530       }
2531     reserved_host = TRUE;
2532     }
2533
2534   /* If a load level above which only messages from reserved hosts are
2535   accepted is set, check the load. For incoming calls via the daemon, the
2536   check is done in the superior process if there are no reserved hosts, to
2537   save a fork. In all cases, the load average will already be available
2538   in a global variable at this point. */
2539
2540   if (smtp_load_reserve >= 0 &&
2541        load_average > smtp_load_reserve &&
2542        !reserved_host &&
2543        verify_check_host(&smtp_reserve_hosts) != OK)
2544     {
2545     log_write(L_connection_reject,
2546       LOG_MAIN, "temporarily refused connection from %s: not in "
2547       "reserve list and load average = %.2f", host_and_ident(FALSE),
2548       (double)load_average/1000.0);
2549     smtp_printf("421 %s: Too much load; please try again later\r\n", SP_NO_MORE,
2550       smtp_active_hostname);
2551     return FALSE;
2552     }
2553
2554   /* Determine whether unqualified senders or recipients are permitted
2555   for this host. Unfortunately, we have to do this every time, in order to
2556   set the flags so that they can be inspected when considering qualifying
2557   addresses in the headers. For a site that permits no qualification, this
2558   won't take long, however. */
2559
2560   f.allow_unqualified_sender =
2561     verify_check_host(&sender_unqualified_hosts) == OK;
2562
2563   f.allow_unqualified_recipient =
2564     verify_check_host(&recipient_unqualified_hosts) == OK;
2565
2566   /* Determine whether HELO/EHLO is required for this host. The requirement
2567   can be hard or soft. */
2568
2569   fl.helo_verify_required = verify_check_host(&helo_verify_hosts) == OK;
2570   if (!fl.helo_verify_required)
2571     fl.helo_verify = verify_check_host(&helo_try_verify_hosts) == OK;
2572
2573   /* Determine whether this hosts is permitted to send syntactic junk
2574   after a HELO or EHLO command. */
2575
2576   fl.helo_accept_junk = verify_check_host(&helo_accept_junk_hosts) == OK;
2577   }
2578
2579 /* Expand recipients_max, if needed */
2580  {
2581   uschar * rme = expand_string(recipients_max);
2582   recipients_max_expanded = atoi(CCS rme);
2583  }
2584 /* For batch SMTP input we are now done. */
2585
2586 if (smtp_batched_input) return TRUE;
2587
2588 #if defined(SUPPORT_PROXY) || defined(SUPPORT_SOCKS) || defined(EXPERIMENTAL_XCLIENT)
2589 proxy_session = FALSE;
2590 #endif
2591
2592 #ifdef SUPPORT_PROXY
2593 /* If valid Proxy Protocol source is connecting, set up session.
2594 Failure will not allow any SMTP function other than QUIT. */
2595
2596 f.proxy_session_failed = FALSE;
2597 if (proxy_protocol_host())
2598   {
2599   os_non_restarting_signal(SIGALRM, command_timeout_handler);
2600   proxy_protocol_setup();
2601   }
2602 #endif
2603
2604 /* Run the connect ACL if it exists */
2605
2606 user_msg = NULL;
2607 GET_OPTION("acl_smtp_connect");
2608 if (acl_smtp_connect)
2609   {
2610   int rc;
2611   if ((rc = acl_check(ACL_WHERE_CONNECT, NULL, acl_smtp_connect, &user_msg,
2612                       &log_msg)) != OK)
2613     {
2614 #ifndef DISABLE_TLS
2615     if (tls_in.on_connect)
2616       log_connect_tls_drop(US"'connect' ACL", log_msg);
2617     else
2618 #endif
2619       (void) smtp_handle_acl_fail(ACL_WHERE_CONNECT, rc, user_msg, log_msg);
2620     return FALSE;
2621     }
2622   }
2623
2624 /* Start up TLS if tls_on_connect is set. This is for supporting the legacy
2625 smtps port for use with older style SSL MTAs. */
2626
2627 #ifndef DISABLE_TLS
2628 if (tls_in.on_connect)
2629   {
2630   if (tls_server_start(&user_msg) != OK)
2631     return smtp_log_tls_fail(user_msg);
2632   cmd_list[CL_TLAU].is_mail_cmd = TRUE;
2633   }
2634 #endif
2635
2636 /* Output the initial message for a two-way SMTP connection. It may contain
2637 newlines, which then cause a multi-line response to be given. */
2638
2639 code = US"220";   /* Default status code */
2640 esc = US"";       /* Default extended status code */
2641 esclen = 0;       /* Length of esc */
2642
2643 if (user_msg)
2644   {
2645   int codelen = 3;
2646   s = user_msg;
2647   smtp_message_code(&code, &codelen, &s, NULL, TRUE);
2648   if (codelen > 4)
2649     {
2650     esc = code + 4;
2651     esclen = codelen - 4;
2652     }
2653   }
2654 else
2655   {
2656   GET_OPTION("smtp_banner");
2657   if (!(s = expand_string(smtp_banner)))
2658     {
2659     log_write(0, f.expand_string_forcedfail ? LOG_MAIN : LOG_MAIN|LOG_PANIC_DIE,
2660       "Expansion of \"%s\" (smtp_banner) failed: %s",
2661       smtp_banner, expand_string_message);
2662     /* for force-fail */
2663   #ifndef DISABLE_TLS
2664     if (tls_in.on_connect) tls_close(NULL, TLS_SHUTDOWN_WAIT);
2665   #endif
2666     return FALSE;
2667     }
2668   }
2669
2670 /* Remove any terminating newlines; might as well remove trailing space too */
2671
2672 p = s + Ustrlen(s);
2673 while (p > s && isspace(p[-1])) p--;
2674 s = string_copyn(s, p-s);
2675
2676 /* It seems that CC:Mail is braindead, and assumes that the greeting message
2677 is all contained in a single IP packet. The original code wrote out the
2678 greeting using several calls to fprint/fputc, and on busy servers this could
2679 cause it to be split over more than one packet - which caused CC:Mail to fall
2680 over when it got the second part of the greeting after sending its first
2681 command. Sigh. To try to avoid this, build the complete greeting message
2682 first, and output it in one fell swoop. This gives a better chance of it
2683 ending up as a single packet. */
2684
2685 ss = string_get(256);
2686
2687 p = s;
2688 do       /* At least once, in case we have an empty string */
2689   {
2690   int len;
2691   uschar *linebreak = Ustrchr(p, '\n');
2692   ss = string_catn(ss, code, 3);
2693   if (!linebreak)
2694     {
2695     len = Ustrlen(p);
2696     ss = string_catn(ss, US" ", 1);
2697     }
2698   else
2699     {
2700     len = linebreak - p;
2701     ss = string_catn(ss, US"-", 1);
2702     }
2703   ss = string_catn(ss, esc, esclen);
2704   ss = string_catn(ss, p, len);
2705   ss = string_catn(ss, US"\r\n", 2);
2706   p += len;
2707   if (linebreak) p++;
2708   }
2709 while (*p);
2710
2711 /* Before we write the banner, check that there is no input pending, unless
2712 this synchronisation check is disabled. */
2713
2714 #ifndef DISABLE_PIPE_CONNECT
2715 fl.pipe_connect_acceptable =
2716   sender_host_address && verify_check_host(&pipe_connect_advertise_hosts) == OK;
2717
2718 if (!check_sync())
2719   if (fl.pipe_connect_acceptable)
2720     f.smtp_in_early_pipe_used = TRUE;
2721   else
2722 #else
2723 if (!check_sync())
2724 #endif
2725     {
2726     unsigned n = smtp_inend - smtp_inptr;
2727     if (n > 128) n = 128;
2728
2729     log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol "
2730       "synchronization error (input sent without waiting for greeting): "
2731       "rejected connection from %s input=\"%s\"", host_and_ident(TRUE),
2732       string_printing(string_copyn(smtp_inptr, n)));
2733     smtp_printf("554 SMTP synchronization error\r\n", SP_NO_MORE);
2734     return FALSE;
2735     }
2736
2737 /* Now output the banner */
2738 /*XXX the ehlo-resp code does its own tls/nontls bit.  Maybe subroutine that? */
2739
2740 smtp_printf("%Y",
2741 #ifndef DISABLE_PIPE_CONNECT
2742   fl.pipe_connect_acceptable && pipeline_connect_sends(),
2743 #else
2744   SP_NO_MORE,
2745 #endif
2746   ss);
2747
2748 /* Attempt to see if we sent the banner before the last ACK of the 3-way
2749 handshake arrived.  If so we must have managed a TFO. */
2750
2751 #ifdef TCP_FASTOPEN
2752 if (sender_host_address && !f.sender_host_notsocket && !atrn_mode)
2753   tfo_in_check();
2754 #endif
2755
2756 return TRUE;
2757 }
2758
2759
2760
2761
2762
2763 /*************************************************
2764 *     Handle SMTP syntax and protocol errors     *
2765 *************************************************/
2766
2767 /* Write to the log for SMTP syntax errors in incoming commands, if configured
2768 to do so. Then transmit the error response. The return value depends on the
2769 number of syntax and protocol errors in this SMTP session.
2770
2771 Arguments:
2772   type      error type, given as a log flag bit
2773   code      response code; <= 0 means don't send a response
2774   data      data to reflect in the response (can be NULL)
2775   errmess   the error message
2776
2777 Returns:    -1   limit of syntax/protocol errors NOT exceeded
2778             +1   limit of syntax/protocol errors IS exceeded
2779
2780 These values fit in with the values of the "done" variable in the main
2781 processing loop in smtp_setup_msg(). */
2782
2783 int
2784 synprot_error(int type, int code, uschar *data, uschar *errmess)
2785 {
2786 int yield = -1;
2787
2788 #ifndef DISABLE_EVENT
2789 event_raise(event_action,
2790   L_smtp_syntax_error ? US"smtp:fail:syntax" : US"smtp:fail:protocol",
2791   errmess, NULL);
2792 #endif
2793
2794 log_write(type, LOG_MAIN, "SMTP %s error in \"%s\" %s %s",
2795   type == L_smtp_syntax_error ? "syntax" : "protocol",
2796   string_printing(smtp_cmd_buffer), host_and_ident(TRUE), errmess);
2797
2798 if (++synprot_error_count > smtp_max_synprot_errors)
2799   {
2800   yield = 1;
2801   log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
2802     "syntax or protocol errors (last command was \"%s\", %Y)",
2803     host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
2804     s_connhad_log(NULL)
2805     );
2806   }
2807
2808 if (code > 0)
2809   {
2810   smtp_printf("%d%c%s%s%s\r\n", SP_NO_MORE, code, yield == 1 ? '-' : ' ',
2811     data ? data : US"", data ? US": " : US"", errmess);
2812   if (yield == 1)
2813     smtp_printf("%d Too many syntax or protocol errors\r\n", SP_NO_MORE, code);
2814   }
2815
2816 return yield;
2817 }
2818
2819
2820
2821
2822 /*************************************************
2823 *    Send SMTP response, possibly multiline      *
2824 *************************************************/
2825
2826 /* There are, it seems, broken clients out there that cannot handle multiline
2827 responses. If no_multiline_responses is TRUE (it can be set from an ACL), we
2828 output nothing for non-final calls, and only the first line for anything else.
2829
2830 Arguments:
2831   code          SMTP code, may involve extended status codes
2832   codelen       length of smtp code; if > 4 there's an ESC
2833   final         FALSE if the last line isn't the final line
2834   msg           message text, possibly containing newlines
2835
2836 Returns:        nothing
2837 */
2838
2839 void
2840 smtp_respond(uschar * code, int codelen, BOOL final, uschar * msg)
2841 {
2842 int esclen = 0;
2843 uschar *esc = US"";
2844
2845 if (!final && f.no_multiline_responses) return;
2846
2847 if (codelen > 4)
2848   {
2849   esc = code + 4;
2850   esclen = codelen - 4;
2851   }
2852
2853 /* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
2854 have had the same. Note: this code is also present in smtp_printf(). It would
2855 be tidier to have it only in one place, but when it was added, it was easier to
2856 do it that way, so as not to have to mess with the code for the RCPT command,
2857 which sometimes uses smtp_printf() and sometimes smtp_respond(). */
2858
2859 if (fl.rcpt_in_progress)
2860   {
2861   if (!rcpt_smtp_response)
2862     rcpt_smtp_response = string_copy(msg);
2863   else if (fl.rcpt_smtp_response_same &&
2864            Ustrcmp(rcpt_smtp_response, msg) != 0)
2865     fl.rcpt_smtp_response_same = FALSE;
2866   fl.rcpt_in_progress = FALSE;
2867   }
2868
2869 /* Now output the message, splitting it up into multiple lines if necessary.
2870 We only handle pipelining these responses as far as nonfinal/final groups,
2871 not the whole MAIL/RCPT/DATA response set. */
2872
2873 for (uschar * nl;;)
2874   if (!(nl = Ustrchr(msg, '\n')))
2875     {
2876     smtp_printf("%.3s%c%.*s%s\r\n", !final, code, final ? ' ':'-', esclen, esc, msg);
2877     return;
2878     }
2879   else if (nl[1] == 0 || f.no_multiline_responses)
2880     {
2881     smtp_printf("%.3s%c%.*s%.*s\r\n", !final, code, final ? ' ':'-', esclen, esc,
2882       (int)(nl - msg), msg);
2883     return;
2884     }
2885   else
2886     {
2887     smtp_printf("%.3s-%.*s%.*s\r\n", SP_MORE, code, esclen, esc, (int)(nl - msg), msg);
2888     msg = nl + 1;
2889     Uskip_whitespace(&msg);
2890     }
2891 }
2892
2893
2894
2895
2896 /*************************************************
2897 *            Parse user SMTP message             *
2898 *************************************************/
2899
2900 /* This function allows for user messages overriding the response code details
2901 by providing a suitable response code string at the start of the message
2902 user_msg. Check the message for starting with a response code and optionally an
2903 extended status code. If found, check that the first digit is valid, and if so,
2904 change the code pointer and length to use the replacement. An invalid code
2905 causes a panic log; in this case, if the log messages is the same as the user
2906 message, we must also adjust the value of the log message to show the code that
2907 is actually going to be used (the original one).
2908
2909 This function is global because it is called from receive.c as well as within
2910 this module.
2911
2912 Note that the code length returned includes the terminating whitespace
2913 character, which is always included in the regex match.
2914
2915 Arguments:
2916   code          SMTP code, may involve extended status codes
2917   codelen       length of smtp code; if > 4 there's an ESC
2918   msg           message text
2919   log_msg       optional log message, to be adjusted with the new SMTP code
2920   check_valid   if true, verify the response code
2921
2922 Returns:        nothing
2923 */
2924
2925 void
2926 smtp_message_code(uschar **code, int *codelen, uschar **msg, uschar **log_msg,
2927   BOOL check_valid)
2928 {
2929 uschar * match;
2930 int len;
2931
2932 if (!msg || !*msg || !regex_match(regex_smtp_code, *msg, -1, &match))
2933   return;
2934
2935 len = Ustrlen(match);
2936 if (check_valid && (*msg)[0] != (*code)[0])
2937   {
2938   log_write(0, LOG_MAIN|LOG_PANIC, "configured error code starts with "
2939     "incorrect digit (expected %c) in \"%s\"", (*code)[0], *msg);
2940   if (log_msg && *log_msg == *msg)
2941     *log_msg = string_sprintf("%s %s", *code, *log_msg + len);
2942   }
2943 else
2944   {
2945   *code = *msg;
2946   *codelen = len;    /* Includes final space */
2947   }
2948 *msg += len;         /* Chop the code off the message */
2949 return;
2950 }
2951
2952
2953
2954
2955 /*************************************************
2956 *           Handle an ACL failure                *
2957 *************************************************/
2958
2959 /* This function is called when acl_check() fails. As well as calls from within
2960 this module, it is called from receive.c for an ACL after DATA. It sorts out
2961 logging the incident, and sends the error response. A message containing
2962 newlines is turned into a multiline SMTP response, but for logging, only the
2963 first line is used.
2964
2965 There's a table of default permanent failure response codes to use in
2966 globals.c, along with the table of names. VFRY is special. Despite RFC1123 it
2967 defaults disabled in Exim. However, discussion in connection with RFC 821bis
2968 (aka RFC 2821) has concluded that the response should be 252 in the disabled
2969 state, because there are broken clients that try VRFY before RCPT. A 5xx
2970 response should be given only when the address is positively known to be
2971 undeliverable. Sigh. We return 252 if there is no VRFY ACL or it provides
2972 no explicit code, but if there is one we let it know best.
2973 Also, for ETRN, 458 is given on refusal, and for AUTH, 503.
2974
2975 From Exim 4.63, it is possible to override the response code details by
2976 providing a suitable response code string at the start of the message provided
2977 in user_msg. The code's first digit is checked for validity.
2978
2979 Arguments:
2980   where        where the ACL was called from
2981   rc           the failure code
2982   user_msg     a message that can be included in an SMTP response
2983   log_msg      a message for logging
2984
2985 Returns:     0 in most cases
2986              2 if the failure code was FAIL_DROP, in which case the
2987                SMTP connection should be dropped (this value fits with the
2988                "done" variable in smtp_setup_msg() below)
2989 */
2990
2991 int
2992 smtp_handle_acl_fail(int where, int rc, uschar * user_msg, uschar * log_msg)
2993 {
2994 BOOL drop = rc == FAIL_DROP;
2995 int codelen = 3;
2996 uschar *smtp_code;
2997 uschar *lognl;
2998 uschar *sender_info = US"";
2999 uschar *what;
3000
3001 if (drop) rc = FAIL;
3002
3003 /* Set the default SMTP code, and allow a user message to change it. */
3004
3005 smtp_code = rc == FAIL ? acl_wherecodes[where] : US"451";
3006 smtp_message_code(&smtp_code, &codelen, &user_msg, &log_msg,
3007   where != ACL_WHERE_VRFY);
3008
3009 /* Get info for logging.
3010 We used to have sender_address here; however, there was a bug that was not
3011 updating sender_address after a rewrite during a verify. When this bug was
3012 fixed, sender_address at this point became the rewritten address. I'm not sure
3013 this is what should be logged, so I've changed to logging the unrewritten
3014 address to retain backward compatibility. */
3015
3016 switch (where)
3017   {
3018 #ifdef WITH_CONTENT_SCAN
3019   case ACL_WHERE_MIME:          what = US"during MIME ACL checks";      break;
3020 #endif
3021   case ACL_WHERE_PREDATA:       what = US"DATA";                        break;
3022   case ACL_WHERE_DATA:          what = US"after DATA";                  break;
3023 #ifndef DISABLE_PRDR
3024   case ACL_WHERE_PRDR:          what = US"after DATA PRDR";             break;
3025 #endif
3026   default:
3027     {
3028     uschar * place = smtp_cmd_data ? smtp_cmd_data : US"in \"connect\" ACL";
3029     int lim = 100;
3030
3031     if (where == ACL_WHERE_AUTH)        /* avoid logging auth creds */
3032       {
3033       uschar * s = smtp_cmd_data;
3034       Uskip_nonwhite(&s);
3035       lim = s - smtp_cmd_data;  /* stop after method */
3036       }
3037     what = string_sprintf("%s %.*s", acl_wherenames[where], lim, place);
3038     }
3039   }
3040 switch (where)
3041   {
3042   case ACL_WHERE_RCPT:
3043   case ACL_WHERE_DATA:
3044 #ifdef WITH_CONTENT_SCAN
3045   case ACL_WHERE_MIME:
3046 #endif
3047     sender_info = string_sprintf("F=<%s>%s%s%s%s ",
3048       sender_address_unrewritten ? sender_address_unrewritten : sender_address,
3049       sender_host_authenticated ? US" A="                                    : US"",
3050       sender_host_authenticated ? sender_host_authenticated                  : US"",
3051       sender_host_authenticated && authenticated_id ? US":"                  : US"",
3052       sender_host_authenticated && authenticated_id ? authenticated_id       : US""
3053       );
3054   break;
3055   }
3056
3057 /* If there's been a sender verification failure with a specific message, and
3058 we have not sent a response about it yet, do so now, as a preliminary line for
3059 failures, but not defers. However, always log it for defer, and log it for fail
3060 unless the sender_verify_fail log selector has been turned off. */
3061
3062 if (sender_verified_failed &&
3063     !testflag(sender_verified_failed, af_sverify_told))
3064   {
3065   BOOL save_rcpt_in_progress = fl.rcpt_in_progress;
3066   fl.rcpt_in_progress = FALSE;  /* So as not to treat these as the error */
3067
3068   setflag(sender_verified_failed, af_sverify_told);
3069
3070   if (rc != FAIL || LOGGING(sender_verify_fail))
3071     log_write(0, LOG_MAIN|LOG_REJECT, "%s sender verify %s for <%s>%s",
3072       host_and_ident(TRUE),
3073       ((sender_verified_failed->special_action & 255) == DEFER)? "defer":"fail",
3074       sender_verified_failed->address,
3075       (sender_verified_failed->message == NULL)? US"" :
3076       string_sprintf(": %s", sender_verified_failed->message));
3077
3078   if (rc == FAIL && sender_verified_failed->user_message)
3079     smtp_respond(smtp_code, codelen, SR_NOT_FINAL, string_sprintf(
3080         testflag(sender_verified_failed, af_verify_pmfail)?
3081           "Postmaster verification failed while checking <%s>\n%s\n"
3082           "Several RFCs state that you are required to have a postmaster\n"
3083           "mailbox for each mail domain. This host does not accept mail\n"
3084           "from domains whose servers reject the postmaster address."
3085           :
3086         testflag(sender_verified_failed, af_verify_nsfail)?
3087           "Callback setup failed while verifying <%s>\n%s\n"
3088           "The initial connection, or a HELO or MAIL FROM:<> command was\n"
3089           "rejected. Refusing MAIL FROM:<> does not help fight spam, disregards\n"
3090           "RFC requirements, and stops you from receiving standard bounce\n"
3091           "messages. This host does not accept mail from domains whose servers\n"
3092           "refuse bounces."
3093           :
3094           "Verification failed for <%s>\n%s",
3095         sender_verified_failed->address,
3096         sender_verified_failed->user_message));
3097
3098   fl.rcpt_in_progress = save_rcpt_in_progress;
3099   }
3100
3101 /* Sort out text for logging */
3102
3103 log_msg = log_msg ? string_sprintf(": %s", log_msg) : US"";
3104 if ((lognl = Ustrchr(log_msg, '\n'))) *lognl = 0;
3105
3106 /* Send permanent failure response to the command, but the code used isn't
3107 always a 5xx one - see comments at the start of this function. If the original
3108 rc was FAIL_DROP we drop the connection and yield 2. */
3109
3110 if (rc == FAIL)
3111   smtp_respond(smtp_code, codelen, SR_FINAL,
3112     user_msg ? user_msg : US"Administrative prohibition");
3113
3114 /* Send temporary failure response to the command. Don't give any details,
3115 unless acl_temp_details is set. This is TRUE for a callout defer, a "defer"
3116 verb, and for a header verify when smtp_return_error_details is set.
3117
3118 This conditional logic is all somewhat of a mess because of the odd
3119 interactions between temp_details and return_error_details. One day it should
3120 be re-implemented in a tidier fashion. */
3121
3122 else
3123   if (f.acl_temp_details && user_msg)
3124     {
3125     if (  smtp_return_error_details
3126        && sender_verified_failed
3127        && sender_verified_failed->message
3128        )
3129       smtp_respond(smtp_code, codelen, SR_NOT_FINAL, sender_verified_failed->message);
3130
3131     smtp_respond(smtp_code, codelen, SR_FINAL, user_msg);
3132     }
3133   else
3134     smtp_respond(smtp_code, codelen, SR_FINAL,
3135       US"Temporary local problem - please try later");
3136
3137 /* Log the incident to the logs that are specified by log_reject_target
3138 (default main, reject). This can be empty to suppress logging of rejections. If
3139 the connection is not forcibly to be dropped, return 0. Otherwise, log why it
3140 is closing if required and return 2.  */
3141
3142 if (log_reject_target)
3143   {
3144 #ifndef DISABLE_TLS
3145   gstring * g = s_tlslog(NULL);
3146   uschar * tls = string_from_gstring(g);
3147   if (!tls) tls = US"";
3148 #else
3149   uschar * tls = US"";
3150 #endif
3151   log_write(where == ACL_WHERE_CONNECT ? L_connection_reject : 0,
3152     log_reject_target, "%s%s%s %s%srejected %s%s",
3153     LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
3154     host_and_ident(TRUE),
3155     tls,
3156     sender_info,
3157     rc == FAIL ? US"" : US"temporarily ",
3158     what, log_msg);
3159   }
3160
3161 if (!drop) return 0;
3162
3163 log_close_event(US"by DROP in ACL");
3164
3165 /* Run the not-quit ACL, but without any custom messages. This should not be a
3166 problem, because we get here only if some other ACL has issued "drop", and
3167 in that case, *its* custom messages will have been used above. */
3168
3169 smtp_notquit_exit(US"acl-drop", NULL, NULL);
3170
3171 /* An overenthusiastic fail2ban/iptables implimentation has been seen to result
3172 in the TCP conn staying open, and retrying, despite this process exiting. A
3173 malicious client could possibly do the same, tying up server netowrking
3174 resources. Close the socket explicitly to try to avoid that (there's a note in
3175 the Linux socket(7) manpage, SO_LINGER para, to the effect that exim() without
3176 close() results in the socket always lingering). */
3177
3178 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3179 DEBUG(D_any) debug_printf_indent("SMTP(close)>>\n");
3180 (void) fclose(smtp_in);
3181 (void) fclose(smtp_out);
3182
3183 return 2;
3184 }
3185
3186
3187
3188
3189 /*************************************************
3190 *     Handle SMTP exit when QUIT is not given    *
3191 *************************************************/
3192
3193 /* This function provides a logging/statistics hook for when an SMTP connection
3194 is dropped on the floor or the other end goes away. It's a global function
3195 because it's called from receive.c as well as this module. As well as running
3196 the NOTQUIT ACL, if there is one, this function also outputs a final SMTP
3197 response, either with a custom message from the ACL, or using a default. There
3198 is one case, however, when no message is output - after "drop". In that case,
3199 the ACL that obeyed "drop" has already supplied the custom message, and NULL is
3200 passed to this function.
3201
3202 In case things go wrong while processing this function, causing an error that
3203 may re-enter this function, there is a recursion check.
3204
3205 Arguments:
3206   reason          What $smtp_notquit_reason will be set to in the ACL;
3207                     if NULL, the ACL is not run
3208   code            The error code to return as part of the response
3209   defaultrespond  The default message if there's no user_msg
3210
3211 Returns:          Nothing
3212 */
3213
3214 void
3215 smtp_notquit_exit(uschar *reason, uschar *code, uschar *defaultrespond, ...)
3216 {
3217 int rc;
3218 uschar *user_msg = NULL;
3219 uschar *log_msg = NULL;
3220
3221 /* Check for recursive call */
3222
3223 if (fl.smtp_exit_function_called)
3224   {
3225   log_write(0, LOG_PANIC, "smtp_notquit_exit() called more than once (%s)",
3226     reason);
3227   return;
3228   }
3229 fl.smtp_exit_function_called = TRUE;
3230
3231 /* Call the not-QUIT ACL, if there is one, unless no reason is given. */
3232
3233 GET_OPTION("acl_smtp_notquit");
3234 if (acl_smtp_notquit && reason)
3235   {
3236   smtp_notquit_reason = reason;
3237   if ((rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
3238                       &log_msg)) == ERROR)
3239     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
3240       log_msg);
3241   }
3242
3243 /* If the connection was dropped, we certainly are no longer talking TLS */
3244 tls_in.active.sock = -1;
3245
3246 /* Write an SMTP response if we are expected to give one. As the default
3247 responses are all internal, they should be reasonable size. */
3248
3249 if (code && defaultrespond)
3250   {
3251   if (user_msg)
3252     smtp_respond(code, 3, SR_FINAL, user_msg);
3253   else
3254     {
3255     gstring * g;
3256     va_list ap;
3257
3258     va_start(ap, defaultrespond);
3259     g = string_vformat(NULL, SVFMT_EXTEND|SVFMT_REBUFFER, CS defaultrespond, ap);
3260     va_end(ap);
3261     smtp_printf("%s %Y\r\n", SP_NO_MORE, code, g);
3262     }
3263   mac_smtp_fflush();
3264   }
3265 }
3266
3267
3268
3269
3270 /*************************************************
3271 *             Verify HELO argument               *
3272 *************************************************/
3273
3274 /* This function is called if helo_verify_hosts or helo_try_verify_hosts is
3275 matched. It is also called from ACL processing if verify = helo is used and
3276 verification was not previously tried (i.e. helo_try_verify_hosts was not
3277 matched). The result of its processing is to set helo_verified and
3278 helo_verify_failed. These variables should both be FALSE for this function to
3279 be called.
3280
3281 Note that EHLO/HELO is legitimately allowed to quote an address literal. Allow
3282 for IPv6 ::ffff: literals.
3283
3284 Argument:   none
3285 Returns:    TRUE if testing was completed;
3286             FALSE on a temporary failure
3287 */
3288
3289 BOOL
3290 smtp_verify_helo(void)
3291 {
3292 BOOL yield = TRUE;
3293
3294 HDEBUG(D_receive) debug_printf("verifying EHLO/HELO argument \"%s\"\n",
3295   sender_helo_name);
3296
3297 if (sender_helo_name == NULL)
3298   {
3299   HDEBUG(D_receive) debug_printf("no EHLO/HELO command was issued\n");
3300   }
3301
3302 /* Deal with the case of -bs without an IP address */
3303
3304 else if (sender_host_address == NULL)
3305   {
3306   HDEBUG(D_receive) debug_printf("no client IP address: assume success\n");
3307   f.helo_verified = TRUE;
3308   }
3309
3310 /* Deal with the more common case when there is a sending IP address */
3311
3312 else if (sender_helo_name[0] == '[')
3313   {
3314   f.helo_verified = Ustrncmp(sender_helo_name+1, sender_host_address,
3315     Ustrlen(sender_host_address)) == 0;
3316
3317 #if HAVE_IPV6
3318   if (!f.helo_verified)
3319     {
3320     if (strncmpic(sender_host_address, US"::ffff:", 7) == 0)
3321       f.helo_verified = Ustrncmp(sender_helo_name + 1,
3322         sender_host_address + 7, Ustrlen(sender_host_address) - 7) == 0;
3323     }
3324 #endif
3325
3326   HDEBUG(D_receive)
3327     { if (f.helo_verified) debug_printf("matched host address\n"); }
3328   }
3329
3330 /* Do a reverse lookup if one hasn't already given a positive or negative
3331 response. If that fails, or the name doesn't match, try checking with a forward
3332 lookup. */
3333
3334 else
3335   {
3336   if (sender_host_name == NULL && !host_lookup_failed)
3337     yield = host_name_lookup() != DEFER;
3338
3339   /* If a host name is known, check it and all its aliases. */
3340
3341   if (sender_host_name)
3342     if ((f.helo_verified = strcmpic(sender_host_name, sender_helo_name) == 0))
3343       {
3344       sender_helo_dnssec = sender_host_dnssec;
3345       HDEBUG(D_receive) debug_printf("matched host name\n");
3346       }
3347     else
3348       {
3349       uschar **aliases = sender_host_aliases;
3350       while (*aliases)
3351         if ((f.helo_verified = strcmpic(*aliases++, sender_helo_name) == 0))
3352           {
3353           sender_helo_dnssec = sender_host_dnssec;
3354           break;
3355           }
3356
3357       HDEBUG(D_receive) if (f.helo_verified)
3358           debug_printf("matched alias %s\n", *(--aliases));
3359       }
3360
3361   /* Final attempt: try a forward lookup of the helo name */
3362
3363   if (!f.helo_verified)
3364     {
3365     int rc;
3366     host_item h =
3367       {.name = sender_helo_name, .address = NULL, .mx = MX_NONE, .next = NULL};
3368     dnssec_domains d =
3369       {.request = US"*", .require = US""};
3370
3371     HDEBUG(D_receive) debug_printf("getting IP address for %s\n",
3372       sender_helo_name);
3373     rc = host_find_bydns(&h, NULL, HOST_FIND_BY_A | HOST_FIND_BY_AAAA,
3374                           NULL, NULL, NULL, &d, NULL, NULL);
3375     if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
3376       for (host_item * hh = &h; hh; hh = hh->next)
3377         if (Ustrcmp(hh->address, sender_host_address) == 0)
3378           {
3379           f.helo_verified = TRUE;
3380           if (h.dnssec == DS_YES) sender_helo_dnssec = TRUE;
3381           HDEBUG(D_receive)
3382             debug_printf("IP address for %s matches calling address\n"
3383               "Forward DNS security status: %sverified\n",
3384               sender_helo_name, sender_helo_dnssec ? "" : "un");
3385           break;
3386           }
3387     }
3388   }
3389
3390 if (!f.helo_verified) f.helo_verify_failed = TRUE;  /* We've tried ... */
3391 return yield;
3392 }
3393
3394
3395
3396
3397 /*************************************************
3398 *        Send user response message              *
3399 *************************************************/
3400
3401 /* This function is passed a default response code and a user message. It calls
3402 smtp_message_code() to check and possibly modify the response code, and then
3403 calls smtp_respond() to transmit the response. I put this into a function
3404 just to avoid a lot of repetition.
3405
3406 Arguments:
3407   code         the response code
3408   user_msg     the user message
3409
3410 Returns:       nothing
3411 */
3412
3413 static void
3414 smtp_user_msg(uschar * code, uschar * user_msg)
3415 {
3416 int len = 3;
3417 smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
3418 smtp_respond(code, len, SR_FINAL, user_msg);
3419 }
3420
3421
3422
3423 static int
3424 smtp_in_auth(auth_instance *au, uschar ** smtp_resp, uschar ** errmsg)
3425 {
3426 const uschar *set_id = NULL;
3427 int rc;
3428
3429 /* Set up globals for error messages */
3430
3431 authenticator_name = au->drinst.name;
3432 driver_srcfile = au->drinst.srcfile;
3433 driver_srcline = au->drinst.srcline;
3434
3435 /* Run the checking code, passing the remainder of the command line as
3436 data. Initials the $auth<n> variables as empty. Initialize $0 empty and set
3437 it as the only set numerical variable. The authenticator may set $auth<n>
3438 and also set other numeric variables. The $auth<n> variables are preferred
3439 nowadays; the numerical variables remain for backwards compatibility.
3440
3441 Afterwards, have a go at expanding the set_id string, even if
3442 authentication failed - for bad passwords it can be useful to log the
3443 userid. On success, require set_id to expand and exist, and put it in
3444 authenticated_id. Save this in permanent store, as the working store gets
3445 reset at HELO, RSET, etc. */
3446
3447 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;
3448 expand_nmax = 0;
3449 expand_nlength[0] = 0;   /* $0 contains nothing */
3450
3451   {
3452   auth_info * ai = au->drinst.info;
3453   rc = (ai->servercode)(au, smtp_cmd_data);
3454   }
3455 if (au->set_id) set_id = expand_string(au->set_id);
3456 expand_nmax = -1;        /* Reset numeric variables */
3457 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;   /* Reset $auth<n> */
3458 driver_srcfile = authenticator_name = NULL; driver_srcline = 0;
3459
3460 /* The value of authenticated_id is stored in the spool file and printed in
3461 log lines. It must not contain binary zeros or newline characters. In
3462 normal use, it never will, but when playing around or testing, this error
3463 can (did) happen. To guard against this, ensure that the id contains only
3464 printing characters. */
3465
3466 if (set_id) set_id = string_printing(set_id);
3467
3468 /* For the non-OK cases, set up additional logging data if set_id
3469 is not empty. */
3470
3471 if (rc != OK)
3472   set_id = set_id && *set_id
3473     ? string_sprintf(" (set_id=%s)", set_id) : US"";
3474
3475 /* Switch on the result */
3476
3477 switch(rc)
3478   {
3479   case OK:
3480     if (!au->set_id || set_id)    /* Complete success */
3481       {
3482       if (set_id) authenticated_id = string_copy_perm(set_id, TRUE);
3483       sender_host_authenticated = au->drinst.name;
3484       sender_host_auth_pubname  = au->public_name;
3485       authentication_failed = FALSE;
3486       authenticated_fail_id = NULL;   /* Impossible to already be set? */
3487
3488       received_protocol =
3489         (sender_host_address ? protocols : protocols_local)
3490           [pextend + pauthed + (tls_in.active.sock >= 0 ? pcrpted:0)];
3491       *smtp_resp = *errmsg = US"235 Authentication succeeded";
3492       authenticated_by = au;
3493       break;
3494       }
3495
3496     /* Authentication succeeded, but we failed to expand the set_id string.
3497     Treat this as a temporary error. */
3498
3499     auth_defer_msg = expand_string_message;
3500     /* Fall through */
3501
3502   case DEFER:
3503     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3504     *smtp_resp = string_sprintf("435 Unable to authenticate at present%s",
3505       auth_defer_user_msg);
3506     *errmsg = string_sprintf("435 Unable to authenticate at present%s: %s",
3507       set_id, auth_defer_msg);
3508     break;
3509
3510   case BAD64:
3511     *smtp_resp = *errmsg = US"501 Invalid base64 data";
3512     break;
3513
3514   case CANCELLED:
3515     *smtp_resp = *errmsg = US"501 Authentication cancelled";
3516     break;
3517
3518   case UNEXPECTED:
3519     *smtp_resp = *errmsg = US"553 Initial data not expected";
3520     break;
3521
3522   case FAIL:
3523     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3524     *smtp_resp = US"535 Incorrect authentication data";
3525     *errmsg = string_sprintf("535 Incorrect authentication data%s", set_id);
3526     break;
3527
3528   default:
3529     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3530     *smtp_resp = US"435 Internal error";
3531     *errmsg = string_sprintf("435 Internal error%s: return %d from authentication "
3532       "check", set_id, rc);
3533     break;
3534   }
3535
3536 return rc;
3537 }
3538
3539
3540
3541
3542
3543 static int
3544 qualify_recipient(uschar ** recipient, uschar * smtp_cmd_data, uschar * tag)
3545 {
3546 int rd;
3547 if (f.allow_unqualified_recipient || strcmpic(*recipient, US"postmaster") == 0)
3548   {
3549   DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
3550     *recipient);
3551   rd = Ustrlen(recipient) + 1;
3552   /* deconst ok as *recipient was not const */
3553   *recipient = US rewrite_address_qualify(*recipient, TRUE);
3554   return rd;
3555   }
3556 smtp_printf("501 %s: recipient address must contain a domain\r\n", SP_NO_MORE,
3557   smtp_cmd_data);
3558 log_write(L_smtp_syntax_error,
3559   LOG_MAIN|LOG_REJECT, "unqualified %s rejected: <%s> %s%s",
3560   tag, *recipient, host_and_ident(TRUE), host_lookup_msg);
3561 return 0;
3562 }
3563
3564
3565
3566
3567 static void
3568 smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
3569 {
3570 HAD(SCH_QUIT);
3571 f.smtp_in_quit = TRUE;
3572 incomplete_transaction_log(US"QUIT");
3573 GET_OPTION("acl_smtp_quit");
3574 if (  acl_smtp_quit
3575    && acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp)
3576         == ERROR)
3577     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
3578       *log_msgp);
3579
3580 #ifdef EXIM_TCP_CORK
3581 (void) setsockopt(fileno(smtp_out), IPPROTO_TCP, EXIM_TCP_CORK, US &on, sizeof(on));
3582 #endif
3583
3584 if (*user_msgp)
3585   smtp_respond(US"221", 3, SR_FINAL, *user_msgp);
3586 else
3587   smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
3588
3589 #ifdef SERVERSIDE_CLOSE_NOWAIT
3590 # ifndef DISABLE_TLS
3591 tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
3592 # endif
3593
3594 log_close_event(US"by QUIT");
3595 #else
3596
3597 # ifndef DISABLE_TLS
3598 tls_close(NULL, TLS_SHUTDOWN_WAIT);
3599 # endif
3600
3601 log_close_event(US"by QUIT");
3602
3603 /* Pause, hoping client will FIN first so that they get the TIME_WAIT.
3604 The socket should become readble (though with no data) */
3605
3606 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3607 #endif  /*!SERVERSIDE_CLOSE_NOWAIT*/
3608 }
3609
3610
3611 static void
3612 smtp_rset_handler(void)
3613 {
3614 HAD(SCH_RSET);
3615 incomplete_transaction_log(US"RSET");
3616 smtp_printf("250 Reset OK\r\n", SP_NO_MORE);
3617 cmd_list[CL_RSET].is_mail_cmd = FALSE;
3618 if (chunking_state > CHUNKING_OFFERED)
3619   chunking_state = CHUNKING_OFFERED;
3620 }
3621
3622
3623 #ifndef DISABLE_WELLKNOWN
3624 static int
3625 smtp_wellknown_handler(void)
3626 {
3627 if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
3628   {
3629   GET_OPTION("acl_smtp_wellknown");
3630   if (acl_smtp_wellknown)
3631     {
3632     uschar * user_msg = NULL, * log_msg;
3633     int rc;
3634
3635     if ((rc = acl_check(ACL_WHERE_WELLKNOWN, NULL, acl_smtp_wellknown,
3636                 &user_msg, &log_msg)) != OK)
3637       return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, rc, user_msg, log_msg);
3638     else if (!wellknown_response)
3639       return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, ERROR, user_msg, log_msg);
3640     smtp_user_msg(US"250", wellknown_response);
3641     return 0;
3642     }
3643   }
3644
3645 smtp_printf("554 not permitted\r\n", SP_NO_MORE);
3646 log_write(0, LOG_MAIN|LOG_REJECT, "rejected \"%s\" from %s",
3647               smtp_cmd_buffer, sender_helo_name, host_and_ident(FALSE));
3648 return 0;
3649 }
3650 #endif
3651
3652
3653 static int
3654 expand_mailmax(const uschar * s)
3655 {
3656 if (!(s = expand_cstring(s)))
3657   log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand smtp_accept_max_per_connection");
3658 return *s ? Uatoi(s) : 0;
3659 }
3660
3661 /*************************************************
3662 *       Initialize for SMTP incoming message     *
3663 *************************************************/
3664
3665 /* This function conducts the initial dialogue at the start of an incoming SMTP
3666 message, and builds a list of recipients. However, if the incoming message
3667 is part of a batch (-bS option) a separate function is called since it would
3668 be messy having tests splattered about all over this function. This function
3669 therefore handles the case where interaction is occurring. The input and output
3670 files are set up in smtp_in and smtp_out.
3671
3672 The global recipients_list is set to point to a vector of recipient_item
3673 blocks, whose number is given by recipients_count. This is extended by the
3674 receive_add_recipient() function. The global variable sender_address is set to
3675 the sender's address. The yield is +1 if a message has been successfully
3676 started, 0 if a QUIT command was encountered or the connection was refused from
3677 the particular host, or -1 if the connection was lost.
3678
3679 Argument: none
3680
3681 Returns:  > 0 message successfully started (reached DATA)
3682           = 0 QUIT read or end of file reached or call refused
3683           < 0 lost connection
3684 */
3685
3686 int
3687 smtp_setup_msg(void)
3688 {
3689 int done = 0;
3690 BOOL toomany = FALSE;
3691 BOOL discarded = FALSE;
3692 BOOL last_was_rej_mail = FALSE;
3693 BOOL last_was_rcpt = FALSE;
3694 rmark reset_point = store_mark();
3695
3696 DEBUG(D_receive) debug_printf("smtp_setup_msg entered\n");
3697
3698 /* Reset for start of new message. We allow one RSET not to be counted as a
3699 nonmail command, for those MTAs that insist on sending it between every
3700 message. Ditto for EHLO/HELO and for STARTTLS, to allow for going in and out of
3701 TLS between messages (an Exim client may do this if it has messages queued up
3702 for the host). Note: we do NOT reset AUTH at this point. */
3703
3704 reset_point = smtp_reset(reset_point);
3705 message_ended = END_NOTSTARTED;
3706
3707 chunking_state = f.chunking_offered ? CHUNKING_OFFERED : CHUNKING_NOT_OFFERED;
3708
3709 cmd_list[CL_RSET].is_mail_cmd = TRUE;
3710 cmd_list[CL_HELO].is_mail_cmd = TRUE;
3711 cmd_list[CL_EHLO].is_mail_cmd = TRUE;
3712 #ifndef DISABLE_TLS
3713 cmd_list[CL_STLS].is_mail_cmd = TRUE;
3714 #endif
3715
3716 if (lwr_receive_getc && !atrn_mode)
3717   {
3718   /* This should have already happened, but if we've gotten confused,
3719   force a reset here. */
3720   DEBUG(D_receive) debug_printf("WARNING: smtp_setup_msg had to restore receive functions to lowers\n");
3721   bdat_pop_receive_functions();
3722   }
3723
3724 /* Set the local signal handler for SIGTERM - it tries to end off tidily */
3725
3726 had_command_sigterm = 0;
3727 os_non_restarting_signal(SIGTERM, command_sigterm_handler);
3728
3729 /* Batched SMTP is handled in a different function. */
3730
3731 if (smtp_batched_input) return smtp_setup_batch_msg();
3732
3733 #ifdef TCP_QUICKACK
3734 if (smtp_in)            /* Avoid pure-ACKs while in cmd pingpong phase */
3735   (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
3736           US &off, sizeof(off));
3737 #endif
3738
3739 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
3740 value. The values are 2 larger than the required yield of the function. */
3741
3742 while (done <= 0)
3743   {
3744   const uschar ** argv;
3745   uschar * etrn_command, * etrn_serialize_key, * errmess;
3746   uschar * log_msg, * smtp_code;
3747   uschar * user_msg = NULL, * recipient = NULL, * hello = NULL;
3748   uschar * s, * ss;
3749   BOOL was_rej_mail = FALSE, was_rcpt = FALSE;
3750   void (*oldsignal)(int);
3751   pid_t pid;
3752   int start, end, sender_domain, recipient_domain;
3753   int rc, c, dsn_flags;
3754   uschar * orcpt = NULL;
3755   gstring * g;
3756
3757 #ifdef AUTH_TLS
3758   /* Check once per STARTTLS or SSL-on-connect for a TLS AUTH */
3759   if (  tls_in.active.sock >= 0
3760      && tls_in.peercert
3761      && tls_in.certificate_verified
3762      && cmd_list[CL_TLAU].is_mail_cmd
3763      )
3764     {
3765     cmd_list[CL_TLAU].is_mail_cmd = FALSE;
3766
3767     for (auth_instance * au = auths; au; au = au->drinst.next)
3768       if (strcmpic(US"tls", au->drinst.driver_name) == 0)
3769         {
3770         GET_OPTION("acl_smtp_auth");
3771         if (  acl_smtp_auth
3772            && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3773                       &user_msg, &log_msg)) != OK
3774            )
3775           done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3776         else
3777           {
3778           smtp_cmd_data = NULL;
3779
3780           if (smtp_in_auth(au, &s, &ss) == OK)
3781             { DEBUG(D_auth) debug_printf("tls auth succeeded\n"); }
3782           else
3783             {
3784             DEBUG(D_auth) debug_printf("tls auth not succeeded\n");
3785 #ifndef DISABLE_EVENT
3786              {
3787               uschar * save_name = sender_host_authenticated, * logmsg;
3788               sender_host_authenticated = au->drinst.name;
3789               if ((logmsg = event_raise(event_action, US"auth:fail", s, NULL)))
3790                 log_write(0, LOG_MAIN, "%s", logmsg);
3791               sender_host_authenticated = save_name;
3792              }
3793 #endif
3794             }
3795           }
3796         break;
3797         }
3798     }
3799 #endif
3800
3801   switch(smtp_read_command(
3802 #ifndef DISABLE_PIPE_CONNECT
3803           !fl.pipe_connect_acceptable,
3804 #else
3805           TRUE,
3806 #endif
3807           GETC_BUFFER_UNLIMITED))
3808     {
3809     /* The AUTH command is not permitted to occur inside a transaction, and may
3810     occur successfully only once per connection. Actually, that isn't quite
3811     true. When TLS is started, all previous information about a connection must
3812     be discarded, so a new AUTH is permitted at that time.
3813
3814     AUTH may only be used when it has been advertised. However, it seems that
3815     there are clients that send AUTH when it hasn't been advertised, some of
3816     them even doing this after HELO. And there are MTAs that accept this. Sigh.
3817     So there's a get-out that allows this to happen.
3818
3819     AUTH is initially labelled as a "nonmail command" so that one occurrence
3820     doesn't get counted. We change the label here so that multiple failing
3821     AUTHS will eventually hit the nonmail threshold. */
3822
3823     case AUTH_CMD:
3824       HAD(SCH_AUTH);
3825       authentication_failed = TRUE;
3826       cmd_list[CL_AUTH].is_mail_cmd = FALSE;
3827
3828       if (!fl.auth_advertised && !f.allow_auth_unadvertised)
3829         {
3830         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3831           US"AUTH command used when not advertised");
3832         break;
3833         }
3834       if (sender_host_authenticated)
3835         {
3836         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3837           US"already authenticated");
3838         break;
3839         }
3840       if (sender_address)
3841         {
3842         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3843           US"not permitted in mail transaction");
3844         break;
3845         }
3846
3847       /* Check the ACL */
3848
3849       GET_OPTION("acl_smtp_auth");
3850       if (  acl_smtp_auth
3851          && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3852                     &user_msg, &log_msg)) != OK
3853          )
3854         {
3855         done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3856         break;
3857         }
3858
3859       /* Find the name of the requested authentication mechanism. */
3860
3861       s = smtp_cmd_data;
3862       for (; (c = *smtp_cmd_data) && !isspace(c); smtp_cmd_data++)
3863         if (!isalnum(c) && c != '-' && c != '_')
3864           {
3865           done = synprot_error(L_smtp_syntax_error, 501, NULL,
3866             US"invalid character in authentication mechanism name");
3867           goto COMMAND_LOOP;
3868           }
3869
3870       /* If not at the end of the line, we must be at white space. Terminate the
3871       name and move the pointer on to any data that may be present. */
3872
3873       if (*smtp_cmd_data)
3874         {
3875         *smtp_cmd_data++ = '\0';
3876         Uskip_whitespace(&smtp_cmd_data);
3877         }
3878
3879       /* Search for an authentication mechanism which is configured for use
3880       as a server and which has been advertised (unless, sigh, allow_auth_
3881       unadvertised is set). */
3882
3883         {
3884         auth_instance * au;
3885         uschar * smtp_resp, * errmsg;
3886
3887         for (au = auths; au; au = au->drinst.next)
3888           if (strcmpic(s, au->public_name) == 0 && au->server &&
3889               (au->advertised || f.allow_auth_unadvertised))
3890             break;
3891
3892         if (au)
3893           {
3894           int rc = smtp_in_auth(au, &smtp_resp, &errmsg);
3895
3896           smtp_printf("%s\r\n", SP_NO_MORE, smtp_resp);
3897           if (rc != OK)
3898             {
3899             uschar * logmsg = NULL;
3900 #ifndef DISABLE_EVENT
3901              {uschar * save_name = sender_host_authenticated;
3902               sender_host_authenticated = au->drinst.name;
3903               logmsg = event_raise(event_action, US"auth:fail", smtp_resp, NULL);
3904               sender_host_authenticated = save_name;
3905              }
3906 #endif
3907             if (logmsg)
3908               log_write(0, LOG_MAIN|LOG_REJECT, "%s", logmsg);
3909             else
3910               log_write(0, LOG_MAIN|LOG_REJECT, "%s authenticator failed for %s: %s",
3911                 au->drinst.name, host_and_ident(FALSE), errmsg);
3912             }
3913           }
3914         else
3915           done = synprot_error(L_smtp_protocol_error, 504, NULL,
3916             string_sprintf("%s authentication mechanism not supported", s));
3917         }
3918
3919       break;  /* AUTH_CMD */
3920
3921     /* The HELO/EHLO commands are permitted to appear in the middle of a
3922     session as well as at the beginning. They have the effect of a reset in
3923     addition to their other functions. Their absence at the start cannot be
3924     taken to be an error.
3925
3926     RFC 2821 says:
3927
3928       If the EHLO command is not acceptable to the SMTP server, 501, 500,
3929       or 502 failure replies MUST be returned as appropriate.  The SMTP
3930       server MUST stay in the same state after transmitting these replies
3931       that it was in before the EHLO was received.
3932
3933     Therefore, we do not do the reset until after checking the command for
3934     acceptability. This change was made for Exim release 4.11. Previously
3935     it did the reset first. */
3936
3937     case HELO_CMD:
3938       HAD(SCH_HELO);
3939       hello = US"HELO";
3940       fl.esmtp = FALSE;
3941       goto HELO_EHLO;
3942
3943     case EHLO_CMD:
3944       HAD(SCH_EHLO);
3945       hello = US"EHLO";
3946       fl.esmtp = TRUE;
3947
3948     HELO_EHLO:      /* Common code for HELO and EHLO */
3949       cmd_list[CL_HELO].is_mail_cmd = FALSE;
3950       cmd_list[CL_EHLO].is_mail_cmd = FALSE;
3951
3952       /* Reject the HELO if its argument was invalid or non-existent. A
3953       successful check causes the argument to be saved in malloc store. */
3954
3955       if (!check_helo(smtp_cmd_data))
3956         {
3957         smtp_printf("501 Syntactically invalid %s argument(s)\r\n", SP_NO_MORE, hello);
3958
3959         log_write(0, LOG_MAIN|LOG_REJECT, "rejected %s from %s: syntactically "
3960           "invalid argument(s): %s", hello, host_and_ident(FALSE),
3961           *smtp_cmd_argument == 0 ? US"(no argument given)" :
3962                              string_printing(smtp_cmd_argument));
3963
3964         if (++synprot_error_count > smtp_max_synprot_errors)
3965           {
3966           log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
3967             "syntax or protocol errors (last command was \"%s\", %Y)",
3968             host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
3969             s_connhad_log(NULL)
3970             );
3971           done = 1;
3972           }
3973
3974         break;
3975         }
3976
3977       /* If sender_host_unknown is true, we have got here via the -bs interface,
3978       not called from inetd. Otherwise, we are running an IP connection and the
3979       host address will be set. If the helo name is the primary name of this
3980       host and we haven't done a reverse lookup, force one now. If helo_verify_required
3981       is set, ensure that the HELO name matches the actual host. If helo_verify
3982       is set, do the same check, but softly. */
3983
3984       if (!f.sender_host_unknown)
3985         {
3986         BOOL old_helo_verified = f.helo_verified;
3987         uschar * p = smtp_cmd_data;
3988
3989         while (*p && !isspace(*p)) { *p = tolower(*p); p++; }
3990         *p = '\0';
3991
3992         /* Force a reverse lookup if HELO quoted something in helo_lookup_domains
3993         because otherwise the log can be confusing. */
3994
3995         if (  !sender_host_name
3996            && match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0,
3997                 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK)
3998           (void)host_name_lookup();
3999
4000         /* Rebuild the fullhost info to include the HELO name (and the real name
4001         if it was looked up.) */
4002
4003         host_build_sender_fullhost();  /* Rebuild */
4004         set_process_info("handling%s incoming connection from %s",
4005           tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
4006
4007         /* Verify if configured. This doesn't give much security, but it does
4008         make some people happy to be able to do it. If helo_verify_required is set,
4009         (host matches helo_verify_hosts) failure forces rejection. If helo_verify
4010         is set (host matches helo_try_verify_hosts), it does not. This is perhaps
4011         now obsolescent, since the verification can now be requested selectively
4012         at ACL time. */
4013
4014         f.helo_verified = f.helo_verify_failed = sender_helo_dnssec = FALSE;
4015         if (fl.helo_verify_required || fl.helo_verify)
4016           {
4017           BOOL tempfail = !smtp_verify_helo();
4018           if (!f.helo_verified)
4019             {
4020             if (fl.helo_verify_required)
4021               {
4022               smtp_printf("%d %s argument does not match calling host\r\n", SP_NO_MORE,
4023                 tempfail? 451 : 550, hello);
4024               log_write(0, LOG_MAIN|LOG_REJECT, "%srejected \"%s %s\" from %s",
4025                 tempfail? "temporarily " : "",
4026                 hello, sender_helo_name, host_and_ident(FALSE));
4027               f.helo_verified = old_helo_verified;
4028               break;                   /* End of HELO/EHLO processing */
4029               }
4030             HDEBUG(D_all) debug_printf("%s verification failed but host is in "
4031               "helo_try_verify_hosts\n", hello);
4032             }
4033           }
4034         }
4035
4036       /* For any misc-module having a connection-init routine, call it. */
4037       
4038       if (misc_mod_conn_init(sender_helo_name, sender_host_address) != OK)
4039         {
4040         DEBUG(D_receive) debug_printf("A module conn-init routine failed\n");
4041         done = 1;
4042         break;
4043         }
4044
4045       /* Apply an ACL check if one is defined; afterwards, recheck
4046       synchronization in case the client started sending in a delay. */
4047
4048       GET_OPTION("acl_smtp_helo");
4049       if (acl_smtp_helo)
4050         if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
4051                   &user_msg, &log_msg)) != OK)
4052           {
4053           done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg);
4054           sender_helo_name = NULL;
4055           host_build_sender_fullhost();  /* Rebuild */
4056           break;
4057           }
4058 #ifndef DISABLE_PIPE_CONNECT
4059         else if (!fl.pipe_connect_acceptable && !check_sync())
4060 #else
4061         else if (!check_sync())
4062 #endif
4063           goto SYNC_FAILURE;
4064
4065       /* Generate an OK reply. The default string includes the ident if present,
4066       and also the IP address if present. Reflecting back the ident is intended
4067       as a deterrent to mail forgers. For maximum efficiency, and also because
4068       some broken systems expect each response to be in a single packet, arrange
4069       that the entire reply is sent in one write(). */
4070
4071       fl.auth_advertised = FALSE;
4072       f.smtp_in_pipelining_advertised = FALSE;
4073 #ifndef DISABLE_TLS
4074       fl.tls_advertised = FALSE;
4075 #endif
4076       fl.dsn_advertised = FALSE;
4077 #ifdef SUPPORT_I18N
4078       fl.smtputf8_advertised = FALSE;
4079 #endif
4080
4081       /* Expand the per-connection message count limit option */
4082       smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4083
4084       smtp_code = US"250 ";        /* Default response code plus space*/
4085       if (!user_msg)
4086         {
4087         /* sender_host_name below will be tainted, so save on copy when we hit it */
4088         g = string_get_tainted(24, GET_TAINTED);
4089         g = string_fmt_append(g, "%.3s %s Hello %s%s%s",
4090           smtp_code,
4091           smtp_active_hostname,
4092           sender_ident ? sender_ident : US"",
4093           sender_ident ? US" at " : US"",
4094           sender_host_name ? sender_host_name : sender_helo_name);
4095
4096         if (sender_host_address)
4097           g = string_fmt_append(g, " [%s]", sender_host_address);
4098         }
4099
4100       /* A user-supplied EHLO greeting may not contain more than one line. Note
4101       that the code returned by smtp_message_code() includes the terminating
4102       whitespace character. */
4103
4104       else
4105         {
4106         char * ss;
4107         int codelen = 4;
4108         smtp_message_code(&smtp_code, &codelen, &user_msg, NULL, TRUE);
4109         s = string_sprintf("%.*s%s", codelen, smtp_code, user_msg);
4110         if ((ss = strpbrk(CS s, "\r\n")) != NULL)
4111           {
4112           log_write(0, LOG_MAIN|LOG_PANIC, "EHLO/HELO response must not contain "
4113             "newlines: message truncated: %s", string_printing(s));
4114           *ss = 0;
4115           }
4116         g = string_cat(NULL, s);
4117         }
4118
4119       g = string_catn(g, US"\r\n", 2);
4120
4121       /* If we received EHLO, we must create a multiline response which includes
4122       the functions supported. */
4123
4124       if (fl.esmtp)
4125         {
4126         g->s[3] = '-';  /* overwrite the space after the SMTP response code */
4127
4128         /* I'm not entirely happy with this, as an MTA is supposed to check
4129         that it has enough room to accept a message of maximum size before
4130         it sends this. However, there seems little point in not sending it.
4131         The actual size check happens later at MAIL FROM time. By postponing it
4132         till then, VRFY and EXPN can be used after EHLO when space is short. */
4133
4134         if (thismessage_size_limit > 0)
4135           g = string_fmt_append(g, "%.3s-SIZE %d\r\n", smtp_code,
4136             thismessage_size_limit);
4137         else
4138           {
4139           g = string_catn(g, smtp_code, 3);
4140           g = string_catn(g, US"-SIZE\r\n", 7);
4141           }
4142
4143 #ifndef DISABLE_ESMTP_LIMITS
4144         if (  (smtp_mailcmd_max > 0 || recipients_max_expanded > 0)
4145            && verify_check_host(&limits_advertise_hosts) == OK)
4146           {
4147           g = string_fmt_append(g, "%.3s-LIMITS", smtp_code);
4148           if (smtp_mailcmd_max > 0)
4149             g = string_fmt_append(g, " MAILMAX=%d", smtp_mailcmd_max);
4150           if (recipients_max_expanded > 0)
4151             g = string_fmt_append(g, " RCPTMAX=%d", recipients_max_expanded);
4152           g = string_catn(g, US"\r\n", 2);
4153           }
4154 #endif
4155
4156         /* Exim does not do protocol conversion or data conversion. It is 8-bit
4157         clean; if it has an 8-bit character in its hand, it just sends it. It
4158         cannot therefore specify 8BITMIME and remain consistent with the RFCs.
4159         However, some users want this option simply in order to stop MUAs
4160         mangling messages that contain top-bit-set characters. It is therefore
4161         provided as an option. */
4162
4163         if (accept_8bitmime)
4164           {
4165           g = string_catn(g, smtp_code, 3);
4166           g = string_catn(g, US"-8BITMIME\r\n", 11);
4167           }
4168
4169         /* Advertise DSN support if configured to do so. */
4170         if (verify_check_host(&dsn_advertise_hosts) != FAIL)
4171           {
4172           g = string_catn(g, smtp_code, 3);
4173           g = string_catn(g, US"-DSN\r\n", 6);
4174           fl.dsn_advertised = TRUE;
4175           }
4176
4177         /* Advertise ATRN/ETRN/VRFY/EXPN if there's are ACL checking whether a
4178         host is permitted to issue them; a check is made when any host actually
4179         tries. */
4180
4181         GET_OPTION("acl_smtp_atrn");
4182         if (acl_smtp_atrn && !atrn_mode)
4183           {
4184           const uschar * s = expand_cstring(acl_smtp_atrn);
4185           if (s && *s)
4186             {
4187             g = string_catn(g, smtp_code, 3);
4188             g = string_catn(g, US"-ATRN\r\n", 7);
4189             }
4190           }
4191         GET_OPTION("acl_smtp_etrn");
4192         if (acl_smtp_etrn)
4193           {
4194           g = string_catn(g, smtp_code, 3);
4195           g = string_catn(g, US"-ETRN\r\n", 7);
4196           }
4197         GET_OPTION("acl_smtp_vrfy");
4198         if (acl_smtp_vrfy)
4199           {
4200           g = string_catn(g, smtp_code, 3);
4201           g = string_catn(g, US"-VRFY\r\n", 7);
4202           }
4203         GET_OPTION("acl_smtp_expn");
4204         if (acl_smtp_expn)
4205           {
4206           g = string_catn(g, smtp_code, 3);
4207           g = string_catn(g, US"-EXPN\r\n", 7);
4208           }
4209
4210         /* Exim is quite happy with pipelining, so let the other end know that
4211         it is safe to use it, unless advertising is disabled. */
4212
4213         if (  f.pipelining_enable
4214            && verify_check_host(&pipelining_advertise_hosts) == OK)
4215           {
4216           g = string_catn(g, smtp_code, 3);
4217           g = string_catn(g, US"-PIPELINING\r\n", 13);
4218           sync_cmd_limit = NON_SYNC_CMD_PIPELINING;
4219           f.smtp_in_pipelining_advertised = TRUE;
4220
4221 #ifndef DISABLE_PIPE_CONNECT
4222           if (fl.pipe_connect_acceptable)
4223             {
4224             f.smtp_in_early_pipe_advertised = TRUE;
4225             g = string_catn(g, smtp_code, 3);
4226             g = string_catn(g, US"-" EARLY_PIPE_FEATURE_NAME "\r\n", EARLY_PIPE_FEATURE_LEN+3);
4227             }
4228 #endif
4229           }
4230
4231
4232         /* If any server authentication mechanisms are configured, advertise
4233         them if the current host is in auth_advertise_hosts. The problem with
4234         advertising always is that some clients then require users to
4235         authenticate (and aren't configurable otherwise) even though it may not
4236         be necessary (e.g. if the host is in host_accept_relay).
4237
4238         RFC 2222 states that SASL mechanism names contain only upper case
4239         letters, so output the names in upper case, though we actually recognize
4240         them in either case in the AUTH command. */
4241
4242         if (  auths
4243 #ifdef AUTH_TLS
4244            && !sender_host_authenticated
4245 #endif
4246            && verify_check_host(&auth_advertise_hosts) == OK
4247            )
4248           {
4249           BOOL first = TRUE;
4250           for (auth_instance * au = auths; au; au = au->drinst.next)
4251             {
4252             au->advertised = FALSE;
4253             if (au->server)
4254               {
4255               DEBUG(D_auth+D_expand) debug_printf_indent(
4256                 "Evaluating advertise_condition for %s %s athenticator\n",
4257                 au->drinst.name, au->public_name);
4258               if (  !au->advertise_condition
4259                  || expand_check_condition(au->advertise_condition,
4260                                           au->drinst.name, US"authenticator")
4261                  )
4262                 {
4263                 int saveptr;
4264                 if (first)
4265                   {
4266                   g = string_catn(g, smtp_code, 3);
4267                   g = string_catn(g, US"-AUTH", 5);
4268                   first = FALSE;
4269                   fl.auth_advertised = TRUE;
4270                   }
4271                 saveptr = gstring_length(g);
4272                 g = string_catn(g, US" ", 1);
4273                 g = string_cat(g, au->public_name);
4274                 while (++saveptr < g->ptr) g->s[saveptr] = toupper(g->s[saveptr]);
4275                 au->advertised = TRUE;
4276                 }
4277               }
4278             }
4279
4280           if (!first) g = string_catn(g, US"\r\n", 2);
4281           }
4282
4283         /* RFC 3030 CHUNKING */
4284
4285         if (verify_check_host(&chunking_advertise_hosts) != FAIL)
4286           {
4287           g = string_catn(g, smtp_code, 3);
4288           g = string_catn(g, US"-CHUNKING\r\n", 11);
4289           f.chunking_offered = TRUE;
4290           chunking_state = CHUNKING_OFFERED;
4291           }
4292
4293 #ifndef DISABLE_TLS
4294         /* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
4295         if it has been included in the binary, and the host matches
4296         tls_advertise_hosts. We must *not* advertise if we are already in a
4297         secure connection. */
4298
4299         if (tls_in.active.sock < 0 &&
4300             verify_check_host(&tls_advertise_hosts) != FAIL)
4301           {
4302           g = string_catn(g, smtp_code, 3);
4303           g = string_catn(g, US"-STARTTLS\r\n", 11);
4304           fl.tls_advertised = TRUE;
4305           }
4306 #endif
4307 #ifdef EXPERIMENTAL_XCLIENT
4308         if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
4309           {
4310           g = string_catn(g, smtp_code, 3);
4311           g = xclient_smtp_advertise_str(g);
4312           }
4313 #endif
4314 #ifndef DISABLE_PRDR
4315         /* Per Recipient Data Response, draft by Eric A. Hall extending RFC */
4316         if (prdr_enable)
4317           {
4318           g = string_catn(g, smtp_code, 3);
4319           g = string_catn(g, US"-PRDR\r\n", 7);
4320           }
4321 #endif
4322
4323 #ifdef SUPPORT_I18N
4324         if (  accept_8bitmime
4325            && verify_check_host(&smtputf8_advertise_hosts) != FAIL)
4326           {
4327           g = string_catn(g, smtp_code, 3);
4328           g = string_catn(g, US"-SMTPUTF8\r\n", 11);
4329           fl.smtputf8_advertised = TRUE;
4330           }
4331 #endif
4332 #ifndef DISABLE_WELLKNOWN
4333         if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
4334           {
4335           g = string_catn(g, smtp_code, 3);
4336           g = string_catn(g, US"-WELLKNOWN\r\n", 12);
4337           }
4338 #endif
4339
4340         /* Finish off the multiline reply with one that is always available. */
4341
4342         g = string_catn(g, smtp_code, 3);
4343         g = string_catn(g, US" HELP\r\n", 7);
4344         }
4345
4346       /* Terminate the string (for debug), write it, and note that HELO/EHLO
4347       has been seen. */
4348
4349        {
4350         uschar * ehlo_resp;
4351         int len = len_string_from_gstring(g, &ehlo_resp);
4352 #ifndef DISABLE_TLS
4353         if (tls_in.active.sock >= 0)
4354           (void) tls_write(NULL, ehlo_resp, len,
4355 # ifndef DISABLE_PIPE_CONNECT
4356                           fl.pipe_connect_acceptable && pipeline_connect_sends());
4357 # else
4358                           FALSE);
4359 # endif
4360         else
4361 #endif
4362           (void) fwrite(ehlo_resp, 1, len, smtp_out);
4363
4364         DEBUG(D_receive) for (const uschar * t, * s = ehlo_resp;
4365                               s && (t = Ustrchr(s, '\r'));
4366                               s = t + 2)                                /* \r\n */
4367             debug_printf("%s %.*s\n",
4368                           s == g->s ? "SMTP>>" : "      ",
4369                           (int)(t - s), s);
4370         fl.helo_seen = TRUE;
4371        }
4372
4373       /* Reset the protocol and the state, abandoning any previous message. */
4374       received_protocol =
4375         (sender_host_address ? protocols : protocols_local)
4376           [ (fl.esmtp
4377             ? pextend + (sender_host_authenticated ? pauthed : 0)
4378             : pnormal)
4379           + (tls_in.active.sock >= 0 ? pcrpted : 0)
4380           ];
4381       cancel_cutthrough_connection(TRUE, US"sent EHLO response");
4382       reset_point = smtp_reset(reset_point);
4383       toomany = FALSE;
4384       break;   /* HELO/EHLO */
4385
4386 #ifndef DISABLE_WELLKNOWN
4387     case WELLKNOWN_CMD:
4388       HAD(SCH_WELLKNOWN);
4389       smtp_mailcmd_count++;
4390       smtp_wellknown_handler();
4391       break;
4392 #endif
4393
4394 #ifdef EXPERIMENTAL_XCLIENT
4395     case XCLIENT_CMD:
4396       {
4397       BOOL fatal = fl.helo_seen;
4398       uschar * errmsg;
4399       int resp;
4400
4401       HAD(SCH_XCLIENT);
4402       smtp_mailcmd_count++;
4403
4404       if ((errmsg = xclient_smtp_command(smtp_cmd_data, &resp, &fatal)))
4405         if (fatal)
4406           done = synprot_error(L_smtp_syntax_error, resp, NULL, errmsg);
4407         else
4408           {
4409           smtp_printf("%d %s\r\n", SP_NO_MORE, resp, errmsg);
4410           log_write(0, LOG_MAIN|LOG_REJECT, "rejected XCLIENT from %s: %s",
4411             host_and_ident(FALSE), errmsg);
4412           }
4413       else
4414         {
4415         fl.helo_seen = FALSE;                   /* Require another EHLO */
4416         smtp_code = string_sprintf("%d", resp);
4417
4418         /*XXX unclear in spec. if this needs to be an ESMTP banner,
4419         nor whether we get the original client's HELO after (or a proxy fake).
4420         We require that we do; the following HELO/EHLO handling will set
4421         sender_helo_name as normal. */
4422
4423         smtp_printf("%s XCLIENT success\r\n", SP_NO_MORE, smtp_code);
4424         }
4425       break; /* XCLIENT */
4426       }
4427 #endif
4428
4429
4430     /* The MAIL command requires an address as an operand. All we do
4431     here is to parse it for syntactic correctness. The form "<>" is
4432     a special case which converts into an empty string. The start/end
4433     pointers in the original are not used further for this address, as
4434     it is the canonical extracted address which is all that is kept. */
4435
4436     case MAIL_CMD:
4437       HAD(SCH_MAIL);
4438       smtp_mailcmd_count++;              /* Count for limit and ratelimit */
4439       message_start();
4440       was_rej_mail = TRUE;               /* Reset if accepted */
4441       env_mail_type_t * mail_args;       /* Sanity check & validate args */
4442
4443       if (!fl.helo_seen)
4444         if (  fl.helo_verify_required
4445            || verify_check_host(&hosts_require_helo) == OK)
4446           {
4447           log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
4448             "HELO/EHLO given", host_and_ident(FALSE));
4449           done = synprot_error(L_smtp_protocol_error, 503, NULL,
4450                       US"HELO or EHLO required");
4451           break;
4452           }
4453         else if (smtp_mailcmd_max < 0)
4454           smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4455
4456       if (sender_address)
4457         {
4458         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4459           US"sender already given");
4460         break;
4461         }
4462
4463       if (!*smtp_cmd_data)
4464         {
4465         done = synprot_error(L_smtp_protocol_error, 501, NULL,
4466           US"MAIL must have an address operand");
4467         break;
4468         }
4469
4470       /* Check to see if the limit for messages per connection would be
4471       exceeded by accepting further messages. */
4472
4473       if (smtp_mailcmd_max > 0 && smtp_mailcmd_count > smtp_mailcmd_max)
4474         {
4475         smtp_printf("421 too many messages in this connection\r\n", SP_NO_MORE);
4476         log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL command %s: too many "
4477           "messages in one connection", host_and_ident(TRUE));
4478         break;
4479         }
4480
4481       /* Reset for start of message - even if this is going to fail, we
4482       obviously need to throw away any previous data. */
4483
4484       cancel_cutthrough_connection(TRUE, US"MAIL received");
4485       reset_point = smtp_reset(reset_point);
4486       toomany = FALSE;
4487       sender_data = recipient_data = NULL;
4488
4489       /* Loop, checking for ESMTP additions to the MAIL FROM command. */
4490
4491       if (fl.esmtp) for(;;)
4492         {
4493         uschar *name, *value, *end;
4494         unsigned long int size;
4495         BOOL arg_error = FALSE;
4496
4497         if (!extract_option(&name, &value)) break;
4498
4499         for (mail_args = env_mail_type_list;
4500              mail_args->value != ENV_MAIL_OPT_NULL;
4501              mail_args++
4502             )
4503           if (strcmpic(name, mail_args->name) == 0)
4504             break;
4505         if (mail_args->need_value && strcmpic(value, US"") == 0)
4506           break;
4507
4508         switch(mail_args->value)
4509           {
4510           /* Handle SIZE= by reading the value. We don't do the check till later,
4511           in order to be able to log the sender address on failure. */
4512           case ENV_MAIL_OPT_SIZE:
4513             if (((size = Ustrtoul(value, &end, 10)), *end == 0))
4514               {
4515               if ((size == ULONG_MAX && errno == ERANGE) || size > INT_MAX)
4516                 size = INT_MAX;
4517               message_size = (int)size;
4518               }
4519             else
4520               arg_error = TRUE;
4521             break;
4522
4523           /* If this session was initiated with EHLO and accept_8bitmime is set,
4524           Exim will have indicated that it supports the BODY=8BITMIME option. In
4525           fact, it does not support this according to the RFCs, in that it does not
4526           take any special action for forwarding messages containing 8-bit
4527           characters. That is why accept_8bitmime is not the default setting, but
4528           some sites want the action that is provided. We recognize both "8BITMIME"
4529           and "7BIT" as body types, but take no action. */
4530           case ENV_MAIL_OPT_BODY:
4531             if (accept_8bitmime) {
4532               if (strcmpic(value, US"8BITMIME") == 0)
4533                 body_8bitmime = 8;
4534               else if (strcmpic(value, US"7BIT") == 0)
4535                 body_8bitmime = 7;
4536               else
4537                 {
4538                 body_8bitmime = 0;
4539                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4540                   US"invalid data for BODY");
4541                 goto COMMAND_LOOP;
4542                 }
4543               DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
4544               break;
4545             }
4546             arg_error = TRUE;
4547             break;
4548
4549           /* Handle the two DSN options, but only if configured to do so (which
4550           will have caused "DSN" to be given in the EHLO response). The code itself
4551           is included only if configured in at build time. */
4552
4553           case ENV_MAIL_OPT_RET:
4554             if (fl.dsn_advertised)
4555               {
4556               /* Check if RET has already been set */
4557               if (dsn_ret > 0)
4558                 {
4559                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4560                   US"RET can be specified once only");
4561                 goto COMMAND_LOOP;
4562                 }
4563               dsn_ret = strcmpic(value, US"HDRS") == 0
4564                 ? dsn_ret_hdrs
4565                 : strcmpic(value, US"FULL") == 0
4566                 ? dsn_ret_full
4567                 : 0;
4568               DEBUG(D_receive) debug_printf("DSN_RET: %d\n", dsn_ret);
4569               /* Check for invalid invalid value, and exit with error */
4570               if (dsn_ret == 0)
4571                 {
4572                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4573                   US"Value for RET is invalid");
4574                 goto COMMAND_LOOP;
4575                 }
4576               }
4577             break;
4578           case ENV_MAIL_OPT_ENVID:
4579             if (fl.dsn_advertised)
4580               {
4581               /* Check if the dsn envid has been already set */
4582               if (dsn_envid)
4583                 {
4584                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4585                   US"ENVID can be specified once only");
4586                 goto COMMAND_LOOP;
4587                 }
4588               dsn_envid = string_copy(value);
4589               DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid);
4590               }
4591             break;
4592
4593           /* Handle the AUTH extension. If the value given is not "<>" and either
4594           the ACL says "yes" or there is no ACL but the sending host is
4595           authenticated, we set it up as the authenticated sender. However, if the
4596           authenticator set a condition to be tested, we ignore AUTH on MAIL unless
4597           the condition is met. The value of AUTH is an xtext, which means that +,
4598           = and cntrl chars are coded in hex; however "<>" is unaffected by this
4599           coding. */
4600           case ENV_MAIL_OPT_AUTH:
4601             if (Ustrcmp(value, "<>") != 0)
4602               {
4603               int rc;
4604               uschar *ignore_msg;
4605
4606               if (xtextdecode(value, &authenticated_sender) < 0)
4607                 {
4608                 /* Put back terminator overrides for error message */
4609                 value[-1] = '=';
4610                 name[-1] = ' ';
4611                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4612                   US"invalid data for AUTH");
4613                 goto COMMAND_LOOP;
4614                 }
4615               GET_OPTION("acl_smtp_mailauth");
4616               if (!acl_smtp_mailauth)
4617                 {
4618                 ignore_msg = US"client not authenticated";
4619                 rc = sender_host_authenticated ? OK : FAIL;
4620                 }
4621               else
4622                 {
4623                 ignore_msg = US"rejected by ACL";
4624                 rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth,
4625                   &user_msg, &log_msg);
4626                 }
4627
4628               switch (rc)
4629                 {
4630                 case OK:
4631                   if (authenticated_by == NULL ||
4632                       authenticated_by->mail_auth_condition == NULL ||
4633                       expand_check_condition(authenticated_by->mail_auth_condition,
4634                           authenticated_by->drinst.name, US"authenticator"))
4635                     break;     /* Accept the AUTH */
4636
4637                   ignore_msg = US"server_mail_auth_condition failed";
4638                   if (authenticated_id != NULL)
4639                     ignore_msg = string_sprintf("%s: authenticated ID=\"%s\"",
4640                       ignore_msg, authenticated_id);
4641
4642                 /* Fall through */
4643
4644                 case FAIL:
4645                   authenticated_sender = NULL;
4646                   log_write(0, LOG_MAIN, "ignoring AUTH=%s from %s (%s)",
4647                     value, host_and_ident(TRUE), ignore_msg);
4648                   break;
4649
4650                 /* Should only get DEFER or ERROR here. Put back terminator
4651                 overrides for error message */
4652
4653                 default:
4654                   value[-1] = '=';
4655                   name[-1] = ' ';
4656                   (void)smtp_handle_acl_fail(ACL_WHERE_MAILAUTH, rc, user_msg,
4657                     log_msg);
4658                   goto COMMAND_LOOP;
4659                 }
4660               }
4661               break;
4662
4663 #ifndef DISABLE_PRDR
4664           case ENV_MAIL_OPT_PRDR:
4665             if (prdr_enable)
4666               prdr_requested = TRUE;
4667             break;
4668 #endif
4669
4670 #ifdef SUPPORT_I18N
4671           case ENV_MAIL_OPT_UTF8:
4672             if (!fl.smtputf8_advertised)
4673               {
4674               done = synprot_error(L_smtp_syntax_error, 501, NULL,
4675                 US"SMTPUTF8 used when not advertised");
4676               goto COMMAND_LOOP;
4677               }
4678
4679             DEBUG(D_receive) debug_printf("smtputf8 requested\n");
4680             message_smtputf8 = allow_utf8_domains = TRUE;
4681             if (Ustrncmp(received_protocol, US"utf8", 4) != 0)
4682               {
4683               int old_pool = store_pool;
4684               store_pool = POOL_PERM;
4685               received_protocol = string_sprintf("utf8%s", received_protocol);
4686               store_pool = old_pool;
4687               }
4688             break;
4689 #endif
4690
4691           /* No valid option. Stick back the terminator characters and break
4692           the loop.  Do the name-terminator second as extract_option sets
4693           value==name when it found no equal-sign.
4694           An error for a malformed address will occur. */
4695           case ENV_MAIL_OPT_NULL:
4696             value[-1] = '=';
4697             name[-1] = ' ';
4698             arg_error = TRUE;
4699             break;
4700
4701           default:  assert(0);
4702           }
4703         /* Break out of for loop if switch() had bad argument or
4704            when start of the email address is reached */
4705         if (arg_error) break;
4706         }
4707
4708       /* If we have passed the threshold for rate limiting, apply the current
4709       delay, and update it for next time, provided this is a limited host. */
4710
4711       if (smtp_mailcmd_count > smtp_rlm_threshold &&
4712           verify_check_host(&smtp_ratelimit_hosts) == OK)
4713         {
4714         DEBUG(D_receive) debug_printf("rate limit MAIL: delay %.3g sec\n",
4715           smtp_delay_mail/1000.0);
4716         millisleep((int)smtp_delay_mail);
4717         smtp_delay_mail *= smtp_rlm_factor;
4718         if (smtp_delay_mail > (double)smtp_rlm_limit)
4719           smtp_delay_mail = (double)smtp_rlm_limit;
4720         }
4721
4722       /* Now extract the address, first applying any SMTP-time rewriting. The
4723       TRUE flag allows "<>" as a sender address. */
4724
4725       raw_sender = rewrite_existflags & rewrite_smtp
4726         /* deconst ok as smtp_cmd_data was not const */
4727         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4728                       global_rewrite_rules)
4729         : smtp_cmd_data;
4730
4731       raw_sender =
4732         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
4733           TRUE);
4734
4735       if (!raw_sender)
4736         {
4737         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4738         break;
4739         }
4740
4741       sender_address = raw_sender;
4742
4743       /* If there is a configured size limit for mail, check that this message
4744       doesn't exceed it. The check is postponed to this point so that the sender
4745       can be logged. */
4746
4747       if (thismessage_size_limit > 0 && message_size > thismessage_size_limit)
4748         {
4749         smtp_printf("552 Message size exceeds maximum permitted\r\n", SP_NO_MORE);
4750         log_write(L_size_reject,
4751             LOG_MAIN|LOG_REJECT, "rejected MAIL FROM:<%s> %s: "
4752             "message too big: size%s=%d max=%d",
4753             sender_address,
4754             host_and_ident(TRUE),
4755             (message_size == INT_MAX)? ">" : "",
4756             message_size,
4757             thismessage_size_limit);
4758         sender_address = NULL;
4759         break;
4760         }
4761
4762       /* Check there is enough space on the disk unless configured not to.
4763       When smtp_check_spool_space is set, the check is for thismessage_size_limit
4764       plus the current message - i.e. we accept the message only if it won't
4765       reduce the space below the threshold. Add 5000 to the size to allow for
4766       overheads such as the Received: line and storing of recipients, etc.
4767       By putting the check here, even when SIZE is not given, it allow VRFY
4768       and EXPN etc. to be used when space is short. */
4769
4770       if (!receive_check_fs(
4771            smtp_check_spool_space && message_size >= 0
4772               ? message_size + 5000 : 0))
4773         {
4774         smtp_printf("452 Space shortage, please try later\r\n", SP_NO_MORE);
4775         sender_address = NULL;
4776         break;
4777         }
4778
4779       /* If sender_address is unqualified, reject it, unless this is a locally
4780       generated message, or the sending host or net is permitted to send
4781       unqualified addresses - typically local machines behaving as MUAs -
4782       in which case just qualify the address. The flag is set above at the start
4783       of the SMTP connection. */
4784
4785       if (!sender_domain && *sender_address)
4786         if (f.allow_unqualified_sender)
4787           {
4788           sender_domain = Ustrlen(sender_address) + 1;
4789           /* deconst ok as sender_address was not const */
4790           sender_address = US rewrite_address_qualify(sender_address, FALSE);
4791           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
4792             raw_sender);
4793           }
4794         else
4795           {
4796           smtp_printf("501 %s: sender address must contain a domain\r\n", SP_NO_MORE,
4797             smtp_cmd_data);
4798           log_write(L_smtp_syntax_error,
4799             LOG_MAIN|LOG_REJECT,
4800             "unqualified sender rejected: <%s> %s%s",
4801             raw_sender,
4802             host_and_ident(TRUE),
4803             host_lookup_msg);
4804           sender_address = NULL;
4805           break;
4806           }
4807
4808       /* Apply an ACL check if one is defined, before responding. Afterwards,
4809       when pipelining is not advertised, do another sync check in case the ACL
4810       delayed and the client started sending in the meantime. */
4811
4812       GET_OPTION("acl_smtp_mail");
4813       if (acl_smtp_mail)
4814         {
4815         rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
4816         if (rc == OK && !f.smtp_in_pipelining_advertised && !check_sync())
4817           goto SYNC_FAILURE;
4818         }
4819       else
4820         rc = OK;
4821
4822       if (rc == OK || rc == DISCARD)
4823         {
4824         BOOL more = pipeline_response();
4825
4826         if (!user_msg)
4827           smtp_printf("%s%s%s", more, US"250 OK",
4828                     #ifndef DISABLE_PRDR
4829                       prdr_requested ? US", PRDR Requested" : US"",
4830                     #else
4831                       US"",
4832                     #endif
4833                       US"\r\n");
4834         else
4835           {
4836         #ifndef DISABLE_PRDR
4837           if (prdr_requested)
4838              user_msg = string_sprintf("%s%s", user_msg, US", PRDR Requested");
4839         #endif
4840           smtp_user_msg(US"250", user_msg);
4841           }
4842         smtp_delay_rcpt = smtp_rlr_base;
4843         f.recipients_discarded = (rc == DISCARD);
4844         was_rej_mail = FALSE;
4845         }
4846       else
4847         {
4848         done = smtp_handle_acl_fail(ACL_WHERE_MAIL, rc, user_msg, log_msg);
4849         sender_address = NULL;
4850         }
4851       break;
4852
4853
4854     /* The RCPT command requires an address as an operand. There may be any
4855     number of RCPT commands, specifying multiple recipients. We build them all
4856     into a data structure. The start/end values given by parse_extract_address
4857     are not used, as we keep only the extracted address. */
4858
4859     case RCPT_CMD:
4860       HAD(SCH_RCPT);
4861       /* We got really to many recipients. A check against configured
4862       limits is done later */
4863       if (rcpt_count < 0 || rcpt_count >= INT_MAX/2)
4864         log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Too many recipients: %d", rcpt_count);
4865       rcpt_count++;
4866       was_rcpt = fl.rcpt_in_progress = TRUE;
4867
4868       /* There must be a sender address; if the sender was rejected and
4869       pipelining was advertised, we assume the client was pipelining, and do not
4870       count this as a protocol error. Reset was_rej_mail so that further RCPTs
4871       get the same treatment. */
4872
4873       if (!sender_address)
4874         {
4875         if (f.smtp_in_pipelining_advertised && last_was_rej_mail)
4876           {
4877           smtp_printf("503 sender not yet given\r\n", SP_NO_MORE);
4878           was_rej_mail = TRUE;
4879           }
4880         else
4881           {
4882           done = synprot_error(L_smtp_protocol_error, 503, NULL,
4883             US"sender not yet given");
4884           was_rcpt = FALSE;             /* Not a valid RCPT */
4885           }
4886         rcpt_fail_count++;
4887         break;
4888         }
4889
4890       /* Check for an operand */
4891
4892       if (!smtp_cmd_data[0])
4893         {
4894         done = synprot_error(L_smtp_syntax_error, 501, NULL,
4895           US"RCPT must have an address operand");
4896         rcpt_fail_count++;
4897         break;
4898         }
4899
4900       /* Set the DSN flags orcpt and dsn_flags from the session*/
4901       orcpt = NULL;
4902       dsn_flags = 0;
4903
4904       if (fl.esmtp) for(;;)
4905         {
4906         uschar *name, *value;
4907
4908         if (!extract_option(&name, &value))
4909           break;
4910
4911         if (fl.dsn_advertised && strcmpic(name, US"ORCPT") == 0)
4912           {
4913           /* Check whether orcpt has been already set */
4914           if (orcpt)
4915             {
4916             done = synprot_error(L_smtp_syntax_error, 501, NULL,
4917               US"ORCPT can be specified once only");
4918             goto COMMAND_LOOP;
4919             }
4920           orcpt = string_copy(value);
4921           DEBUG(D_receive) debug_printf("DSN orcpt: %s\n", orcpt);
4922           }
4923
4924         else if (fl.dsn_advertised && strcmpic(name, US"NOTIFY") == 0)
4925           {
4926           /* Check if the notify flags have been already set */
4927           if (dsn_flags > 0)
4928             {
4929             done = synprot_error(L_smtp_syntax_error, 501, NULL,
4930                 US"NOTIFY can be specified once only");
4931             goto COMMAND_LOOP;
4932             }
4933           if (strcmpic(value, US"NEVER") == 0)
4934             dsn_flags |= rf_notify_never;
4935           else
4936             {
4937             uschar *p = value;
4938             while (*p != 0)
4939               {
4940               uschar *pp = p;
4941               while (*pp != 0 && *pp != ',') pp++;
4942               if (*pp == ',') *pp++ = 0;
4943               if (strcmpic(p, US"SUCCESS") == 0)
4944                 {
4945                 DEBUG(D_receive) debug_printf("DSN: Setting notify success\n");
4946                 dsn_flags |= rf_notify_success;
4947                 }
4948               else if (strcmpic(p, US"FAILURE") == 0)
4949                 {
4950                 DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n");
4951                 dsn_flags |= rf_notify_failure;
4952                 }
4953               else if (strcmpic(p, US"DELAY") == 0)
4954                 {
4955                 DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n");
4956                 dsn_flags |= rf_notify_delay;
4957                 }
4958               else
4959                 {
4960                 /* Catch any strange values */
4961                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4962                   US"Invalid value for NOTIFY parameter");
4963                 goto COMMAND_LOOP;
4964                 }
4965               p = pp;
4966               }
4967               DEBUG(D_receive) debug_printf("DSN Flags: %x\n", dsn_flags);
4968             }
4969           }
4970
4971         /* Unknown option. Stick back the terminator characters and break
4972         the loop. An error for a malformed address will occur. */
4973
4974         else
4975           {
4976           DEBUG(D_receive) debug_printf("Invalid RCPT option: %s : %s\n", name, value);
4977           name[-1] = ' ';
4978           value[-1] = '=';
4979           break;
4980           }
4981         }
4982
4983       /* Apply SMTP rewriting then extract the working address. Don't allow "<>"
4984       as a recipient address */
4985
4986       recipient = rewrite_existflags & rewrite_smtp
4987         /* deconst ok as smtp_cmd_data was not const */
4988         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4989             global_rewrite_rules)
4990         : smtp_cmd_data;
4991
4992       if (!(recipient = parse_extract_address(recipient, &errmess, &start, &end,
4993         &recipient_domain, FALSE)))
4994         {
4995         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4996         rcpt_fail_count++;
4997         break;
4998         }
4999
5000       /* If the recipient address is unqualified, reject it, unless this is a
5001       locally generated message. However, unqualified addresses are permitted
5002       from a configured list of hosts and nets - typically when behaving as
5003       MUAs rather than MTAs. Sad that SMTP is used for both types of traffic,
5004       really. The flag is set at the start of the SMTP connection.
5005
5006       RFC 1123 talks about supporting "the reserved mailbox postmaster"; I always
5007       assumed this meant "reserved local part", but the revision of RFC 821 and
5008       friends now makes it absolutely clear that it means *mailbox*. Consequently
5009       we must always qualify this address, regardless. */
5010
5011       if (!recipient_domain)
5012         if (!(recipient_domain = qualify_recipient(&recipient, smtp_cmd_data,
5013                                     US"recipient")))
5014           {
5015           rcpt_fail_count++;
5016           break;
5017           }
5018
5019       /* Check maximum allowed */
5020
5021       if (  rcpt_count+1 < 0
5022          || rcpt_count > recipients_max_expanded && recipients_max_expanded > 0)
5023         {
5024         if (recipients_max_reject)
5025           {
5026           rcpt_fail_count++;
5027           smtp_printf("552 too many recipients\r\n", SP_NO_MORE);
5028           if (!toomany)
5029             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: message "
5030               "rejected: sender=<%s> %s", sender_address, host_and_ident(TRUE));
5031           }
5032         else
5033           {
5034           rcpt_defer_count++;
5035           smtp_printf("452 too many recipients\r\n", SP_NO_MORE);
5036           if (!toomany)
5037             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: excess "
5038               "temporarily rejected: sender=<%s> %s", sender_address,
5039               host_and_ident(TRUE));
5040           }
5041
5042         toomany = TRUE;
5043         break;
5044         }
5045
5046       /* If we have passed the threshold for rate limiting, apply the current
5047       delay, and update it for next time, provided this is a limited host. */
5048
5049       if (rcpt_count > smtp_rlr_threshold &&
5050           verify_check_host(&smtp_ratelimit_hosts) == OK)
5051         {
5052         DEBUG(D_receive) debug_printf("rate limit RCPT: delay %.3g sec\n",
5053           smtp_delay_rcpt/1000.0);
5054         millisleep((int)smtp_delay_rcpt);
5055         smtp_delay_rcpt *= smtp_rlr_factor;
5056         if (smtp_delay_rcpt > (double)smtp_rlr_limit)
5057           smtp_delay_rcpt = (double)smtp_rlr_limit;
5058         }
5059
5060       /* If the MAIL ACL discarded all the recipients, we bypass ACL checking
5061       for them. Otherwise, check the access control list for this recipient. As
5062       there may be a delay in this, re-check for a synchronization error
5063       afterwards, unless pipelining was advertised. */
5064
5065       if (f.recipients_discarded)
5066         rc = DISCARD;
5067       else
5068         {
5069         GET_OPTION("acl_smtp_rcpt");
5070         if (  (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
5071                       &log_msg)) == OK
5072            && !f.smtp_in_pipelining_advertised && !check_sync())
5073           goto SYNC_FAILURE;
5074         }
5075
5076       /* The ACL was happy */
5077
5078       if (rc == OK)
5079         {
5080         BOOL more = pipeline_response();
5081
5082         if (user_msg)
5083           smtp_user_msg(US"250", user_msg);
5084         else
5085           smtp_printf("250 Accepted\r\n", more);
5086         receive_add_recipient(recipient, -1);
5087
5088         /* Set the dsn flags in the recipients_list */
5089         recipients_list[recipients_count-1].orcpt = orcpt;
5090         recipients_list[recipients_count-1].dsn_flags = dsn_flags;
5091
5092         /* DEBUG(D_receive) debug_printf("DSN: orcpt: %s  flags: %d\n",
5093           recipients_list[recipients_count-1].orcpt,
5094           recipients_list[recipients_count-1].dsn_flags); */
5095         }
5096
5097       /* The recipient was discarded */
5098
5099       else if (rc == DISCARD)
5100         {
5101         if (user_msg)
5102           smtp_user_msg(US"250", user_msg);
5103         else
5104           smtp_printf("250 Accepted\r\n", SP_NO_MORE);
5105         rcpt_fail_count++;
5106         discarded = TRUE;
5107         log_write(0, LOG_MAIN|LOG_REJECT, "%s F=<%s> RCPT %s: "
5108           "discarded by %s ACL%s%s", host_and_ident(TRUE),
5109           sender_address_unrewritten ? sender_address_unrewritten : sender_address,
5110           smtp_cmd_argument, f.recipients_discarded ? "MAIL" : "RCPT",
5111           log_msg ? US": " : US"", log_msg ? log_msg : US"");
5112         }
5113
5114       /* Either the ACL failed the address, or it was deferred. */
5115
5116       else
5117         {
5118         if (rc == FAIL) rcpt_fail_count++; else rcpt_defer_count++;
5119         done = smtp_handle_acl_fail(ACL_WHERE_RCPT, rc, user_msg, log_msg);
5120         }
5121       break;
5122
5123
5124     /* The DATA command is legal only if it follows successful MAIL FROM
5125     and RCPT TO commands. However, if pipelining is advertised, a bad DATA is
5126     not counted as a protocol error if it follows RCPT (which must have been
5127     rejected if there are no recipients.) This function is complete when a
5128     valid DATA command is encountered.
5129
5130     Note concerning the code used: RFC 2821 says this:
5131
5132      -  If there was no MAIL, or no RCPT, command, or all such commands
5133         were rejected, the server MAY return a "command out of sequence"
5134         (503) or "no valid recipients" (554) reply in response to the
5135         DATA command.
5136
5137     The example in the pipelining RFC 2920 uses 554, but I use 503 here
5138     because it is the same whether pipelining is in use or not.
5139
5140     If all the RCPT commands that precede DATA provoked the same error message
5141     (often indicating some kind of system error), it is helpful to include it
5142     with the DATA rejection (an idea suggested by Tony Finch). */
5143
5144     case BDAT_CMD:
5145       {
5146       int n;
5147
5148       HAD(SCH_BDAT);
5149       if (chunking_state != CHUNKING_OFFERED)
5150         {
5151         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5152           US"BDAT command used when CHUNKING not advertised");
5153         break;
5154         }
5155
5156       /* grab size, endmarker */
5157
5158       if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5159         {
5160         done = synprot_error(L_smtp_protocol_error, 501, NULL,
5161           US"missing size for BDAT command");
5162         break;
5163         }
5164       chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
5165         ? CHUNKING_LAST : CHUNKING_ACTIVE;
5166       chunking_data_left = chunking_datasize;
5167       DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
5168                                     (int)chunking_state, chunking_data_left);
5169
5170       f.bdat_readers_wanted = TRUE; /* FIXME: redundant vs chunking_state? */
5171       f.dot_ends = FALSE;
5172
5173       goto DATA_BDAT;
5174       }
5175
5176     case DATA_CMD:
5177       HAD(SCH_DATA);
5178       f.dot_ends = TRUE;
5179       f.bdat_readers_wanted = FALSE;
5180
5181     DATA_BDAT:          /* Common code for DATA and BDAT */
5182 #ifndef DISABLE_PIPE_CONNECT
5183       fl.pipe_connect_acceptable = FALSE;
5184 #endif
5185       if (!discarded && recipients_count <= 0)
5186         {
5187         if (fl.rcpt_smtp_response_same && rcpt_smtp_response)
5188           {
5189           uschar *code = US"503";
5190           int len = Ustrlen(rcpt_smtp_response);
5191           smtp_respond(code, 3, SR_NOT_FINAL, US"All RCPT commands were rejected with "
5192             "this error:");
5193           /* Responses from smtp_printf() will have \r\n on the end */
5194           if (len > 2 && rcpt_smtp_response[len-2] == '\r')
5195             rcpt_smtp_response[len-2] = 0;
5196           smtp_respond(code, 3, SR_NOT_FINAL, rcpt_smtp_response);
5197           }
5198         if (f.smtp_in_pipelining_advertised && last_was_rcpt)
5199           smtp_printf("503 Valid RCPT command must precede %s\r\n", SP_NO_MORE,
5200             smtp_names[smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)]]);
5201         else
5202           done = synprot_error(L_smtp_protocol_error, 503, NULL,
5203             smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)] == SCH_DATA
5204             ? US"valid RCPT command must precede DATA"
5205             : US"valid RCPT command must precede BDAT");
5206
5207         if (chunking_state > CHUNKING_OFFERED)
5208           {
5209           bdat_push_receive_functions();
5210           bdat_flush_data();
5211           }
5212         break;
5213         }
5214
5215       if (toomany && recipients_max_reject)
5216         {
5217         sender_address = NULL;  /* This will allow a new MAIL without RSET */
5218         sender_address_unrewritten = NULL;
5219         smtp_printf("554 Too many recipients\r\n", SP_NO_MORE);
5220
5221         if (chunking_state > CHUNKING_OFFERED)
5222           {
5223           bdat_push_receive_functions();
5224           bdat_flush_data();
5225           }
5226         break;
5227         }
5228
5229       if (chunking_state > CHUNKING_OFFERED)
5230         rc = OK;        /* There is no predata ACL or go-ahead output for BDAT */
5231       else
5232         {
5233         /* If there is a predata-ACL, re-check the synchronization afterwards,
5234         since the ACL may have delayed.  To handle cutthrough delivery enforce a
5235         dummy call to get the DATA command sent. */
5236
5237         GET_OPTION("acl_smtp_predata");
5238         if (!acl_smtp_predata && cutthrough.cctx.sock < 0)
5239           rc = OK;
5240         else
5241           {
5242           uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept";
5243           f.enable_dollar_recipients = TRUE;
5244           rc = acl_check(ACL_WHERE_PREDATA, NULL, acl, &user_msg,
5245             &log_msg);
5246           f.enable_dollar_recipients = FALSE;
5247           if (rc == OK && !check_sync())
5248             goto SYNC_FAILURE;
5249
5250           if (rc != OK)
5251             {   /* Either the ACL failed the address, or it was deferred. */
5252             done = smtp_handle_acl_fail(ACL_WHERE_PREDATA, rc, user_msg, log_msg);
5253             break;
5254             }
5255           }
5256
5257         if (user_msg)
5258           smtp_user_msg(US"354", user_msg);
5259         else
5260           smtp_printf(
5261             "354 Enter message, ending with \".\" on a line by itself\r\n", SP_NO_MORE);
5262         }
5263
5264       if (f.bdat_readers_wanted)
5265         bdat_push_receive_functions();
5266
5267 #ifdef TCP_QUICKACK
5268       if (smtp_in)      /* all ACKs needed to ramp window up for bulk data */
5269         (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
5270                 US &on, sizeof(on));
5271 #endif
5272       done = 3;
5273       message_ended = END_NOTENDED;   /* Indicate in middle of data */
5274
5275       break;
5276
5277
5278     case VRFY_CMD:
5279       {
5280       uschar * address;
5281
5282       HAD(SCH_VRFY);
5283
5284       if (!(address = parse_extract_address(smtp_cmd_data, &errmess,
5285             &start, &end, &recipient_domain, FALSE)))
5286         {
5287         smtp_printf("501 %s\r\n", SP_NO_MORE, errmess);
5288         break;
5289         }
5290
5291       if (!recipient_domain)
5292         if (!(recipient_domain = qualify_recipient(&address, smtp_cmd_data,
5293                                     US"verify")))
5294           break;
5295
5296       GET_OPTION("acl_smtp_vrfy");
5297       if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
5298                     &user_msg, &log_msg)) != OK)
5299         done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
5300       else
5301         {
5302         uschar * s = NULL;
5303         address_item * addr = deliver_make_addr(address, FALSE);
5304
5305         switch(verify_address(addr, NULL, vopt_is_recipient | vopt_qualify, -1,
5306                -1, -1, NULL, NULL, NULL))
5307           {
5308           case OK:
5309             s = string_sprintf("250 <%s> is deliverable", address);
5310             break;
5311
5312           case DEFER:
5313             s = (addr->user_message != NULL)?
5314               string_sprintf("451 <%s> %s", address, addr->user_message) :
5315               string_sprintf("451 Cannot resolve <%s> at this time", address);
5316             break;
5317
5318           case FAIL:
5319             s = (addr->user_message != NULL)?
5320               string_sprintf("550 <%s> %s", address, addr->user_message) :
5321               string_sprintf("550 <%s> is not deliverable", address);
5322             log_write(0, LOG_MAIN, "VRFY failed for %s %s",
5323               smtp_cmd_argument, host_and_ident(TRUE));
5324             break;
5325           }
5326
5327         smtp_printf("%s\r\n", SP_NO_MORE, s);
5328         }
5329       break;
5330       }
5331
5332
5333     case EXPN_CMD:
5334       HAD(SCH_EXPN);
5335       GET_OPTION("acl_smtp_expn");
5336       rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
5337       if (rc != OK)
5338         done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
5339       else
5340         {
5341         BOOL save_log_testing_mode = f.log_testing_mode;
5342         f.address_test_mode = f.log_testing_mode = TRUE;
5343         (void) verify_address(deliver_make_addr(smtp_cmd_data, FALSE),
5344           smtp_out, vopt_is_recipient | vopt_qualify | vopt_expn, -1, -1, -1,
5345           NULL, NULL, NULL);
5346         f.address_test_mode = FALSE;
5347         f.log_testing_mode = save_log_testing_mode;    /* true for -bh */
5348         }
5349       break;
5350
5351
5352     #ifndef DISABLE_TLS
5353
5354     case STARTTLS_CMD:
5355       HAD(SCH_STARTTLS);
5356       if (!fl.tls_advertised)
5357         {
5358         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5359           US"STARTTLS command used when not advertised");
5360         break;
5361         }
5362
5363       /* Apply an ACL check if one is defined */
5364
5365       GET_OPTION("acl_smtp_starttls");
5366       if (  acl_smtp_starttls
5367          && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
5368                     &user_msg, &log_msg)) != OK
5369          )
5370         {
5371         done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg);
5372         break;
5373         }
5374
5375       /* RFC 2487 is not clear on when this command may be sent, though it
5376       does state that all information previously obtained from the client
5377       must be discarded if a TLS session is started. It seems reasonable to
5378       do an implied RSET when STARTTLS is received. */
5379
5380       incomplete_transaction_log(US"STARTTLS");
5381       cancel_cutthrough_connection(TRUE, US"STARTTLS received");
5382       reset_point = smtp_reset(reset_point);
5383       toomany = FALSE;
5384       cmd_list[CL_STLS].is_mail_cmd = FALSE;
5385
5386       /* There's an attack where more data is read in past the STARTTLS command
5387       before TLS is negotiated, then assumed to be part of the secure session
5388       when used afterwards; we use segregated input buffers, so are not
5389       vulnerable, but we want to note when it happens and, for sheer paranoia,
5390       ensure that the buffer is "wiped".
5391       Pipelining sync checks will normally have protected us too, unless disabled
5392       by configuration. */
5393
5394       if (receive_hasc())
5395         {
5396         DEBUG(D_any)
5397           debug_printf("Non-empty input buffer after STARTTLS; naive attack?\n");
5398         if (tls_in.active.sock < 0)
5399           smtp_inend = smtp_inptr = smtp_inbuffer;
5400         /* and if TLS is already active, tls_server_start() should fail */
5401         }
5402
5403       /* There is nothing we value in the input buffer and if TLS is successfully
5404       negotiated, we won't use this buffer again; if TLS fails, we'll just read
5405       fresh content into it.  The buffer contains arbitrary content from an
5406       untrusted remote source; eg: NOOP <shellcode>\r\nSTARTTLS\r\n
5407       It seems safest to just wipe away the content rather than leave it as a
5408       target to jump to. */
5409
5410       memset(smtp_inbuffer, 0, IN_BUFFER_SIZE);
5411
5412       /* Attempt to start up a TLS session, and if successful, discard all
5413       knowledge that was obtained previously. At least, that's what the RFC says,
5414       and that's what happens by default. However, in order to work round YAEB,
5415       there is an option to remember the esmtp state. Sigh.
5416
5417       We must allow for an extra EHLO command and an extra AUTH command after
5418       STARTTLS that don't add to the nonmail command count. */
5419
5420       s = NULL;
5421       if ((rc = tls_server_start(&s)) == OK)
5422         {
5423         if (!tls_remember_esmtp)
5424           fl.helo_seen = fl.esmtp = fl.auth_advertised = f.smtp_in_pipelining_advertised = FALSE;
5425         cmd_list[CL_EHLO].is_mail_cmd = TRUE;
5426         cmd_list[CL_AUTH].is_mail_cmd = TRUE;
5427         cmd_list[CL_TLAU].is_mail_cmd = TRUE;
5428         if (sender_helo_name)
5429           {
5430           sender_helo_name = NULL;
5431           host_build_sender_fullhost();  /* Rebuild */
5432           set_process_info("handling incoming TLS connection from %s",
5433             host_and_ident(FALSE));
5434           }
5435         received_protocol =
5436           (sender_host_address ? protocols : protocols_local)
5437             [ (fl.esmtp
5438               ? pextend + (sender_host_authenticated ? pauthed : 0)
5439               : pnormal)
5440             + (tls_in.active.sock >= 0 ? pcrpted : 0)
5441             ];
5442
5443         sender_host_auth_pubname = sender_host_authenticated = NULL;
5444         authenticated_id = NULL;
5445         sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
5446         DEBUG(D_tls) debug_printf("TLS active\n");
5447         break;     /* Successful STARTTLS */
5448         }
5449       else
5450         (void) smtp_log_tls_fail(s);
5451
5452       /* Some local configuration problem was discovered before actually trying
5453       to do a TLS handshake; give a temporary error. */
5454
5455       if (rc == DEFER)
5456         {
5457         smtp_printf("454 TLS currently unavailable\r\n", SP_NO_MORE);
5458         break;
5459         }
5460
5461       /* Hard failure. Reject everything except QUIT or closed connection. One
5462       cause for failure is a nested STARTTLS, in which case tls_in.active remains
5463       set, but we must still reject all incoming commands.  Another is a handshake
5464       failure - and there may some encrypted data still in the pipe to us, which we
5465       see as garbage commands. */
5466
5467       DEBUG(D_tls) debug_printf("TLS failed to start\n");
5468       while (done <= 0) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
5469         {
5470         case EOF_CMD:
5471           log_close_event(US"by EOF");
5472           smtp_notquit_exit(US"tls-failed", NULL, NULL);
5473           done = 2;
5474           break;
5475
5476         /* It is perhaps arguable as to which exit ACL should be called here,
5477         but as it is probably a situation that almost never arises, it
5478         probably doesn't matter. We choose to call the real QUIT ACL, which in
5479         some sense is perhaps "right". */
5480
5481         case QUIT_CMD:
5482           f.smtp_in_quit = TRUE;
5483           user_msg = NULL;
5484           GET_OPTION("acl_smtp_quit");
5485           if (  acl_smtp_quit
5486              && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
5487                                 &log_msg)) == ERROR))
5488               log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
5489                 log_msg);
5490           if (user_msg)
5491             smtp_respond(US"221", 3, SR_FINAL, user_msg);
5492           else
5493             smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
5494           log_close_event(US"by QUIT");
5495           done = 2;
5496           break;
5497
5498         default:
5499           smtp_printf("554 Security failure\r\n", SP_NO_MORE);
5500           break;
5501         }
5502       tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
5503       break;
5504     #endif
5505
5506
5507     /* The ACL for QUIT is provided for gathering statistical information or
5508     similar; it does not affect the response code, but it can supply a custom
5509     message. */
5510
5511     case QUIT_CMD:
5512       smtp_quit_handler(&user_msg, &log_msg);
5513       done = 2;
5514       break;
5515
5516
5517     case RSET_CMD:
5518       smtp_rset_handler();
5519       cancel_cutthrough_connection(TRUE, US"RSET received");
5520       reset_point = smtp_reset(reset_point);
5521       toomany = FALSE;
5522       break;
5523
5524
5525     case NOOP_CMD:
5526       HAD(SCH_NOOP);
5527       smtp_printf("250 OK\r\n", SP_NO_MORE);
5528       break;
5529
5530
5531     /* Show ETRN/EXPN/VRFY if there's an ACL for checking hosts; if actually
5532     used, a check will be done for permitted hosts. Show STARTTLS only if not
5533     already in a TLS session and if it would be advertised in the EHLO
5534     response. */
5535
5536     case HELP_CMD:
5537       HAD(SCH_HELP);
5538       smtp_printf("214-Commands supported:\r\n214", SP_MORE);
5539       smtp_printf(" AUTH", SP_MORE);
5540 #ifndef DISABLE_TLS
5541       if (tls_in.active.sock < 0 &&
5542           verify_check_host(&tls_advertise_hosts) != FAIL)
5543         smtp_printf(" STARTTLS", SP_MORE);
5544 #endif
5545       smtp_printf(" HELO EHLO MAIL RCPT DATA BDAT", SP_MORE);
5546       smtp_printf(" NOOP QUIT RSET HELP", SP_MORE);
5547       if (acl_smtp_atrn) smtp_printf(" ATRN", SP_MORE);
5548       if (acl_smtp_etrn) smtp_printf(" ETRN", SP_MORE);
5549       if (acl_smtp_expn) smtp_printf(" EXPN", SP_MORE);
5550       if (acl_smtp_vrfy) smtp_printf(" VRFY", SP_MORE);
5551 #ifndef DISABLE_WELLKNOWN
5552       if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
5553         smtp_printf(" WELLKNOWN", SP_MORE);
5554 #endif
5555 #ifdef EXPERIMENTAL_XCLIENT
5556       if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
5557         smtp_printf(" XCLIENT", SP_MORE);
5558 #endif
5559       smtp_printf("\r\n", SP_NO_MORE);
5560       break;
5561
5562
5563     case EOF_CMD:
5564       incomplete_transaction_log(US"connection lost");
5565       smtp_notquit_exit(US"connection-lost", US"421",
5566         US"%s lost input connection", smtp_active_hostname);
5567
5568       /* Don't log by default unless in the middle of a message, as some mailers
5569       just drop the call rather than sending QUIT, and it clutters up the logs.
5570       */
5571
5572       if (sender_address || recipients_count > 0)
5573         log_write(L_lost_incoming_connection, LOG_MAIN,
5574           "unexpected %s while reading SMTP command from %s%s%s D=%s",
5575           f.sender_host_unknown ? "EOF" : "disconnection",
5576           f.tcp_in_fastopen_logged
5577           ? US""
5578           : f.tcp_in_fastopen
5579           ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO "
5580           : US"",
5581           host_and_ident(FALSE), smtp_read_error,
5582           string_timesince(&smtp_connection_start)
5583           );
5584
5585       else
5586         log_write(L_smtp_connection, LOG_MAIN, "%s %slost%s D=%s",
5587           smtp_get_connection_info(),
5588           f.tcp_in_fastopen && !f.tcp_in_fastopen_logged ? US"TFO " : US"",
5589           smtp_read_error,
5590           string_timesince(&smtp_connection_start)
5591           );
5592
5593       done = 1;
5594       break;
5595
5596
5597     case ATRN_CMD:
5598       HAD(SCH_ATRN);
5599       done = atrn_handle_provider(&user_msg, &log_msg); /* Normal: exit() */
5600       break;                                            /* Error cases */
5601
5602     case ETRN_CMD:
5603       HAD(SCH_ETRN);
5604       if (sender_address)
5605         {
5606         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5607           US"ETRN is not permitted inside a transaction");
5608         break;
5609         }
5610
5611       log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
5612         host_and_ident(FALSE));
5613
5614       GET_OPTION("acl_smtp_etrn");
5615       if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
5616                   &user_msg, &log_msg)) != OK)
5617         {
5618         done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg);
5619         break;
5620         }
5621
5622       /* Compute the serialization key for this command. */
5623
5624       etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
5625
5626       /* If a command has been specified for running as a result of ETRN, we
5627       permit any argument to ETRN. If not, only the # standard form is permitted,
5628       since that is strictly the only kind of ETRN that can be implemented
5629       according to the RFC. */
5630
5631       GET_OPTION("smtp_etrn_command");
5632       if (smtp_etrn_command)
5633         {
5634         uschar *error;
5635         BOOL rc;
5636         etrn_command = smtp_etrn_command;
5637         deliver_domain = smtp_cmd_data;
5638         rc = transport_set_up_command(&argv, smtp_etrn_command, TSUC_EXPAND_ARGS, 0, NULL,
5639           US"ETRN processing", &error);
5640         deliver_domain = NULL;
5641         if (!rc)
5642           {
5643           log_write(0, LOG_MAIN|LOG_PANIC, "failed to set up ETRN command: %s",
5644             error);
5645           smtp_printf("458 Internal failure\r\n", SP_NO_MORE);
5646           break;
5647           }
5648         }
5649
5650       /* Else set up to call Exim with the -R option. */
5651
5652       else
5653         {
5654         if (*smtp_cmd_data++ != '#')
5655           {
5656           done = synprot_error(L_smtp_syntax_error, 501, NULL,
5657             US"argument must begin with #");
5658           break;
5659           }
5660         etrn_command = US"exim -R";
5661         argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE,
5662           *queue_name ? 4 : 2,
5663           US"-R", smtp_cmd_data,
5664           US"-MCG", queue_name);
5665         }
5666
5667       /* If we are host-testing, don't actually do anything. */
5668
5669       if (host_checking)
5670         {
5671         HDEBUG(D_any)
5672           {
5673           debug_printf("ETRN command is: %s\n", etrn_command);
5674           debug_printf("ETRN command execution skipped\n");
5675           }
5676         if (user_msg == NULL) smtp_printf("250 OK\r\n", SP_NO_MORE);
5677           else smtp_user_msg(US"250", user_msg);
5678         break;
5679         }
5680
5681
5682       /* If ETRN queue runs are to be serialized, check the database to
5683       ensure one isn't already running. */
5684
5685       if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
5686         {
5687         smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
5688         break;
5689         }
5690
5691       /* Fork a child process and run the command. We don't want to have to
5692       wait for the process at any point, so set SIGCHLD to SIG_IGN before
5693       forking. It should be set that way anyway for external incoming SMTP,
5694       but we save and restore to be tidy. If serialization is required, we
5695       actually run the command in yet another process, so we can wait for it
5696       to complete and then remove the serialization lock. */
5697
5698       oldsignal = signal(SIGCHLD, SIG_IGN);
5699
5700       if ((pid = exim_fork(US"etrn-command")) == 0)
5701         {
5702         smtp_input = FALSE;       /* This process is not associated with the */
5703         (void)fclose(smtp_in);    /* SMTP call any more. */
5704         (void)fclose(smtp_out);
5705
5706         signal(SIGCHLD, SIG_DFL);      /* Want to catch child */
5707
5708         /* If not serializing, do the exec right away. Otherwise, fork down
5709         into another process. */
5710
5711         if (  !smtp_etrn_serialize
5712            || (pid = exim_fork(US"etrn-serialised-command")) == 0)
5713           {
5714           DEBUG(D_exec) debug_print_argv(argv);
5715           exim_nullstd();                   /* Ensure std{in,out,err} exist */
5716           /* argv[0] should be untainted, from child_exec_exim() */
5717           execv(CS argv[0], (char *const *)argv);
5718           log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
5719             etrn_command, strerror(errno));
5720           _exit(EXIT_FAILURE);         /* paranoia */
5721           }
5722
5723         /* Obey this if smtp_serialize and the 2nd fork yielded non-zero. That
5724         is, we are in the first subprocess, after forking again. All we can do
5725         for a failing fork is to log it. Otherwise, wait for the 2nd process to
5726         complete, before removing the serialization. */
5727
5728         if (pid < 0)
5729           log_write(0, LOG_MAIN|LOG_PANIC, "2nd fork for serialized ETRN "
5730             "failed: %s", strerror(errno));
5731         else
5732           {
5733           int status;
5734           DEBUG(D_any) debug_printf("waiting for serialized ETRN process %d\n",
5735             (int)pid);
5736           (void)wait(&status);
5737           DEBUG(D_any) debug_printf("serialized ETRN process %d ended\n",
5738             (int)pid);
5739           }
5740
5741         enq_end(etrn_serialize_key);
5742         exim_underbar_exit(EXIT_SUCCESS);
5743         }
5744
5745       /* Back in the top level SMTP process. Check that we started a subprocess
5746       and restore the signal state. */
5747
5748       if (pid < 0)
5749         {
5750         log_write(0, LOG_MAIN|LOG_PANIC, "fork of process for ETRN failed: %s",
5751           strerror(errno));
5752         smtp_printf("458 Unable to fork process\r\n", SP_NO_MORE);
5753         if (smtp_etrn_serialize) enq_end(etrn_serialize_key);
5754         }
5755       else
5756         if (!user_msg)
5757           smtp_printf("250 OK\r\n", SP_NO_MORE);
5758         else
5759           smtp_user_msg(US"250", user_msg);
5760
5761       signal(SIGCHLD, oldsignal);
5762       break;
5763
5764
5765     case BADARG_CMD:
5766       done = synprot_error(L_smtp_syntax_error, 501, NULL,
5767         US"unexpected argument data");
5768       break;
5769
5770
5771     /* This currently happens only for NULLs, but could be extended. */
5772
5773     case BADCHAR_CMD:
5774       done = synprot_error(L_smtp_syntax_error, 0, NULL,       /* Just logs */
5775         US"NUL character(s) present (shown as '?')");
5776       smtp_printf("501 NUL characters are not allowed in SMTP commands\r\n",
5777                   SP_NO_MORE);
5778       break;
5779
5780
5781     case BADSYN_CMD:
5782     SYNC_FAILURE:
5783       {
5784         unsigned nchars = 150;
5785         uschar * buf = receive_getbuf(&nchars);         /* destructive read */
5786         buf[nchars] = '\0';
5787         incomplete_transaction_log(US"sync failure");
5788         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
5789           "(next input sent too soon: pipelining was%s advertised): "
5790           "rejected \"%s\" %s next input=\"%s\" (%u bytes)",
5791           f.smtp_in_pipelining_advertised ? "" : " not",
5792           smtp_cmd_buffer, host_and_ident(TRUE),
5793           string_printing(buf), nchars);
5794         smtp_notquit_exit(US"synchronization-error", US"554",
5795           US"SMTP synchronization error");
5796         done = 1;   /* Pretend eof - drops connection */
5797         break;
5798       }
5799
5800
5801     case TOO_MANY_NONMAIL_CMD:
5802       s = smtp_cmd_buffer;
5803       Uskip_nonwhite(&s);
5804       incomplete_transaction_log(US"too many non-mail commands");
5805       log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5806         "nonmail commands (last was \"%.*s\")",  host_and_ident(FALSE),
5807         (int)(s - smtp_cmd_buffer), smtp_cmd_buffer);
5808       smtp_notquit_exit(US"bad-commands", US"554", US"Too many nonmail commands");
5809       done = 1;   /* Pretend eof - drops connection */
5810       break;
5811
5812 #ifdef SUPPORT_PROXY
5813     case PROXY_FAIL_IGNORE_CMD:
5814       smtp_printf("503 Command refused, required Proxy negotiation failed\r\n", SP_NO_MORE);
5815       break;
5816 #endif
5817
5818     default:
5819       if (unknown_command_count++ >= smtp_max_unknown_commands)
5820         {
5821         log_write(L_smtp_syntax_error, LOG_MAIN,
5822           "SMTP syntax error in \"%s\" %s %s",
5823           string_printing(smtp_cmd_buffer), host_and_ident(TRUE),
5824           US"unrecognized command");
5825         incomplete_transaction_log(US"unrecognized command");
5826         smtp_notquit_exit(US"bad-commands", US"500",
5827           US"Too many unrecognized commands");
5828         done = 2;
5829         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5830           "unrecognized commands (last was \"%s\")", host_and_ident(FALSE),
5831           string_printing(smtp_cmd_buffer));
5832         }
5833       else
5834         done = synprot_error(L_smtp_syntax_error, 500, NULL,
5835           US"unrecognized command");
5836       break;
5837     }
5838
5839   /* This label is used by goto's inside loops that want to break out to
5840   the end of the command-processing loop. */
5841
5842   COMMAND_LOOP:
5843   last_was_rej_mail = was_rej_mail;     /* Remember some last commands for */
5844   last_was_rcpt = was_rcpt;             /* protocol error handling */
5845   }
5846
5847 return done - 2;  /* Convert yield values */
5848 }
5849
5850
5851
5852 gstring *
5853 authres_smtpauth(gstring * g)
5854 {
5855 if (!sender_host_authenticated)
5856   return g;
5857
5858 g = string_append(g, 2, US";\n\tauth=pass (", sender_host_auth_pubname);
5859
5860 if (Ustrcmp(sender_host_auth_pubname, "tls") == 0)
5861   g = authenticated_id
5862     ? string_append(g, 2, US") x509.auth=", authenticated_id)
5863     : string_cat(g, US") reason=x509.auth");
5864 else
5865   g = authenticated_id
5866     ? string_append(g, 2, US") smtp.auth=", authenticated_id)
5867     : string_cat(g, US", no id saved)");
5868
5869 if (authenticated_sender)
5870   g = string_append(g, 2, US" smtp.mailfrom=", authenticated_sender);
5871 return g;
5872 }
5873
5874
5875
5876 /* vi: aw ai sw=2
5877 */
5878 /* End of smtp_in.c */