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