Lookups: dsearch subdir with leading "..". Bug 2994
[exim.git] / src / src / smtp_in.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim Maintainers 2020 - 2023 */
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=%lu", 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 dkim_cur_signer = dkim_signers = dkim_signing_domain = dkim_signing_selector = NULL;
1692 f.dkim_disable_verify = FALSE;
1693 dkim_collect_input = 0;
1694 dkim_verify_overall = dkim_verify_status = dkim_verify_reason = NULL;
1695 dkim_key_length = 0;
1696 #endif
1697 #ifdef SUPPORT_DMARC
1698 f.dmarc_has_been_checked = f.dmarc_disable_verify = f.dmarc_enable_forensic = FALSE;
1699 dmarc_domain_policy = dmarc_status = dmarc_status_text =
1700 dmarc_used_domain = NULL;
1701 #endif
1702 #ifdef EXPERIMENTAL_ARC
1703 arc_state = arc_state_reason = NULL;
1704 arc_received_instance = 0;
1705 #endif
1706 dsn_ret = 0;
1707 dsn_envid = NULL;
1708 deliver_host = deliver_host_address = NULL;     /* Can be set by ACL */
1709 #ifndef DISABLE_PRDR
1710 prdr_requested = FALSE;
1711 #endif
1712 #ifdef SUPPORT_I18N
1713 message_smtputf8 = FALSE;
1714 #endif
1715 #ifdef WITH_CONTENT_SCAN
1716 regex_vars_clear();
1717 #endif
1718 body_linecount = body_zerocount = 0;
1719
1720 lookup_value = NULL;                            /* Can be set by ACL */
1721 sender_rate = sender_rate_limit = sender_rate_period = NULL;
1722 ratelimiters_mail = NULL;           /* Updated by ratelimit ACL condition */
1723                    /* Note that ratelimiters_conn persists across resets. */
1724
1725 /* Reset message ACL variables */
1726
1727 acl_var_m = NULL;
1728
1729 /* Warning log messages are saved in malloc store. They are saved to avoid
1730 repetition in the same message, but it seems right to repeat them for different
1731 messages. */
1732
1733 while (acl_warn_logged)
1734   {
1735   string_item *this = acl_warn_logged;
1736   acl_warn_logged = acl_warn_logged->next;
1737   store_free(this);
1738   }
1739
1740 message_tidyup();
1741 store_reset(reset_point);
1742
1743 message_start();
1744 return store_mark();
1745 }
1746
1747
1748
1749
1750
1751 /*************************************************
1752 *  Initialize for incoming batched SMTP message  *
1753 *************************************************/
1754
1755 /* This function is called from smtp_setup_msg() in the case when
1756 smtp_batched_input is true. This happens when -bS is used to pass a whole batch
1757 of messages in one file with SMTP commands between them. All errors must be
1758 reported by sending a message, and only MAIL FROM, RCPT TO, and DATA are
1759 relevant. After an error on a sender, or an invalid recipient, the remainder
1760 of the message is skipped. The value of received_protocol is already set.
1761
1762 Argument: none
1763 Returns:  > 0 message successfully started (reached DATA)
1764           = 0 QUIT read or end of file reached
1765           < 0 should not occur
1766 */
1767
1768 static int
1769 smtp_setup_batch_msg(void)
1770 {
1771 int done = 0;
1772 rmark reset_point = store_mark();
1773
1774 /* Save the line count at the start of each transaction - single commands
1775 like HELO and RSET count as whole transactions. */
1776
1777 bsmtp_transaction_linecount = receive_linecount;
1778
1779 if ((receive_feof)()) return 0;   /* Treat EOF as QUIT */
1780
1781 cancel_cutthrough_connection(TRUE, US"smtp_setup_batch_msg");
1782 reset_point = smtp_reset(reset_point);                /* Reset for start of message */
1783
1784 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
1785 value. The values are 2 larger than the required yield of the function. */
1786
1787 while (done <= 0)
1788   {
1789   uschar *errmess;
1790   uschar *recipient = NULL;
1791   int start, end, sender_domain, recipient_domain;
1792
1793   switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
1794     {
1795     /* The HELO/EHLO commands set sender_address_helo if they have
1796     valid data; otherwise they are ignored, except that they do
1797     a reset of the state. */
1798
1799     case HELO_CMD:
1800     case EHLO_CMD:
1801
1802       check_helo(smtp_cmd_data);
1803       /* Fall through */
1804
1805     case RSET_CMD:
1806       cancel_cutthrough_connection(TRUE, US"RSET received");
1807       reset_point = smtp_reset(reset_point);
1808       bsmtp_transaction_linecount = receive_linecount;
1809       break;
1810
1811     /* The MAIL FROM command requires an address as an operand. All we
1812     do here is to parse it for syntactic correctness. The form "<>" is
1813     a special case which converts into an empty string. The start/end
1814     pointers in the original are not used further for this address, as
1815     it is the canonical extracted address which is all that is kept. */
1816
1817     case MAIL_CMD:
1818       smtp_mailcmd_count++;              /* Count for no-mail log */
1819       if (sender_address)
1820         /* The function moan_smtp_batch() does not return. */
1821         moan_smtp_batch(smtp_cmd_buffer, "503 Sender already given");
1822
1823       if (smtp_cmd_data[0] == 0)
1824         /* The function moan_smtp_batch() does not return. */
1825         moan_smtp_batch(smtp_cmd_buffer, "501 MAIL FROM must have an address operand");
1826
1827       /* Reset to start of message */
1828
1829       cancel_cutthrough_connection(TRUE, US"MAIL received");
1830       reset_point = smtp_reset(reset_point);
1831
1832       /* Apply SMTP rewrite */
1833
1834       raw_sender = rewrite_existflags & rewrite_smtp
1835         /* deconst ok as smtp_cmd_data was not const */
1836         ? US rewrite_one(smtp_cmd_data, rewrite_smtp|rewrite_smtp_sender, NULL,
1837                       FALSE, US"", global_rewrite_rules)
1838         : smtp_cmd_data;
1839
1840       /* Extract the address; the TRUE flag allows <> as valid */
1841
1842       raw_sender =
1843         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
1844           TRUE);
1845
1846       if (!raw_sender)
1847         /* The function moan_smtp_batch() does not return. */
1848         moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
1849
1850       sender_address = string_copy(raw_sender);
1851
1852       /* Qualify unqualified sender addresses if permitted to do so. */
1853
1854       if (  !sender_domain
1855          && sender_address[0] != 0 && sender_address[0] != '@')
1856         if (f.allow_unqualified_sender)
1857           {
1858           /* deconst ok as sender_address was not const */
1859           sender_address = US rewrite_address_qualify(sender_address, FALSE);
1860           DEBUG(D_receive) debug_printf("unqualified address %s accepted "
1861             "and rewritten\n", raw_sender);
1862           }
1863         /* The function moan_smtp_batch() does not return. */
1864         else
1865           moan_smtp_batch(smtp_cmd_buffer, "501 sender address must contain "
1866             "a domain");
1867       break;
1868
1869
1870     /* The RCPT TO command requires an address as an operand. All we do
1871     here is to parse it for syntactic correctness. There may be any number
1872     of RCPT TO commands, specifying multiple senders. We build them all into
1873     a data structure that is in argc/argv format. The start/end values
1874     given by parse_extract_address are not used, as we keep only the
1875     extracted address. */
1876
1877     case RCPT_CMD:
1878       if (!sender_address)
1879         /* The function moan_smtp_batch() does not return. */
1880         moan_smtp_batch(smtp_cmd_buffer, "503 No sender yet given");
1881
1882       if (smtp_cmd_data[0] == 0)
1883         /* The function moan_smtp_batch() does not return. */
1884         moan_smtp_batch(smtp_cmd_buffer,
1885           "501 RCPT TO must have an address operand");
1886
1887       /* Check maximum number allowed */
1888
1889       if (  recipients_max_expanded > 0
1890          && recipients_count + 1 > recipients_max_expanded)
1891         /* The function moan_smtp_batch() does not return. */
1892         moan_smtp_batch(smtp_cmd_buffer, "%s too many recipients",
1893           recipients_max_reject ? "552": "452");
1894
1895       /* Apply SMTP rewrite, then extract address. Don't allow "<>" as a
1896       recipient address */
1897
1898       recipient = rewrite_existflags & rewrite_smtp
1899         /* deconst ok as smtp_cmd_data was not const */
1900         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
1901                       global_rewrite_rules)
1902         : smtp_cmd_data;
1903
1904       recipient = parse_extract_address(recipient, &errmess, &start, &end,
1905         &recipient_domain, FALSE);
1906
1907       if (!recipient)
1908         /* The function moan_smtp_batch() does not return. */
1909         moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
1910
1911       /* If the recipient address is unqualified, qualify it if permitted. Then
1912       add it to the list of recipients. */
1913
1914       if (!recipient_domain)
1915         if (f.allow_unqualified_recipient)
1916           {
1917           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
1918             recipient);
1919           /* deconst ok as recipient was not const */
1920           recipient = US rewrite_address_qualify(recipient, TRUE);
1921           }
1922         /* The function moan_smtp_batch() does not return. */
1923         else
1924           moan_smtp_batch(smtp_cmd_buffer,
1925             "501 recipient address must contain a domain");
1926
1927       receive_add_recipient(recipient, -1);
1928       break;
1929
1930
1931     /* The DATA command is legal only if it follows successful MAIL FROM
1932     and RCPT TO commands. This function is complete when a valid DATA
1933     command is encountered. */
1934
1935     case DATA_CMD:
1936       if (!sender_address || recipients_count <= 0)
1937         /* The function moan_smtp_batch() does not return. */
1938         if (!sender_address)
1939           moan_smtp_batch(smtp_cmd_buffer,
1940             "503 MAIL FROM:<sender> command must precede DATA");
1941         else
1942           moan_smtp_batch(smtp_cmd_buffer,
1943             "503 RCPT TO:<recipient> must precede DATA");
1944       else
1945         {
1946         done = 3;                      /* DATA successfully achieved */
1947         message_ended = END_NOTENDED;  /* Indicate in middle of message */
1948         }
1949       break;
1950
1951
1952     /* The VRFY, EXPN, HELP, ETRN, and NOOP commands are ignored. */
1953
1954     case VRFY_CMD:
1955     case EXPN_CMD:
1956     case HELP_CMD:
1957     case NOOP_CMD:
1958     case ETRN_CMD:
1959 #ifndef DISABLE_WELLKNOWN
1960     case WELLKNOWN_CMD:
1961 #endif
1962       bsmtp_transaction_linecount = receive_linecount;
1963       break;
1964
1965
1966     case QUIT_CMD:
1967       f.smtp_in_quit = TRUE;
1968     case EOF_CMD:
1969       done = 2;
1970       break;
1971
1972
1973     case BADARG_CMD:
1974       /* The function moan_smtp_batch() does not return. */
1975       moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected argument data");
1976       break;
1977
1978
1979     case BADCHAR_CMD:
1980       /* The function moan_smtp_batch() does not return. */
1981       moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected NULL in SMTP command");
1982       break;
1983
1984
1985     default:
1986       /* The function moan_smtp_batch() does not return. */
1987       moan_smtp_batch(smtp_cmd_buffer, "500 Command unrecognized");
1988       break;
1989     }
1990   }
1991
1992 return done - 2;  /* Convert yield values */
1993 }
1994
1995
1996
1997
1998 #ifndef DISABLE_TLS
1999 static BOOL
2000 smtp_log_tls_fail(const uschar * errstr)
2001 {
2002 const uschar * conn_info = smtp_get_connection_info();
2003
2004 if (Ustrncmp(conn_info, US"SMTP ", 5) == 0) conn_info += 5;
2005 /* I'd like to get separated H= here, but too hard for now */
2006
2007 log_write(0, LOG_MAIN, "TLS error on %s %s", conn_info, errstr);
2008 return FALSE;
2009 }
2010 #endif
2011
2012
2013
2014
2015 #ifdef TCP_FASTOPEN
2016 static void
2017 tfo_in_check(void)
2018 {
2019 # ifdef __FreeBSD__
2020 int is_fastopen;
2021 socklen_t len = sizeof(is_fastopen);
2022
2023 /* The tinfo TCPOPT_FAST_OPEN bit seems unreliable, and we don't see state
2024 TCP_SYN_RCV (as of 12.1) so no idea about data-use. */
2025
2026 if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_FASTOPEN, &is_fastopen, &len) == 0)
2027   {
2028   if (is_fastopen)
2029     {
2030     DEBUG(D_receive)
2031       debug_printf("TFO mode connection (TCP_FASTOPEN getsockopt)\n");
2032     f.tcp_in_fastopen = TRUE;
2033     }
2034   }
2035 else DEBUG(D_receive)
2036   debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2037
2038 # elif defined(TCP_INFO)
2039 struct tcp_info tinfo;
2040 socklen_t len = sizeof(tinfo);
2041
2042 if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
2043 #  ifdef TCPI_OPT_SYN_DATA      /* FreeBSD 11,12 do not seem to have this yet */
2044   if (tinfo.tcpi_options & TCPI_OPT_SYN_DATA)
2045     {
2046     DEBUG(D_receive)
2047       debug_printf("TFO mode connection (ACKd data-on-SYN)\n");
2048     f.tcp_in_fastopen_data = f.tcp_in_fastopen = TRUE;
2049     }
2050   else
2051 #  endif
2052     if (tinfo.tcpi_state == TCP_SYN_RECV)       /* Not seen on FreeBSD 12.1 */
2053     {
2054     DEBUG(D_receive)
2055       debug_printf("TFO mode connection (state TCP_SYN_RECV)\n");
2056     f.tcp_in_fastopen = TRUE;
2057     }
2058 else DEBUG(D_receive)
2059   debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2060 # endif
2061 }
2062 #endif
2063
2064
2065 static void
2066 log_connect_tls_drop(const uschar * what, const uschar * log_msg)
2067 {
2068 if (log_reject_target)
2069   {
2070   gstring * g = s_tlslog(NULL);
2071   uschar * tls = string_from_gstring(g);
2072
2073   log_write(L_connection_reject,
2074     log_reject_target, "%s%s%s dropped by %s%s%s",
2075     LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
2076     host_and_ident(TRUE),
2077     tls ? tls : US"",
2078     what,
2079     log_msg ? US": " : US"", log_msg);
2080   }
2081 }
2082
2083
2084 /*************************************************
2085 *          Start an SMTP session                 *
2086 *************************************************/
2087
2088 /* This function is called at the start of an SMTP session. Thereafter,
2089 smtp_setup_msg() is called to initiate each separate message. This
2090 function does host-specific testing, and outputs the banner line.
2091
2092 Arguments:     none
2093 Returns:       FALSE if the session can not continue; something has
2094                gone wrong, or the connection to the host is blocked
2095 */
2096
2097 BOOL
2098 smtp_start_session(void)
2099 {
2100 int esclen;
2101 uschar *user_msg, *log_msg;
2102 uschar *code, *esc;
2103 uschar *p, *s;
2104 gstring * ss;
2105
2106 gettimeofday(&smtp_connection_start, NULL);
2107 for (smtp_ch_index = 0; smtp_ch_index < SMTP_HBUFF_SIZE; smtp_ch_index++)
2108   smtp_connection_had[smtp_ch_index] = SCH_NONE;
2109 smtp_ch_index = 0;
2110
2111 /* Default values for certain variables */
2112
2113 fl.helo_seen = fl.esmtp = fl.helo_accept_junk = FALSE;
2114 smtp_mailcmd_count = 0;
2115 count_nonmail = TRUE_UNSET;
2116 synprot_error_count = unknown_command_count = nonmail_command_count = 0;
2117 smtp_delay_mail = smtp_rlm_base;
2118 fl.auth_advertised = FALSE;
2119 f.smtp_in_pipelining_advertised = f.smtp_in_pipelining_used = FALSE;
2120 f.pipelining_enable = TRUE;
2121 sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
2122 fl.smtp_exit_function_called = FALSE;    /* For avoiding loop in not-quit exit */
2123
2124 /* If receiving by -bs from a trusted user, or testing with -bh, we allow
2125 authentication settings from -oMaa to remain in force. */
2126
2127 if (!host_checking && !f.sender_host_notsocket)
2128   sender_host_auth_pubname = sender_host_authenticated = NULL;
2129 authenticated_by = NULL;
2130
2131 #ifndef DISABLE_TLS
2132 tls_in.ver = tls_in.cipher = tls_in.peerdn = NULL;
2133 tls_in.ourcert = tls_in.peercert = NULL;
2134 tls_in.sni = NULL;
2135 tls_in.ocsp = OCSP_NOT_REQ;
2136 fl.tls_advertised = FALSE;
2137 #endif
2138 fl.dsn_advertised = FALSE;
2139 #ifdef SUPPORT_I18N
2140 fl.smtputf8_advertised = FALSE;
2141 #endif
2142
2143 /* Reset ACL connection variables */
2144
2145 acl_var_c = NULL;
2146
2147 /* Allow for trailing 0 in the command and data buffers.  Tainted. */
2148
2149 smtp_cmd_buffer = store_get_perm(2*SMTP_CMD_BUFFER_SIZE + 2, GET_TAINTED);
2150
2151 smtp_cmd_buffer[0] = 0;
2152 smtp_data_buffer = smtp_cmd_buffer + SMTP_CMD_BUFFER_SIZE + 1;
2153
2154 /* For batched input, the protocol setting can be overridden from the
2155 command line by a trusted caller. */
2156
2157 if (smtp_batched_input)
2158   {
2159   if (!received_protocol) received_protocol = US"local-bsmtp";
2160   }
2161
2162 /* For non-batched SMTP input, the protocol setting is forced here. It will be
2163 reset later if any of EHLO/AUTH/STARTTLS are received. */
2164
2165 else
2166   received_protocol =
2167     (sender_host_address ? protocols : protocols_local) [pnormal];
2168
2169 /* Set up the buffer for inputting using direct read() calls, and arrange to
2170 call the local functions instead of the standard C ones. */
2171
2172 smtp_buf_init();
2173
2174 receive_getc = smtp_getc;
2175 receive_getbuf = smtp_getbuf;
2176 receive_get_cache = smtp_get_cache;
2177 receive_hasc = smtp_hasc;
2178 receive_ungetc = smtp_ungetc;
2179 receive_feof = smtp_feof;
2180 receive_ferror = smtp_ferror;
2181 lwr_receive_getc = NULL;
2182 lwr_receive_getbuf = NULL;
2183 lwr_receive_hasc = NULL;
2184 lwr_receive_ungetc = NULL;
2185
2186 /* Set up the message size limit; this may be host-specific */
2187
2188 GET_OPTION("message_size_limit");
2189 thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
2190 if (expand_string_message)
2191   {
2192   if (thismessage_size_limit == -1)
2193     log_write(0, LOG_MAIN|LOG_PANIC, "unable to expand message_size_limit: "
2194       "%s", expand_string_message);
2195   else
2196     log_write(0, LOG_MAIN|LOG_PANIC, "invalid message_size_limit: "
2197       "%s", expand_string_message);
2198   smtp_closedown(US"Temporary local problem - please try later");
2199   return FALSE;
2200   }
2201
2202 /* When a message is input locally via the -bs or -bS options, sender_host_
2203 unknown is set unless -oMa was used to force an IP address, in which case it
2204 is checked like a real remote connection. When -bs is used from inetd, this
2205 flag is not set, causing the sending host to be checked. The code that deals
2206 with IP source routing (if configured) is never required for -bs or -bS and
2207 the flag sender_host_notsocket is used to suppress it.
2208
2209 If smtp_accept_max and smtp_accept_reserve are set, keep some connections in
2210 reserve for certain hosts and/or networks. */
2211
2212 if (!f.sender_host_unknown)
2213   {
2214   int rc;
2215   BOOL reserved_host = FALSE;
2216
2217   /* Look up IP options (source routing info) on the socket if this is not an
2218   -oMa "host", and if any are found, log them and drop the connection.
2219
2220   Linux (and others now, see below) is different to everyone else, so there
2221   has to be some conditional compilation here. Versions of Linux before 2.1.15
2222   used a structure whose name was "options". Somebody finally realized that
2223   this name was silly, and it got changed to "ip_options". I use the
2224   newer name here, but there is a fudge in the script that sets up os.h
2225   to define a macro in older Linux systems.
2226
2227   Sigh. Linux is a fast-moving target. Another generation of Linux uses
2228   glibc 2, which has chosen ip_opts for the structure name. This is now
2229   really a glibc thing rather than a Linux thing, so the condition name
2230   has been changed to reflect this. It is relevant also to GNU/Hurd.
2231
2232   Mac OS 10.x (Darwin) is like the later glibc versions, but without the
2233   setting of the __GLIBC__ macro, so we can't detect it automatically. There's
2234   a special macro defined in the os.h file.
2235
2236   Some DGUX versions on older hardware appear not to support IP options at
2237   all, so there is now a general macro which can be set to cut out this
2238   support altogether.
2239
2240   How to do this properly in IPv6 is not yet known. */
2241
2242 #if !HAVE_IPV6 && !defined(NO_IP_OPTIONS)
2243
2244 # ifdef GLIBC_IP_OPTIONS
2245 #  if (!defined __GLIBC__) || (__GLIBC__ < 2)
2246 #   define OPTSTYLE 1
2247 #  else
2248 #   define OPTSTYLE 2
2249 #  endif
2250 # elif defined DARWIN_IP_OPTIONS
2251 # define OPTSTYLE 2
2252 # else
2253 # define OPTSTYLE 3
2254 # endif
2255
2256   if (!host_checking && !f.sender_host_notsocket)
2257     {
2258 # if OPTSTYLE == 1
2259     EXIM_SOCKLEN_T optlen = sizeof(struct ip_options) + MAX_IPOPTLEN;
2260     struct ip_options *ipopt = store_get(optlen, GET_UNTAINTED);
2261 # elif OPTSTYLE == 2
2262     struct ip_opts ipoptblock;
2263     struct ip_opts *ipopt = &ipoptblock;
2264     EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
2265 # else
2266     struct ipoption ipoptblock;
2267     struct ipoption *ipopt = &ipoptblock;
2268     EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
2269 # endif
2270
2271     /* Occasional genuine failures of getsockopt() have been seen - for
2272     example, "reset by peer". Therefore, just log and give up on this
2273     call, unless the error is ENOPROTOOPT. This error is given by systems
2274     that have the interfaces but not the mechanism - e.g. GNU/Hurd at the time
2275     of writing. So for that error, carry on - we just can't do an IP options
2276     check. */
2277
2278     DEBUG(D_receive) debug_printf("checking for IP options\n");
2279
2280     if (getsockopt(fileno(smtp_out), IPPROTO_IP, IP_OPTIONS, US (ipopt),
2281           &optlen) < 0)
2282       {
2283       if (errno != ENOPROTOOPT)
2284         {
2285         log_write(0, LOG_MAIN, "getsockopt() failed from %s: %s",
2286           host_and_ident(FALSE), strerror(errno));
2287         smtp_printf("451 SMTP service not available\r\n", SP_NO_MORE);
2288         return FALSE;
2289         }
2290       }
2291
2292     /* Deal with any IP options that are set. On the systems I have looked at,
2293     the value of MAX_IPOPTLEN has been 40, meaning that there should never be
2294     more logging data than will fit in big_buffer. Nevertheless, after somebody
2295     questioned this code, I've added in some paranoid checking. */
2296
2297     else if (optlen > 0)
2298       {
2299       uschar * p = big_buffer;
2300       uschar * pend = big_buffer + big_buffer_size;
2301       uschar * adptr;
2302       int optcount;
2303       struct in_addr addr;
2304
2305 # if OPTSTYLE == 1
2306       uschar * optstart = US (ipopt->__data);
2307 # elif OPTSTYLE == 2
2308       uschar * optstart = US (ipopt->ip_opts);
2309 # else
2310       uschar * optstart = US (ipopt->ipopt_list);
2311 # endif
2312
2313       DEBUG(D_receive) debug_printf("IP options exist\n");
2314
2315       Ustrcpy(p, "IP options on incoming call:");
2316       p += Ustrlen(p);
2317
2318       for (uschar * opt = optstart; opt && opt < US (ipopt) + optlen; )
2319         switch (*opt)
2320           {
2321           case IPOPT_EOL:
2322             opt = NULL;
2323             break;
2324
2325           case IPOPT_NOP:
2326             opt++;
2327             break;
2328
2329           case IPOPT_SSRR:
2330           case IPOPT_LSRR:
2331             if (!
2332 # if OPTSTYLE == 1
2333                  string_format(p, pend-p, " %s [@%s",
2334                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2335                  inet_ntoa(*((struct in_addr *)(&(ipopt->faddr)))))
2336 # elif OPTSTYLE == 2
2337                  string_format(p, pend-p, " %s [@%s",
2338                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2339                  inet_ntoa(ipopt->ip_dst))
2340 # else
2341                  string_format(p, pend-p, " %s [@%s",
2342                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2343                  inet_ntoa(ipopt->ipopt_dst))
2344 # endif
2345               )
2346               {
2347               opt = NULL;
2348               break;
2349               }
2350
2351             p += Ustrlen(p);
2352             optcount = (opt[1] - 3) / sizeof(struct in_addr);
2353             adptr = opt + 3;
2354             while (optcount-- > 0)
2355               {
2356               memcpy(&addr, adptr, sizeof(addr));
2357               if (!string_format(p, pend - p - 1, "%s%s",
2358                     (optcount == 0)? ":" : "@", inet_ntoa(addr)))
2359                 {
2360                 opt = NULL;
2361                 break;
2362                 }
2363               p += Ustrlen(p);
2364               adptr += sizeof(struct in_addr);
2365               }
2366             *p++ = ']';
2367             opt += opt[1];
2368             break;
2369
2370           default:
2371               {
2372               if (pend - p < 4 + 3*opt[1]) { opt = NULL; break; }
2373               Ustrcat(p, "[ ");
2374               p += 2;
2375               for (int i = 0; i < opt[1]; i++)
2376                 p += sprintf(CS p, "%2.2x ", opt[i]);
2377               *p++ = ']';
2378               }
2379             opt += opt[1];
2380             break;
2381           }
2382
2383       *p = 0;
2384       log_write(0, LOG_MAIN, "%s", big_buffer);
2385
2386       /* Refuse any call with IP options. This is what tcpwrappers 7.5 does. */
2387
2388       log_write(0, LOG_MAIN|LOG_REJECT,
2389         "connection from %s refused (IP options)", host_and_ident(FALSE));
2390
2391       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2392       return FALSE;
2393       }
2394
2395     /* Length of options = 0 => there are no options */
2396
2397     else DEBUG(D_receive) debug_printf("no IP options found\n");
2398     }
2399 #endif  /* HAVE_IPV6 && !defined(NO_IP_OPTIONS) */
2400
2401   /* Set keep-alive in socket options. The option is on by default. This
2402   setting is an attempt to get rid of some hanging connections that stick in
2403   read() when the remote end (usually a dialup) goes away. */
2404
2405   if (smtp_accept_keepalive && !f.sender_host_notsocket)
2406     ip_keepalive(fileno(smtp_out), sender_host_address, FALSE);
2407
2408   /* If the current host matches host_lookup, set the name by doing a
2409   reverse lookup. On failure, sender_host_name will be NULL and
2410   host_lookup_failed will be TRUE. This may or may not be serious - optional
2411   checks later. */
2412
2413   if (verify_check_host(&host_lookup) == OK)
2414     {
2415     (void)host_name_lookup();
2416     host_build_sender_fullhost();
2417     }
2418
2419   /* Delay this until we have the full name, if it is looked up. */
2420
2421   set_process_info("handling incoming connection from %s",
2422     host_and_ident(FALSE));
2423
2424   /* Expand smtp_receive_timeout, if needed */
2425
2426   if (smtp_receive_timeout_s)
2427     {
2428     uschar * exp;
2429     if (  !(exp = expand_string(smtp_receive_timeout_s))
2430        || !(*exp)
2431        || (smtp_receive_timeout = readconf_readtime(exp, 0, FALSE)) < 0
2432        )
2433       log_write(0, LOG_MAIN|LOG_PANIC,
2434         "bad value for smtp_receive_timeout: '%s'", exp ? exp : US"");
2435     }
2436
2437   /* Test for explicit connection rejection */
2438
2439   if (verify_check_host(&host_reject_connection) == OK)
2440     {
2441     log_write(L_connection_reject, LOG_MAIN|LOG_REJECT, "refused connection "
2442       "from %s (host_reject_connection)", host_and_ident(FALSE));
2443 #ifndef DISABLE_TLS
2444     if (!tls_in.on_connect)
2445 #endif
2446       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2447     return FALSE;
2448     }
2449
2450   /* Test with TCP Wrappers if so configured. There is a problem in that
2451   hosts_ctl() returns 0 (deny) under a number of system failure circumstances,
2452   such as disks dying. In these cases, it is desirable to reject with a 4xx
2453   error instead of a 5xx error. There isn't a "right" way to detect such
2454   problems. The following kludge is used: errno is zeroed before calling
2455   hosts_ctl(). If the result is "reject", a 5xx error is given only if the
2456   value of errno is 0 or ENOENT (which happens if /etc/hosts.{allow,deny} does
2457   not exist). */
2458
2459 #ifdef USE_TCP_WRAPPERS
2460   errno = 0;
2461   if (!(tcp_wrappers_name = expand_string(tcp_wrappers_daemon_name)))
2462     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" "
2463       "(tcp_wrappers_name) failed: %s", string_printing(tcp_wrappers_name),
2464         expand_string_message);
2465
2466   if (!hosts_ctl(tcp_wrappers_name,
2467          sender_host_name ? CS sender_host_name : STRING_UNKNOWN,
2468          sender_host_address ? CS sender_host_address : STRING_UNKNOWN,
2469          sender_ident ? CS sender_ident : STRING_UNKNOWN))
2470     {
2471     if (errno == 0 || errno == ENOENT)
2472       {
2473       HDEBUG(D_receive) debug_printf("tcp wrappers rejection\n");
2474       log_write(L_connection_reject,
2475                 LOG_MAIN|LOG_REJECT, "refused connection from %s "
2476                 "(tcp wrappers)", host_and_ident(FALSE));
2477       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2478       }
2479     else
2480       {
2481       int save_errno = errno;
2482       HDEBUG(D_receive) debug_printf("tcp wrappers rejected with unexpected "
2483         "errno value %d\n", save_errno);
2484       log_write(L_connection_reject,
2485                 LOG_MAIN|LOG_REJECT, "temporarily refused connection from %s "
2486                 "(tcp wrappers errno=%d)", host_and_ident(FALSE), save_errno);
2487       smtp_printf("451 Temporary local problem - please try later\r\n", SP_NO_MORE);
2488       }
2489     return FALSE;
2490     }
2491 #endif
2492
2493   /* Check for reserved slots. The value of smtp_accept_count has already been
2494   incremented to include this process. */
2495
2496   if (smtp_accept_max > 0 &&
2497       smtp_accept_count > smtp_accept_max - smtp_accept_reserve)
2498     {
2499     if ((rc = verify_check_host(&smtp_reserve_hosts)) != OK)
2500       {
2501       log_write(L_connection_reject,
2502         LOG_MAIN, "temporarily refused connection from %s: not in "
2503         "reserve list: connected=%d max=%d reserve=%d%s",
2504         host_and_ident(FALSE), smtp_accept_count - 1, smtp_accept_max,
2505         smtp_accept_reserve, (rc == DEFER)? " (lookup deferred)" : "");
2506       smtp_printf("421 %s: Too many concurrent SMTP connections; "
2507         "please try again later\r\n", SP_NO_MORE, smtp_active_hostname);
2508       return FALSE;
2509       }
2510     reserved_host = TRUE;
2511     }
2512
2513   /* If a load level above which only messages from reserved hosts are
2514   accepted is set, check the load. For incoming calls via the daemon, the
2515   check is done in the superior process if there are no reserved hosts, to
2516   save a fork. In all cases, the load average will already be available
2517   in a global variable at this point. */
2518
2519   if (smtp_load_reserve >= 0 &&
2520        load_average > smtp_load_reserve &&
2521        !reserved_host &&
2522        verify_check_host(&smtp_reserve_hosts) != OK)
2523     {
2524     log_write(L_connection_reject,
2525       LOG_MAIN, "temporarily refused connection from %s: not in "
2526       "reserve list and load average = %.2f", host_and_ident(FALSE),
2527       (double)load_average/1000.0);
2528     smtp_printf("421 %s: Too much load; please try again later\r\n", SP_NO_MORE,
2529       smtp_active_hostname);
2530     return FALSE;
2531     }
2532
2533   /* Determine whether unqualified senders or recipients are permitted
2534   for this host. Unfortunately, we have to do this every time, in order to
2535   set the flags so that they can be inspected when considering qualifying
2536   addresses in the headers. For a site that permits no qualification, this
2537   won't take long, however. */
2538
2539   f.allow_unqualified_sender =
2540     verify_check_host(&sender_unqualified_hosts) == OK;
2541
2542   f.allow_unqualified_recipient =
2543     verify_check_host(&recipient_unqualified_hosts) == OK;
2544
2545   /* Determine whether HELO/EHLO is required for this host. The requirement
2546   can be hard or soft. */
2547
2548   fl.helo_verify_required = verify_check_host(&helo_verify_hosts) == OK;
2549   if (!fl.helo_verify_required)
2550     fl.helo_verify = verify_check_host(&helo_try_verify_hosts) == OK;
2551
2552   /* Determine whether this hosts is permitted to send syntactic junk
2553   after a HELO or EHLO command. */
2554
2555   fl.helo_accept_junk = verify_check_host(&helo_accept_junk_hosts) == OK;
2556   }
2557
2558 /* Expand recipients_max, if needed */
2559  {
2560   uschar * rme = expand_string(recipients_max);
2561   recipients_max_expanded = atoi(CCS rme);
2562  }
2563 /* For batch SMTP input we are now done. */
2564
2565 if (smtp_batched_input) return TRUE;
2566
2567 #if defined(SUPPORT_PROXY) || defined(SUPPORT_SOCKS) || defined(EXPERIMENTAL_XCLIENT)
2568 proxy_session = FALSE;
2569 #endif
2570
2571 #ifdef SUPPORT_PROXY
2572 /* If valid Proxy Protocol source is connecting, set up session.
2573 Failure will not allow any SMTP function other than QUIT. */
2574
2575 f.proxy_session_failed = FALSE;
2576 if (proxy_protocol_host())
2577   {
2578   os_non_restarting_signal(SIGALRM, command_timeout_handler);
2579   proxy_protocol_setup();
2580   }
2581 #endif
2582
2583 /* Run the connect ACL if it exists */
2584
2585 user_msg = NULL;
2586 GET_OPTION("acl_smtp_connect");
2587 if (acl_smtp_connect)
2588   {
2589   int rc;
2590   if ((rc = acl_check(ACL_WHERE_CONNECT, NULL, acl_smtp_connect, &user_msg,
2591                       &log_msg)) != OK)
2592     {
2593 #ifndef DISABLE_TLS
2594     if (tls_in.on_connect)
2595       log_connect_tls_drop(US"'connect' ACL", log_msg);
2596     else
2597 #endif
2598       (void) smtp_handle_acl_fail(ACL_WHERE_CONNECT, rc, user_msg, log_msg);
2599     return FALSE;
2600     }
2601   }
2602
2603 /* Start up TLS if tls_on_connect is set. This is for supporting the legacy
2604 smtps port for use with older style SSL MTAs. */
2605
2606 #ifndef DISABLE_TLS
2607 if (tls_in.on_connect)
2608   {
2609   if (tls_server_start(&user_msg) != OK)
2610     return smtp_log_tls_fail(user_msg);
2611   cmd_list[CL_TLAU].is_mail_cmd = TRUE;
2612   }
2613 #endif
2614
2615 /* Output the initial message for a two-way SMTP connection. It may contain
2616 newlines, which then cause a multi-line response to be given. */
2617
2618 code = US"220";   /* Default status code */
2619 esc = US"";       /* Default extended status code */
2620 esclen = 0;       /* Length of esc */
2621
2622 if (user_msg)
2623   {
2624   int codelen = 3;
2625   s = user_msg;
2626   smtp_message_code(&code, &codelen, &s, NULL, TRUE);
2627   if (codelen > 4)
2628     {
2629     esc = code + 4;
2630     esclen = codelen - 4;
2631     }
2632   }
2633 else
2634   {
2635   GET_OPTION("smtp_banner");
2636   if (!(s = expand_string(smtp_banner)))
2637     {
2638     log_write(0, f.expand_string_forcedfail ? LOG_MAIN : LOG_MAIN|LOG_PANIC_DIE,
2639       "Expansion of \"%s\" (smtp_banner) failed: %s",
2640       smtp_banner, expand_string_message);
2641     /* for force-fail */
2642   #ifndef DISABLE_TLS
2643     if (tls_in.on_connect) tls_close(NULL, TLS_SHUTDOWN_WAIT);
2644   #endif
2645     return FALSE;
2646     }
2647   }
2648
2649 /* Remove any terminating newlines; might as well remove trailing space too */
2650
2651 p = s + Ustrlen(s);
2652 while (p > s && isspace(p[-1])) p--;
2653 s = string_copyn(s, p-s);
2654
2655 /* It seems that CC:Mail is braindead, and assumes that the greeting message
2656 is all contained in a single IP packet. The original code wrote out the
2657 greeting using several calls to fprint/fputc, and on busy servers this could
2658 cause it to be split over more than one packet - which caused CC:Mail to fall
2659 over when it got the second part of the greeting after sending its first
2660 command. Sigh. To try to avoid this, build the complete greeting message
2661 first, and output it in one fell swoop. This gives a better chance of it
2662 ending up as a single packet. */
2663
2664 ss = string_get(256);
2665
2666 p = s;
2667 do       /* At least once, in case we have an empty string */
2668   {
2669   int len;
2670   uschar *linebreak = Ustrchr(p, '\n');
2671   ss = string_catn(ss, code, 3);
2672   if (!linebreak)
2673     {
2674     len = Ustrlen(p);
2675     ss = string_catn(ss, US" ", 1);
2676     }
2677   else
2678     {
2679     len = linebreak - p;
2680     ss = string_catn(ss, US"-", 1);
2681     }
2682   ss = string_catn(ss, esc, esclen);
2683   ss = string_catn(ss, p, len);
2684   ss = string_catn(ss, US"\r\n", 2);
2685   p += len;
2686   if (linebreak) p++;
2687   }
2688 while (*p);
2689
2690 /* Before we write the banner, check that there is no input pending, unless
2691 this synchronisation check is disabled. */
2692
2693 #ifndef DISABLE_PIPE_CONNECT
2694 fl.pipe_connect_acceptable =
2695   sender_host_address && verify_check_host(&pipe_connect_advertise_hosts) == OK;
2696
2697 if (!check_sync())
2698   if (fl.pipe_connect_acceptable)
2699     f.smtp_in_early_pipe_used = TRUE;
2700   else
2701 #else
2702 if (!check_sync())
2703 #endif
2704     {
2705     unsigned n = smtp_inend - smtp_inptr;
2706     if (n > 128) n = 128;
2707
2708     log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol "
2709       "synchronization error (input sent without waiting for greeting): "
2710       "rejected connection from %s input=\"%s\"", host_and_ident(TRUE),
2711       string_printing(string_copyn(smtp_inptr, n)));
2712     smtp_printf("554 SMTP synchronization error\r\n", SP_NO_MORE);
2713     return FALSE;
2714     }
2715
2716 /* Now output the banner */
2717 /*XXX the ehlo-resp code does its own tls/nontls bit.  Maybe subroutine that? */
2718
2719 smtp_printf("%Y",
2720 #ifndef DISABLE_PIPE_CONNECT
2721   fl.pipe_connect_acceptable && pipeline_connect_sends(),
2722 #else
2723   SP_NO_MORE,
2724 #endif
2725   ss);
2726
2727 /* Attempt to see if we sent the banner before the last ACK of the 3-way
2728 handshake arrived.  If so we must have managed a TFO. */
2729
2730 #ifdef TCP_FASTOPEN
2731 if (sender_host_address && !f.sender_host_notsocket) tfo_in_check();
2732 #endif
2733
2734 return TRUE;
2735 }
2736
2737
2738
2739
2740
2741 /*************************************************
2742 *     Handle SMTP syntax and protocol errors     *
2743 *************************************************/
2744
2745 /* Write to the log for SMTP syntax errors in incoming commands, if configured
2746 to do so. Then transmit the error response. The return value depends on the
2747 number of syntax and protocol errors in this SMTP session.
2748
2749 Arguments:
2750   type      error type, given as a log flag bit
2751   code      response code; <= 0 means don't send a response
2752   data      data to reflect in the response (can be NULL)
2753   errmess   the error message
2754
2755 Returns:    -1   limit of syntax/protocol errors NOT exceeded
2756             +1   limit of syntax/protocol errors IS exceeded
2757
2758 These values fit in with the values of the "done" variable in the main
2759 processing loop in smtp_setup_msg(). */
2760
2761 static int
2762 synprot_error(int type, int code, uschar *data, uschar *errmess)
2763 {
2764 int yield = -1;
2765
2766 log_write(type, LOG_MAIN, "SMTP %s error in \"%s\" %s %s",
2767   type == L_smtp_syntax_error ? "syntax" : "protocol",
2768   string_printing(smtp_cmd_buffer), host_and_ident(TRUE), errmess);
2769
2770 if (++synprot_error_count > smtp_max_synprot_errors)
2771   {
2772   yield = 1;
2773   log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
2774     "syntax or protocol errors (last command was \"%s\", %Y)",
2775     host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
2776     s_connhad_log(NULL)
2777     );
2778   }
2779
2780 if (code > 0)
2781   {
2782   smtp_printf("%d%c%s%s%s\r\n", SP_NO_MORE, code, yield == 1 ? '-' : ' ',
2783     data ? data : US"", data ? US": " : US"", errmess);
2784   if (yield == 1)
2785     smtp_printf("%d Too many syntax or protocol errors\r\n", SP_NO_MORE, code);
2786   }
2787
2788 return yield;
2789 }
2790
2791
2792
2793
2794 /*************************************************
2795 *    Send SMTP response, possibly multiline      *
2796 *************************************************/
2797
2798 /* There are, it seems, broken clients out there that cannot handle multiline
2799 responses. If no_multiline_responses is TRUE (it can be set from an ACL), we
2800 output nothing for non-final calls, and only the first line for anything else.
2801
2802 Arguments:
2803   code          SMTP code, may involve extended status codes
2804   codelen       length of smtp code; if > 4 there's an ESC
2805   final         FALSE if the last line isn't the final line
2806   msg           message text, possibly containing newlines
2807
2808 Returns:        nothing
2809 */
2810
2811 void
2812 smtp_respond(uschar * code, int codelen, BOOL final, uschar * msg)
2813 {
2814 int esclen = 0;
2815 uschar *esc = US"";
2816
2817 if (!final && f.no_multiline_responses) return;
2818
2819 if (codelen > 4)
2820   {
2821   esc = code + 4;
2822   esclen = codelen - 4;
2823   }
2824
2825 /* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
2826 have had the same. Note: this code is also present in smtp_printf(). It would
2827 be tidier to have it only in one place, but when it was added, it was easier to
2828 do it that way, so as not to have to mess with the code for the RCPT command,
2829 which sometimes uses smtp_printf() and sometimes smtp_respond(). */
2830
2831 if (fl.rcpt_in_progress)
2832   {
2833   if (!rcpt_smtp_response)
2834     rcpt_smtp_response = string_copy(msg);
2835   else if (fl.rcpt_smtp_response_same &&
2836            Ustrcmp(rcpt_smtp_response, msg) != 0)
2837     fl.rcpt_smtp_response_same = FALSE;
2838   fl.rcpt_in_progress = FALSE;
2839   }
2840
2841 /* Now output the message, splitting it up into multiple lines if necessary.
2842 We only handle pipelining these responses as far as nonfinal/final groups,
2843 not the whole MAIL/RCPT/DATA response set. */
2844
2845 for (uschar * nl;;)
2846   if (!(nl = Ustrchr(msg, '\n')))
2847     {
2848     smtp_printf("%.3s%c%.*s%s\r\n", !final, code, final ? ' ':'-', esclen, esc, msg);
2849     return;
2850     }
2851   else if (nl[1] == 0 || f.no_multiline_responses)
2852     {
2853     smtp_printf("%.3s%c%.*s%.*s\r\n", !final, code, final ? ' ':'-', esclen, esc,
2854       (int)(nl - msg), msg);
2855     return;
2856     }
2857   else
2858     {
2859     smtp_printf("%.3s-%.*s%.*s\r\n", SP_MORE, code, esclen, esc, (int)(nl - msg), msg);
2860     msg = nl + 1;
2861     Uskip_whitespace(&msg);
2862     }
2863 }
2864
2865
2866
2867
2868 /*************************************************
2869 *            Parse user SMTP message             *
2870 *************************************************/
2871
2872 /* This function allows for user messages overriding the response code details
2873 by providing a suitable response code string at the start of the message
2874 user_msg. Check the message for starting with a response code and optionally an
2875 extended status code. If found, check that the first digit is valid, and if so,
2876 change the code pointer and length to use the replacement. An invalid code
2877 causes a panic log; in this case, if the log messages is the same as the user
2878 message, we must also adjust the value of the log message to show the code that
2879 is actually going to be used (the original one).
2880
2881 This function is global because it is called from receive.c as well as within
2882 this module.
2883
2884 Note that the code length returned includes the terminating whitespace
2885 character, which is always included in the regex match.
2886
2887 Arguments:
2888   code          SMTP code, may involve extended status codes
2889   codelen       length of smtp code; if > 4 there's an ESC
2890   msg           message text
2891   log_msg       optional log message, to be adjusted with the new SMTP code
2892   check_valid   if true, verify the response code
2893
2894 Returns:        nothing
2895 */
2896
2897 void
2898 smtp_message_code(uschar **code, int *codelen, uschar **msg, uschar **log_msg,
2899   BOOL check_valid)
2900 {
2901 uschar * match;
2902 int len;
2903
2904 if (!msg || !*msg || !regex_match(regex_smtp_code, *msg, -1, &match))
2905   return;
2906
2907 len = Ustrlen(match);
2908 if (check_valid && (*msg)[0] != (*code)[0])
2909   {
2910   log_write(0, LOG_MAIN|LOG_PANIC, "configured error code starts with "
2911     "incorrect digit (expected %c) in \"%s\"", (*code)[0], *msg);
2912   if (log_msg && *log_msg == *msg)
2913     *log_msg = string_sprintf("%s %s", *code, *log_msg + len);
2914   }
2915 else
2916   {
2917   *code = *msg;
2918   *codelen = len;    /* Includes final space */
2919   }
2920 *msg += len;         /* Chop the code off the message */
2921 return;
2922 }
2923
2924
2925
2926
2927 /*************************************************
2928 *           Handle an ACL failure                *
2929 *************************************************/
2930
2931 /* This function is called when acl_check() fails. As well as calls from within
2932 this module, it is called from receive.c for an ACL after DATA. It sorts out
2933 logging the incident, and sends the error response. A message containing
2934 newlines is turned into a multiline SMTP response, but for logging, only the
2935 first line is used.
2936
2937 There's a table of default permanent failure response codes to use in
2938 globals.c, along with the table of names. VFRY is special. Despite RFC1123 it
2939 defaults disabled in Exim. However, discussion in connection with RFC 821bis
2940 (aka RFC 2821) has concluded that the response should be 252 in the disabled
2941 state, because there are broken clients that try VRFY before RCPT. A 5xx
2942 response should be given only when the address is positively known to be
2943 undeliverable. Sigh. We return 252 if there is no VRFY ACL or it provides
2944 no explicit code, but if there is one we let it know best.
2945 Also, for ETRN, 458 is given on refusal, and for AUTH, 503.
2946
2947 From Exim 4.63, it is possible to override the response code details by
2948 providing a suitable response code string at the start of the message provided
2949 in user_msg. The code's first digit is checked for validity.
2950
2951 Arguments:
2952   where        where the ACL was called from
2953   rc           the failure code
2954   user_msg     a message that can be included in an SMTP response
2955   log_msg      a message for logging
2956
2957 Returns:     0 in most cases
2958              2 if the failure code was FAIL_DROP, in which case the
2959                SMTP connection should be dropped (this value fits with the
2960                "done" variable in smtp_setup_msg() below)
2961 */
2962
2963 int
2964 smtp_handle_acl_fail(int where, int rc, uschar * user_msg, uschar * log_msg)
2965 {
2966 BOOL drop = rc == FAIL_DROP;
2967 int codelen = 3;
2968 uschar *smtp_code;
2969 uschar *lognl;
2970 uschar *sender_info = US"";
2971 uschar *what;
2972
2973 if (drop) rc = FAIL;
2974
2975 /* Set the default SMTP code, and allow a user message to change it. */
2976
2977 smtp_code = rc == FAIL ? acl_wherecodes[where] : US"451";
2978 smtp_message_code(&smtp_code, &codelen, &user_msg, &log_msg,
2979   where != ACL_WHERE_VRFY);
2980
2981 /* Get info for logging.
2982 We used to have sender_address here; however, there was a bug that was not
2983 updating sender_address after a rewrite during a verify. When this bug was
2984 fixed, sender_address at this point became the rewritten address. I'm not sure
2985 this is what should be logged, so I've changed to logging the unrewritten
2986 address to retain backward compatibility. */
2987
2988 switch (where)
2989   {
2990 #ifdef WITH_CONTENT_SCAN
2991   case ACL_WHERE_MIME:          what = US"during MIME ACL checks";      break;
2992 #endif
2993   case ACL_WHERE_PREDATA:       what = US"DATA";                        break;
2994   case ACL_WHERE_DATA:          what = US"after DATA";                  break;
2995 #ifndef DISABLE_PRDR
2996   case ACL_WHERE_PRDR:          what = US"after DATA PRDR";             break;
2997 #endif
2998   default:
2999     {
3000     uschar * place = smtp_cmd_data ? smtp_cmd_data : US"in \"connect\" ACL";
3001     int lim = 100;
3002
3003     if (where == ACL_WHERE_AUTH)        /* avoid logging auth creds */
3004       {
3005       uschar * s = smtp_cmd_data;
3006       Uskip_nonwhite(&s);
3007       lim = s - smtp_cmd_data;  /* stop after method */
3008       }
3009     what = string_sprintf("%s %.*s", acl_wherenames[where], lim, place);
3010     }
3011   }
3012 switch (where)
3013   {
3014   case ACL_WHERE_RCPT:
3015   case ACL_WHERE_DATA:
3016 #ifdef WITH_CONTENT_SCAN
3017   case ACL_WHERE_MIME:
3018 #endif
3019     sender_info = string_sprintf("F=<%s>%s%s%s%s ",
3020       sender_address_unrewritten ? sender_address_unrewritten : sender_address,
3021       sender_host_authenticated ? US" A="                                    : US"",
3022       sender_host_authenticated ? sender_host_authenticated                  : US"",
3023       sender_host_authenticated && authenticated_id ? US":"                  : US"",
3024       sender_host_authenticated && authenticated_id ? authenticated_id       : US""
3025       );
3026   break;
3027   }
3028
3029 /* If there's been a sender verification failure with a specific message, and
3030 we have not sent a response about it yet, do so now, as a preliminary line for
3031 failures, but not defers. However, always log it for defer, and log it for fail
3032 unless the sender_verify_fail log selector has been turned off. */
3033
3034 if (sender_verified_failed &&
3035     !testflag(sender_verified_failed, af_sverify_told))
3036   {
3037   BOOL save_rcpt_in_progress = fl.rcpt_in_progress;
3038   fl.rcpt_in_progress = FALSE;  /* So as not to treat these as the error */
3039
3040   setflag(sender_verified_failed, af_sverify_told);
3041
3042   if (rc != FAIL || LOGGING(sender_verify_fail))
3043     log_write(0, LOG_MAIN|LOG_REJECT, "%s sender verify %s for <%s>%s",
3044       host_and_ident(TRUE),
3045       ((sender_verified_failed->special_action & 255) == DEFER)? "defer":"fail",
3046       sender_verified_failed->address,
3047       (sender_verified_failed->message == NULL)? US"" :
3048       string_sprintf(": %s", sender_verified_failed->message));
3049
3050   if (rc == FAIL && sender_verified_failed->user_message)
3051     smtp_respond(smtp_code, codelen, SR_NOT_FINAL, string_sprintf(
3052         testflag(sender_verified_failed, af_verify_pmfail)?
3053           "Postmaster verification failed while checking <%s>\n%s\n"
3054           "Several RFCs state that you are required to have a postmaster\n"
3055           "mailbox for each mail domain. This host does not accept mail\n"
3056           "from domains whose servers reject the postmaster address."
3057           :
3058         testflag(sender_verified_failed, af_verify_nsfail)?
3059           "Callback setup failed while verifying <%s>\n%s\n"
3060           "The initial connection, or a HELO or MAIL FROM:<> command was\n"
3061           "rejected. Refusing MAIL FROM:<> does not help fight spam, disregards\n"
3062           "RFC requirements, and stops you from receiving standard bounce\n"
3063           "messages. This host does not accept mail from domains whose servers\n"
3064           "refuse bounces."
3065           :
3066           "Verification failed for <%s>\n%s",
3067         sender_verified_failed->address,
3068         sender_verified_failed->user_message));
3069
3070   fl.rcpt_in_progress = save_rcpt_in_progress;
3071   }
3072
3073 /* Sort out text for logging */
3074
3075 log_msg = log_msg ? string_sprintf(": %s", log_msg) : US"";
3076 if ((lognl = Ustrchr(log_msg, '\n'))) *lognl = 0;
3077
3078 /* Send permanent failure response to the command, but the code used isn't
3079 always a 5xx one - see comments at the start of this function. If the original
3080 rc was FAIL_DROP we drop the connection and yield 2. */
3081
3082 if (rc == FAIL)
3083   smtp_respond(smtp_code, codelen, SR_FINAL,
3084     user_msg ? user_msg : US"Administrative prohibition");
3085
3086 /* Send temporary failure response to the command. Don't give any details,
3087 unless acl_temp_details is set. This is TRUE for a callout defer, a "defer"
3088 verb, and for a header verify when smtp_return_error_details is set.
3089
3090 This conditional logic is all somewhat of a mess because of the odd
3091 interactions between temp_details and return_error_details. One day it should
3092 be re-implemented in a tidier fashion. */
3093
3094 else
3095   if (f.acl_temp_details && user_msg)
3096     {
3097     if (  smtp_return_error_details
3098        && sender_verified_failed
3099        && sender_verified_failed->message
3100        )
3101       smtp_respond(smtp_code, codelen, SR_NOT_FINAL, sender_verified_failed->message);
3102
3103     smtp_respond(smtp_code, codelen, SR_FINAL, user_msg);
3104     }
3105   else
3106     smtp_respond(smtp_code, codelen, SR_FINAL,
3107       US"Temporary local problem - please try later");
3108
3109 /* Log the incident to the logs that are specified by log_reject_target
3110 (default main, reject). This can be empty to suppress logging of rejections. If
3111 the connection is not forcibly to be dropped, return 0. Otherwise, log why it
3112 is closing if required and return 2.  */
3113
3114 if (log_reject_target)
3115   {
3116 #ifndef DISABLE_TLS
3117   gstring * g = s_tlslog(NULL);
3118   uschar * tls = string_from_gstring(g);
3119   if (!tls) tls = US"";
3120 #else
3121   uschar * tls = US"";
3122 #endif
3123   log_write(where == ACL_WHERE_CONNECT ? L_connection_reject : 0,
3124     log_reject_target, "%s%s%s %s%srejected %s%s",
3125     LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
3126     host_and_ident(TRUE),
3127     tls,
3128     sender_info,
3129     rc == FAIL ? US"" : US"temporarily ",
3130     what, log_msg);
3131   }
3132
3133 if (!drop) return 0;
3134
3135 log_close_event(US"by DROP in ACL");
3136
3137 /* Run the not-quit ACL, but without any custom messages. This should not be a
3138 problem, because we get here only if some other ACL has issued "drop", and
3139 in that case, *its* custom messages will have been used above. */
3140
3141 smtp_notquit_exit(US"acl-drop", NULL, NULL);
3142
3143 /* An overenthusiastic fail2ban/iptables implimentation has been seen to result
3144 in the TCP conn staying open, and retrying, despite this process exiting. A
3145 malicious client could possibly do the same, tying up server netowrking
3146 resources. Close the socket explicitly to try to avoid that (there's a note in
3147 the Linux socket(7) manpage, SO_LINGER para, to the effect that exim() without
3148 close() results in the socket always lingering). */
3149
3150 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3151 DEBUG(D_any) debug_printf_indent("SMTP(close)>>\n");
3152 (void) fclose(smtp_in);
3153 (void) fclose(smtp_out);
3154
3155 return 2;
3156 }
3157
3158
3159
3160
3161 /*************************************************
3162 *     Handle SMTP exit when QUIT is not given    *
3163 *************************************************/
3164
3165 /* This function provides a logging/statistics hook for when an SMTP connection
3166 is dropped on the floor or the other end goes away. It's a global function
3167 because it's called from receive.c as well as this module. As well as running
3168 the NOTQUIT ACL, if there is one, this function also outputs a final SMTP
3169 response, either with a custom message from the ACL, or using a default. There
3170 is one case, however, when no message is output - after "drop". In that case,
3171 the ACL that obeyed "drop" has already supplied the custom message, and NULL is
3172 passed to this function.
3173
3174 In case things go wrong while processing this function, causing an error that
3175 may re-enter this function, there is a recursion check.
3176
3177 Arguments:
3178   reason          What $smtp_notquit_reason will be set to in the ACL;
3179                     if NULL, the ACL is not run
3180   code            The error code to return as part of the response
3181   defaultrespond  The default message if there's no user_msg
3182
3183 Returns:          Nothing
3184 */
3185
3186 void
3187 smtp_notquit_exit(uschar *reason, uschar *code, uschar *defaultrespond, ...)
3188 {
3189 int rc;
3190 uschar *user_msg = NULL;
3191 uschar *log_msg = NULL;
3192
3193 /* Check for recursive call */
3194
3195 if (fl.smtp_exit_function_called)
3196   {
3197   log_write(0, LOG_PANIC, "smtp_notquit_exit() called more than once (%s)",
3198     reason);
3199   return;
3200   }
3201 fl.smtp_exit_function_called = TRUE;
3202
3203 /* Call the not-QUIT ACL, if there is one, unless no reason is given. */
3204
3205 GET_OPTION("acl_smtp_notquit");
3206 if (acl_smtp_notquit && reason)
3207   {
3208   smtp_notquit_reason = reason;
3209   if ((rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
3210                       &log_msg)) == ERROR)
3211     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
3212       log_msg);
3213   }
3214
3215 /* If the connection was dropped, we certainly are no longer talking TLS */
3216 tls_in.active.sock = -1;
3217
3218 /* Write an SMTP response if we are expected to give one. As the default
3219 responses are all internal, they should be reasonable size. */
3220
3221 if (code && defaultrespond)
3222   {
3223   if (user_msg)
3224     smtp_respond(code, 3, SR_FINAL, user_msg);
3225   else
3226     {
3227     gstring * g;
3228     va_list ap;
3229
3230     va_start(ap, defaultrespond);
3231     g = string_vformat(NULL, SVFMT_EXTEND|SVFMT_REBUFFER, CS defaultrespond, ap);
3232     va_end(ap);
3233     smtp_printf("%s %Y\r\n", SP_NO_MORE, code, g);
3234     }
3235   mac_smtp_fflush();
3236   }
3237 }
3238
3239
3240
3241
3242 /*************************************************
3243 *             Verify HELO argument               *
3244 *************************************************/
3245
3246 /* This function is called if helo_verify_hosts or helo_try_verify_hosts is
3247 matched. It is also called from ACL processing if verify = helo is used and
3248 verification was not previously tried (i.e. helo_try_verify_hosts was not
3249 matched). The result of its processing is to set helo_verified and
3250 helo_verify_failed. These variables should both be FALSE for this function to
3251 be called.
3252
3253 Note that EHLO/HELO is legitimately allowed to quote an address literal. Allow
3254 for IPv6 ::ffff: literals.
3255
3256 Argument:   none
3257 Returns:    TRUE if testing was completed;
3258             FALSE on a temporary failure
3259 */
3260
3261 BOOL
3262 smtp_verify_helo(void)
3263 {
3264 BOOL yield = TRUE;
3265
3266 HDEBUG(D_receive) debug_printf("verifying EHLO/HELO argument \"%s\"\n",
3267   sender_helo_name);
3268
3269 if (sender_helo_name == NULL)
3270   {
3271   HDEBUG(D_receive) debug_printf("no EHLO/HELO command was issued\n");
3272   }
3273
3274 /* Deal with the case of -bs without an IP address */
3275
3276 else if (sender_host_address == NULL)
3277   {
3278   HDEBUG(D_receive) debug_printf("no client IP address: assume success\n");
3279   f.helo_verified = TRUE;
3280   }
3281
3282 /* Deal with the more common case when there is a sending IP address */
3283
3284 else if (sender_helo_name[0] == '[')
3285   {
3286   f.helo_verified = Ustrncmp(sender_helo_name+1, sender_host_address,
3287     Ustrlen(sender_host_address)) == 0;
3288
3289 #if HAVE_IPV6
3290   if (!f.helo_verified)
3291     {
3292     if (strncmpic(sender_host_address, US"::ffff:", 7) == 0)
3293       f.helo_verified = Ustrncmp(sender_helo_name + 1,
3294         sender_host_address + 7, Ustrlen(sender_host_address) - 7) == 0;
3295     }
3296 #endif
3297
3298   HDEBUG(D_receive)
3299     { if (f.helo_verified) debug_printf("matched host address\n"); }
3300   }
3301
3302 /* Do a reverse lookup if one hasn't already given a positive or negative
3303 response. If that fails, or the name doesn't match, try checking with a forward
3304 lookup. */
3305
3306 else
3307   {
3308   if (sender_host_name == NULL && !host_lookup_failed)
3309     yield = host_name_lookup() != DEFER;
3310
3311   /* If a host name is known, check it and all its aliases. */
3312
3313   if (sender_host_name)
3314     if ((f.helo_verified = strcmpic(sender_host_name, sender_helo_name) == 0))
3315       {
3316       sender_helo_dnssec = sender_host_dnssec;
3317       HDEBUG(D_receive) debug_printf("matched host name\n");
3318       }
3319     else
3320       {
3321       uschar **aliases = sender_host_aliases;
3322       while (*aliases)
3323         if ((f.helo_verified = strcmpic(*aliases++, sender_helo_name) == 0))
3324           {
3325           sender_helo_dnssec = sender_host_dnssec;
3326           break;
3327           }
3328
3329       HDEBUG(D_receive) if (f.helo_verified)
3330           debug_printf("matched alias %s\n", *(--aliases));
3331       }
3332
3333   /* Final attempt: try a forward lookup of the helo name */
3334
3335   if (!f.helo_verified)
3336     {
3337     int rc;
3338     host_item h =
3339       {.name = sender_helo_name, .address = NULL, .mx = MX_NONE, .next = NULL};
3340     dnssec_domains d =
3341       {.request = US"*", .require = US""};
3342
3343     HDEBUG(D_receive) debug_printf("getting IP address for %s\n",
3344       sender_helo_name);
3345     rc = host_find_bydns(&h, NULL, HOST_FIND_BY_A | HOST_FIND_BY_AAAA,
3346                           NULL, NULL, NULL, &d, NULL, NULL);
3347     if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
3348       for (host_item * hh = &h; hh; hh = hh->next)
3349         if (Ustrcmp(hh->address, sender_host_address) == 0)
3350           {
3351           f.helo_verified = TRUE;
3352           if (h.dnssec == DS_YES) sender_helo_dnssec = TRUE;
3353           HDEBUG(D_receive)
3354             debug_printf("IP address for %s matches calling address\n"
3355               "Forward DNS security status: %sverified\n",
3356               sender_helo_name, sender_helo_dnssec ? "" : "un");
3357           break;
3358           }
3359     }
3360   }
3361
3362 if (!f.helo_verified) f.helo_verify_failed = TRUE;  /* We've tried ... */
3363 return yield;
3364 }
3365
3366
3367
3368
3369 /*************************************************
3370 *        Send user response message              *
3371 *************************************************/
3372
3373 /* This function is passed a default response code and a user message. It calls
3374 smtp_message_code() to check and possibly modify the response code, and then
3375 calls smtp_respond() to transmit the response. I put this into a function
3376 just to avoid a lot of repetition.
3377
3378 Arguments:
3379   code         the response code
3380   user_msg     the user message
3381
3382 Returns:       nothing
3383 */
3384
3385 static void
3386 smtp_user_msg(uschar * code, uschar * user_msg)
3387 {
3388 int len = 3;
3389 smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
3390 smtp_respond(code, len, SR_FINAL, user_msg);
3391 }
3392
3393
3394
3395 static int
3396 smtp_in_auth(auth_instance *au, uschar ** smtp_resp, uschar ** errmsg)
3397 {
3398 const uschar *set_id = NULL;
3399 int rc;
3400
3401 /* Set up globals for error messages */
3402
3403 authenticator_name = au->name;
3404 driver_srcfile = au->srcfile;
3405 driver_srcline = au->srcline;
3406
3407 /* Run the checking code, passing the remainder of the command line as
3408 data. Initials the $auth<n> variables as empty. Initialize $0 empty and set
3409 it as the only set numerical variable. The authenticator may set $auth<n>
3410 and also set other numeric variables. The $auth<n> variables are preferred
3411 nowadays; the numerical variables remain for backwards compatibility.
3412
3413 Afterwards, have a go at expanding the set_id string, even if
3414 authentication failed - for bad passwords it can be useful to log the
3415 userid. On success, require set_id to expand and exist, and put it in
3416 authenticated_id. Save this in permanent store, as the working store gets
3417 reset at HELO, RSET, etc. */
3418
3419 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;
3420 expand_nmax = 0;
3421 expand_nlength[0] = 0;   /* $0 contains nothing */
3422
3423 rc = (au->info->servercode)(au, smtp_cmd_data);
3424 if (au->set_id) set_id = expand_string(au->set_id);
3425 expand_nmax = -1;        /* Reset numeric variables */
3426 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;   /* Reset $auth<n> */
3427 driver_srcfile = authenticator_name = NULL; driver_srcline = 0;
3428
3429 /* The value of authenticated_id is stored in the spool file and printed in
3430 log lines. It must not contain binary zeros or newline characters. In
3431 normal use, it never will, but when playing around or testing, this error
3432 can (did) happen. To guard against this, ensure that the id contains only
3433 printing characters. */
3434
3435 if (set_id) set_id = string_printing(set_id);
3436
3437 /* For the non-OK cases, set up additional logging data if set_id
3438 is not empty. */
3439
3440 if (rc != OK)
3441   set_id = set_id && *set_id
3442     ? string_sprintf(" (set_id=%s)", set_id) : US"";
3443
3444 /* Switch on the result */
3445
3446 switch(rc)
3447   {
3448   case OK:
3449     if (!au->set_id || set_id)    /* Complete success */
3450       {
3451       if (set_id) authenticated_id = string_copy_perm(set_id, TRUE);
3452       sender_host_authenticated = au->name;
3453       sender_host_auth_pubname  = au->public_name;
3454       authentication_failed = FALSE;
3455       authenticated_fail_id = NULL;   /* Impossible to already be set? */
3456
3457       received_protocol =
3458         (sender_host_address ? protocols : protocols_local)
3459           [pextend + pauthed + (tls_in.active.sock >= 0 ? pcrpted:0)];
3460       *smtp_resp = *errmsg = US"235 Authentication succeeded";
3461       authenticated_by = au;
3462       break;
3463       }
3464
3465     /* Authentication succeeded, but we failed to expand the set_id string.
3466     Treat this as a temporary error. */
3467
3468     auth_defer_msg = expand_string_message;
3469     /* Fall through */
3470
3471   case DEFER:
3472     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3473     *smtp_resp = string_sprintf("435 Unable to authenticate at present%s",
3474       auth_defer_user_msg);
3475     *errmsg = string_sprintf("435 Unable to authenticate at present%s: %s",
3476       set_id, auth_defer_msg);
3477     break;
3478
3479   case BAD64:
3480     *smtp_resp = *errmsg = US"501 Invalid base64 data";
3481     break;
3482
3483   case CANCELLED:
3484     *smtp_resp = *errmsg = US"501 Authentication cancelled";
3485     break;
3486
3487   case UNEXPECTED:
3488     *smtp_resp = *errmsg = US"553 Initial data not expected";
3489     break;
3490
3491   case FAIL:
3492     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3493     *smtp_resp = US"535 Incorrect authentication data";
3494     *errmsg = string_sprintf("535 Incorrect authentication data%s", set_id);
3495     break;
3496
3497   default:
3498     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3499     *smtp_resp = US"435 Internal error";
3500     *errmsg = string_sprintf("435 Internal error%s: return %d from authentication "
3501       "check", set_id, rc);
3502     break;
3503   }
3504
3505 return rc;
3506 }
3507
3508
3509
3510
3511
3512 static int
3513 qualify_recipient(uschar ** recipient, uschar * smtp_cmd_data, uschar * tag)
3514 {
3515 int rd;
3516 if (f.allow_unqualified_recipient || strcmpic(*recipient, US"postmaster") == 0)
3517   {
3518   DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
3519     *recipient);
3520   rd = Ustrlen(recipient) + 1;
3521   /* deconst ok as *recipient was not const */
3522   *recipient = US rewrite_address_qualify(*recipient, TRUE);
3523   return rd;
3524   }
3525 smtp_printf("501 %s: recipient address must contain a domain\r\n", SP_NO_MORE,
3526   smtp_cmd_data);
3527 log_write(L_smtp_syntax_error,
3528   LOG_MAIN|LOG_REJECT, "unqualified %s rejected: <%s> %s%s",
3529   tag, *recipient, host_and_ident(TRUE), host_lookup_msg);
3530 return 0;
3531 }
3532
3533
3534
3535
3536 static void
3537 smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
3538 {
3539 HAD(SCH_QUIT);
3540 f.smtp_in_quit = TRUE;
3541 incomplete_transaction_log(US"QUIT");
3542 GET_OPTION("acl_smtp_quit");
3543 if (  acl_smtp_quit
3544    && acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp)
3545         == ERROR)
3546     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
3547       *log_msgp);
3548
3549 #ifdef EXIM_TCP_CORK
3550 (void) setsockopt(fileno(smtp_out), IPPROTO_TCP, EXIM_TCP_CORK, US &on, sizeof(on));
3551 #endif
3552
3553 if (*user_msgp)
3554   smtp_respond(US"221", 3, SR_FINAL, *user_msgp);
3555 else
3556   smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
3557
3558 #ifdef SERVERSIDE_CLOSE_NOWAIT
3559 # ifndef DISABLE_TLS
3560 tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
3561 # endif
3562
3563 log_close_event(US"by QUIT");
3564 #else
3565
3566 # ifndef DISABLE_TLS
3567 tls_close(NULL, TLS_SHUTDOWN_WAIT);
3568 # endif
3569
3570 log_close_event(US"by QUIT");
3571
3572 /* Pause, hoping client will FIN first so that they get the TIME_WAIT.
3573 The socket should become readble (though with no data) */
3574
3575 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3576 #endif  /*!SERVERSIDE_CLOSE_NOWAIT*/
3577 }
3578
3579
3580 static void
3581 smtp_rset_handler(void)
3582 {
3583 HAD(SCH_RSET);
3584 incomplete_transaction_log(US"RSET");
3585 smtp_printf("250 Reset OK\r\n", SP_NO_MORE);
3586 cmd_list[CL_RSET].is_mail_cmd = FALSE;
3587 if (chunking_state > CHUNKING_OFFERED)
3588   chunking_state = CHUNKING_OFFERED;
3589 }
3590
3591
3592 #ifndef DISABLE_WELLKNOWN
3593 static int
3594 smtp_wellknown_handler(void)
3595 {
3596 if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
3597   {
3598   GET_OPTION("acl_smtp_wellknown");
3599   if (acl_smtp_wellknown)
3600     {
3601     uschar * user_msg = NULL, * log_msg;
3602     int rc;
3603
3604     if ((rc = acl_check(ACL_WHERE_WELLKNOWN, NULL, acl_smtp_wellknown,
3605                 &user_msg, &log_msg)) != OK)
3606       return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, rc, user_msg, log_msg);
3607     else if (!wellknown_response)
3608       return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, ERROR, user_msg, log_msg);
3609     smtp_user_msg(US"250", wellknown_response);
3610     return 0;
3611     }
3612   }
3613
3614 smtp_printf("554 not permitted\r\n", SP_NO_MORE);
3615 log_write(0, LOG_MAIN|LOG_REJECT, "rejected \"%s\" from %s",
3616               smtp_cmd_buffer, sender_helo_name, host_and_ident(FALSE));
3617 return 0;
3618 }
3619 #endif
3620
3621
3622 static int
3623 expand_mailmax(const uschar * s)
3624 {
3625 if (!(s = expand_cstring(s)))
3626   log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand smtp_accept_max_per_connection");
3627 return *s ? Uatoi(s) : 0;
3628 }
3629
3630 /*************************************************
3631 *       Initialize for SMTP incoming message     *
3632 *************************************************/
3633
3634 /* This function conducts the initial dialogue at the start of an incoming SMTP
3635 message, and builds a list of recipients. However, if the incoming message
3636 is part of a batch (-bS option) a separate function is called since it would
3637 be messy having tests splattered about all over this function. This function
3638 therefore handles the case where interaction is occurring. The input and output
3639 files are set up in smtp_in and smtp_out.
3640
3641 The global recipients_list is set to point to a vector of recipient_item
3642 blocks, whose number is given by recipients_count. This is extended by the
3643 receive_add_recipient() function. The global variable sender_address is set to
3644 the sender's address. The yield is +1 if a message has been successfully
3645 started, 0 if a QUIT command was encountered or the connection was refused from
3646 the particular host, or -1 if the connection was lost.
3647
3648 Argument: none
3649
3650 Returns:  > 0 message successfully started (reached DATA)
3651           = 0 QUIT read or end of file reached or call refused
3652           < 0 lost connection
3653 */
3654
3655 int
3656 smtp_setup_msg(void)
3657 {
3658 int done = 0;
3659 BOOL toomany = FALSE;
3660 BOOL discarded = FALSE;
3661 BOOL last_was_rej_mail = FALSE;
3662 BOOL last_was_rcpt = FALSE;
3663 rmark reset_point = store_mark();
3664
3665 DEBUG(D_receive) debug_printf("smtp_setup_msg entered\n");
3666
3667 /* Reset for start of new message. We allow one RSET not to be counted as a
3668 nonmail command, for those MTAs that insist on sending it between every
3669 message. Ditto for EHLO/HELO and for STARTTLS, to allow for going in and out of
3670 TLS between messages (an Exim client may do this if it has messages queued up
3671 for the host). Note: we do NOT reset AUTH at this point. */
3672
3673 reset_point = smtp_reset(reset_point);
3674 message_ended = END_NOTSTARTED;
3675
3676 chunking_state = f.chunking_offered ? CHUNKING_OFFERED : CHUNKING_NOT_OFFERED;
3677
3678 cmd_list[CL_RSET].is_mail_cmd = TRUE;
3679 cmd_list[CL_HELO].is_mail_cmd = TRUE;
3680 cmd_list[CL_EHLO].is_mail_cmd = TRUE;
3681 #ifndef DISABLE_TLS
3682 cmd_list[CL_STLS].is_mail_cmd = TRUE;
3683 #endif
3684
3685 if (lwr_receive_getc != NULL)
3686   {
3687   /* This should have already happened, but if we've gotten confused,
3688   force a reset here. */
3689   DEBUG(D_receive) debug_printf("WARNING: smtp_setup_msg had to restore receive functions to lowers\n");
3690   bdat_pop_receive_functions();
3691   }
3692
3693 /* Set the local signal handler for SIGTERM - it tries to end off tidily */
3694
3695 had_command_sigterm = 0;
3696 os_non_restarting_signal(SIGTERM, command_sigterm_handler);
3697
3698 /* Batched SMTP is handled in a different function. */
3699
3700 if (smtp_batched_input) return smtp_setup_batch_msg();
3701
3702 #ifdef TCP_QUICKACK
3703 if (smtp_in)            /* Avoid pure-ACKs while in cmd pingpong phase */
3704   (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
3705           US &off, sizeof(off));
3706 #endif
3707
3708 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
3709 value. The values are 2 larger than the required yield of the function. */
3710
3711 while (done <= 0)
3712   {
3713   const uschar **argv;
3714   uschar *etrn_command;
3715   uschar *etrn_serialize_key;
3716   uschar *errmess;
3717   uschar *log_msg, *smtp_code;
3718   uschar *user_msg = NULL;
3719   uschar *recipient = NULL;
3720   uschar *hello = NULL;
3721   uschar *s, *ss;
3722   BOOL was_rej_mail = FALSE;
3723   BOOL was_rcpt = FALSE;
3724   void (*oldsignal)(int);
3725   pid_t pid;
3726   int start, end, sender_domain, recipient_domain;
3727   int rc, c;
3728   uschar * orcpt = NULL;
3729   int dsn_flags;
3730   gstring * g;
3731
3732 #ifdef AUTH_TLS
3733   /* Check once per STARTTLS or SSL-on-connect for a TLS AUTH */
3734   if (  tls_in.active.sock >= 0
3735      && tls_in.peercert
3736      && tls_in.certificate_verified
3737      && cmd_list[CL_TLAU].is_mail_cmd
3738      )
3739     {
3740     cmd_list[CL_TLAU].is_mail_cmd = FALSE;
3741
3742     for (auth_instance * au = auths; au; au = au->next)
3743       if (strcmpic(US"tls", au->driver_name) == 0)
3744         {
3745         GET_OPTION("acl_smtp_auth");
3746         if (  acl_smtp_auth
3747            && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3748                       &user_msg, &log_msg)) != OK
3749            )
3750           done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3751         else
3752           {
3753           smtp_cmd_data = NULL;
3754
3755           if (smtp_in_auth(au, &s, &ss) == OK)
3756             { DEBUG(D_auth) debug_printf("tls auth succeeded\n"); }
3757           else
3758             {
3759             DEBUG(D_auth) debug_printf("tls auth not succeeded\n");
3760 #ifndef DISABLE_EVENT
3761              {
3762               uschar * save_name = sender_host_authenticated, * logmsg;
3763               sender_host_authenticated = au->name;
3764               if ((logmsg = event_raise(event_action, US"auth:fail", s, NULL)))
3765                 log_write(0, LOG_MAIN, "%s", logmsg);
3766               sender_host_authenticated = save_name;
3767              }
3768 #endif
3769             }
3770           }
3771         break;
3772         }
3773     }
3774 #endif
3775
3776   switch(smtp_read_command(
3777 #ifndef DISABLE_PIPE_CONNECT
3778           !fl.pipe_connect_acceptable,
3779 #else
3780           TRUE,
3781 #endif
3782           GETC_BUFFER_UNLIMITED))
3783     {
3784     /* The AUTH command is not permitted to occur inside a transaction, and may
3785     occur successfully only once per connection. Actually, that isn't quite
3786     true. When TLS is started, all previous information about a connection must
3787     be discarded, so a new AUTH is permitted at that time.
3788
3789     AUTH may only be used when it has been advertised. However, it seems that
3790     there are clients that send AUTH when it hasn't been advertised, some of
3791     them even doing this after HELO. And there are MTAs that accept this. Sigh.
3792     So there's a get-out that allows this to happen.
3793
3794     AUTH is initially labelled as a "nonmail command" so that one occurrence
3795     doesn't get counted. We change the label here so that multiple failing
3796     AUTHS will eventually hit the nonmail threshold. */
3797
3798     case AUTH_CMD:
3799       HAD(SCH_AUTH);
3800       authentication_failed = TRUE;
3801       cmd_list[CL_AUTH].is_mail_cmd = FALSE;
3802
3803       if (!fl.auth_advertised && !f.allow_auth_unadvertised)
3804         {
3805         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3806           US"AUTH command used when not advertised");
3807         break;
3808         }
3809       if (sender_host_authenticated)
3810         {
3811         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3812           US"already authenticated");
3813         break;
3814         }
3815       if (sender_address)
3816         {
3817         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3818           US"not permitted in mail transaction");
3819         break;
3820         }
3821
3822       /* Check the ACL */
3823
3824       GET_OPTION("acl_smtp_auth");
3825       if (  acl_smtp_auth
3826          && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3827                     &user_msg, &log_msg)) != OK
3828          )
3829         {
3830         done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3831         break;
3832         }
3833
3834       /* Find the name of the requested authentication mechanism. */
3835
3836       s = smtp_cmd_data;
3837       for (; (c = *smtp_cmd_data) && !isspace(c); smtp_cmd_data++)
3838         if (!isalnum(c) && c != '-' && c != '_')
3839           {
3840           done = synprot_error(L_smtp_syntax_error, 501, NULL,
3841             US"invalid character in authentication mechanism name");
3842           goto COMMAND_LOOP;
3843           }
3844
3845       /* If not at the end of the line, we must be at white space. Terminate the
3846       name and move the pointer on to any data that may be present. */
3847
3848       if (*smtp_cmd_data)
3849         {
3850         *smtp_cmd_data++ = '\0';
3851         Uskip_whitespace(&smtp_cmd_data);
3852         }
3853
3854       /* Search for an authentication mechanism which is configured for use
3855       as a server and which has been advertised (unless, sigh, allow_auth_
3856       unadvertised is set). */
3857
3858         {
3859         auth_instance * au;
3860         uschar * smtp_resp, * errmsg;
3861
3862         for (au = auths; au; au = au->next)
3863           if (strcmpic(s, au->public_name) == 0 && au->server &&
3864               (au->advertised || f.allow_auth_unadvertised))
3865             break;
3866
3867         if (au)
3868           {
3869           int rc = smtp_in_auth(au, &smtp_resp, &errmsg);
3870
3871           smtp_printf("%s\r\n", SP_NO_MORE, smtp_resp);
3872           if (rc != OK)
3873             {
3874             uschar * logmsg = NULL;
3875 #ifndef DISABLE_EVENT
3876              {uschar * save_name = sender_host_authenticated;
3877               sender_host_authenticated = au->name;
3878               logmsg = event_raise(event_action, US"auth:fail", smtp_resp, NULL);
3879               sender_host_authenticated = save_name;
3880              }
3881 #endif
3882             if (logmsg)
3883               log_write(0, LOG_MAIN|LOG_REJECT, "%s", logmsg);
3884             else
3885               log_write(0, LOG_MAIN|LOG_REJECT, "%s authenticator failed for %s: %s",
3886                 au->name, host_and_ident(FALSE), errmsg);
3887             }
3888           }
3889         else
3890           done = synprot_error(L_smtp_protocol_error, 504, NULL,
3891             string_sprintf("%s authentication mechanism not supported", s));
3892         }
3893
3894       break;  /* AUTH_CMD */
3895
3896     /* The HELO/EHLO commands are permitted to appear in the middle of a
3897     session as well as at the beginning. They have the effect of a reset in
3898     addition to their other functions. Their absence at the start cannot be
3899     taken to be an error.
3900
3901     RFC 2821 says:
3902
3903       If the EHLO command is not acceptable to the SMTP server, 501, 500,
3904       or 502 failure replies MUST be returned as appropriate.  The SMTP
3905       server MUST stay in the same state after transmitting these replies
3906       that it was in before the EHLO was received.
3907
3908     Therefore, we do not do the reset until after checking the command for
3909     acceptability. This change was made for Exim release 4.11. Previously
3910     it did the reset first. */
3911
3912     case HELO_CMD:
3913       HAD(SCH_HELO);
3914       hello = US"HELO";
3915       fl.esmtp = FALSE;
3916       goto HELO_EHLO;
3917
3918     case EHLO_CMD:
3919       HAD(SCH_EHLO);
3920       hello = US"EHLO";
3921       fl.esmtp = TRUE;
3922
3923     HELO_EHLO:      /* Common code for HELO and EHLO */
3924       cmd_list[CL_HELO].is_mail_cmd = FALSE;
3925       cmd_list[CL_EHLO].is_mail_cmd = FALSE;
3926
3927       /* Reject the HELO if its argument was invalid or non-existent. A
3928       successful check causes the argument to be saved in malloc store. */
3929
3930       if (!check_helo(smtp_cmd_data))
3931         {
3932         smtp_printf("501 Syntactically invalid %s argument(s)\r\n", SP_NO_MORE, hello);
3933
3934         log_write(0, LOG_MAIN|LOG_REJECT, "rejected %s from %s: syntactically "
3935           "invalid argument(s): %s", hello, host_and_ident(FALSE),
3936           *smtp_cmd_argument == 0 ? US"(no argument given)" :
3937                              string_printing(smtp_cmd_argument));
3938
3939         if (++synprot_error_count > smtp_max_synprot_errors)
3940           {
3941           log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
3942             "syntax or protocol errors (last command was \"%s\", %Y)",
3943             host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
3944             s_connhad_log(NULL)
3945             );
3946           done = 1;
3947           }
3948
3949         break;
3950         }
3951
3952       /* If sender_host_unknown is true, we have got here via the -bs interface,
3953       not called from inetd. Otherwise, we are running an IP connection and the
3954       host address will be set. If the helo name is the primary name of this
3955       host and we haven't done a reverse lookup, force one now. If helo_verify_required
3956       is set, ensure that the HELO name matches the actual host. If helo_verify
3957       is set, do the same check, but softly. */
3958
3959       if (!f.sender_host_unknown)
3960         {
3961         BOOL old_helo_verified = f.helo_verified;
3962         uschar * p = smtp_cmd_data;
3963
3964         while (*p && !isspace(*p)) { *p = tolower(*p); p++; }
3965         *p = '\0';
3966
3967         /* Force a reverse lookup if HELO quoted something in helo_lookup_domains
3968         because otherwise the log can be confusing. */
3969
3970         if (  !sender_host_name
3971            && match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0,
3972                 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK)
3973           (void)host_name_lookup();
3974
3975         /* Rebuild the fullhost info to include the HELO name (and the real name
3976         if it was looked up.) */
3977
3978         host_build_sender_fullhost();  /* Rebuild */
3979         set_process_info("handling%s incoming connection from %s",
3980           tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
3981
3982         /* Verify if configured. This doesn't give much security, but it does
3983         make some people happy to be able to do it. If helo_verify_required is set,
3984         (host matches helo_verify_hosts) failure forces rejection. If helo_verify
3985         is set (host matches helo_try_verify_hosts), it does not. This is perhaps
3986         now obsolescent, since the verification can now be requested selectively
3987         at ACL time. */
3988
3989         f.helo_verified = f.helo_verify_failed = sender_helo_dnssec = FALSE;
3990         if (fl.helo_verify_required || fl.helo_verify)
3991           {
3992           BOOL tempfail = !smtp_verify_helo();
3993           if (!f.helo_verified)
3994             {
3995             if (fl.helo_verify_required)
3996               {
3997               smtp_printf("%d %s argument does not match calling host\r\n", SP_NO_MORE,
3998                 tempfail? 451 : 550, hello);
3999               log_write(0, LOG_MAIN|LOG_REJECT, "%srejected \"%s %s\" from %s",
4000                 tempfail? "temporarily " : "",
4001                 hello, sender_helo_name, host_and_ident(FALSE));
4002               f.helo_verified = old_helo_verified;
4003               break;                   /* End of HELO/EHLO processing */
4004               }
4005             HDEBUG(D_all) debug_printf("%s verification failed but host is in "
4006               "helo_try_verify_hosts\n", hello);
4007             }
4008           }
4009         }
4010
4011 #ifdef SUPPORT_SPF
4012       /* set up SPF context */
4013       spf_conn_init(sender_helo_name, sender_host_address);
4014 #endif
4015
4016       /* Apply an ACL check if one is defined; afterwards, recheck
4017       synchronization in case the client started sending in a delay. */
4018
4019       GET_OPTION("acl_smtp_helo");
4020       if (acl_smtp_helo)
4021         if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
4022                   &user_msg, &log_msg)) != OK)
4023           {
4024           done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg);
4025           sender_helo_name = NULL;
4026           host_build_sender_fullhost();  /* Rebuild */
4027           break;
4028           }
4029 #ifndef DISABLE_PIPE_CONNECT
4030         else if (!fl.pipe_connect_acceptable && !check_sync())
4031 #else
4032         else if (!check_sync())
4033 #endif
4034           goto SYNC_FAILURE;
4035
4036       /* Generate an OK reply. The default string includes the ident if present,
4037       and also the IP address if present. Reflecting back the ident is intended
4038       as a deterrent to mail forgers. For maximum efficiency, and also because
4039       some broken systems expect each response to be in a single packet, arrange
4040       that the entire reply is sent in one write(). */
4041
4042       fl.auth_advertised = FALSE;
4043       f.smtp_in_pipelining_advertised = FALSE;
4044 #ifndef DISABLE_TLS
4045       fl.tls_advertised = FALSE;
4046 #endif
4047       fl.dsn_advertised = FALSE;
4048 #ifdef SUPPORT_I18N
4049       fl.smtputf8_advertised = FALSE;
4050 #endif
4051
4052       /* Expand the per-connection message count limit option */
4053       smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4054
4055       smtp_code = US"250 ";        /* Default response code plus space*/
4056       if (!user_msg)
4057         {
4058         /* sender_host_name below will be tainted, so save on copy when we hit it */
4059         g = string_get_tainted(24, GET_TAINTED);
4060         g = string_fmt_append(g, "%.3s %s Hello %s%s%s",
4061           smtp_code,
4062           smtp_active_hostname,
4063           sender_ident ? sender_ident : US"",
4064           sender_ident ? US" at " : US"",
4065           sender_host_name ? sender_host_name : sender_helo_name);
4066
4067         if (sender_host_address)
4068           g = string_fmt_append(g, " [%s]", sender_host_address);
4069         }
4070
4071       /* A user-supplied EHLO greeting may not contain more than one line. Note
4072       that the code returned by smtp_message_code() includes the terminating
4073       whitespace character. */
4074
4075       else
4076         {
4077         char * ss;
4078         int codelen = 4;
4079         smtp_message_code(&smtp_code, &codelen, &user_msg, NULL, TRUE);
4080         s = string_sprintf("%.*s%s", codelen, smtp_code, user_msg);
4081         if ((ss = strpbrk(CS s, "\r\n")) != NULL)
4082           {
4083           log_write(0, LOG_MAIN|LOG_PANIC, "EHLO/HELO response must not contain "
4084             "newlines: message truncated: %s", string_printing(s));
4085           *ss = 0;
4086           }
4087         g = string_cat(NULL, s);
4088         }
4089
4090       g = string_catn(g, US"\r\n", 2);
4091
4092       /* If we received EHLO, we must create a multiline response which includes
4093       the functions supported. */
4094
4095       if (fl.esmtp)
4096         {
4097         g->s[3] = '-';  /* overwrite the space after the SMTP response code */
4098
4099         /* I'm not entirely happy with this, as an MTA is supposed to check
4100         that it has enough room to accept a message of maximum size before
4101         it sends this. However, there seems little point in not sending it.
4102         The actual size check happens later at MAIL FROM time. By postponing it
4103         till then, VRFY and EXPN can be used after EHLO when space is short. */
4104
4105         if (thismessage_size_limit > 0)
4106           g = string_fmt_append(g, "%.3s-SIZE %d\r\n", smtp_code,
4107             thismessage_size_limit);
4108         else
4109           {
4110           g = string_catn(g, smtp_code, 3);
4111           g = string_catn(g, US"-SIZE\r\n", 7);
4112           }
4113
4114 #ifndef DISABLE_ESMTP_LIMITS
4115         if (  (smtp_mailcmd_max > 0 || recipients_max_expanded > 0)
4116            && verify_check_host(&limits_advertise_hosts) == OK)
4117           {
4118           g = string_fmt_append(g, "%.3s-LIMITS", smtp_code);
4119           if (smtp_mailcmd_max > 0)
4120             g = string_fmt_append(g, " MAILMAX=%d", smtp_mailcmd_max);
4121           if (recipients_max_expanded > 0)
4122             g = string_fmt_append(g, " RCPTMAX=%d", recipients_max_expanded);
4123           g = string_catn(g, US"\r\n", 2);
4124           }
4125 #endif
4126
4127         /* Exim does not do protocol conversion or data conversion. It is 8-bit
4128         clean; if it has an 8-bit character in its hand, it just sends it. It
4129         cannot therefore specify 8BITMIME and remain consistent with the RFCs.
4130         However, some users want this option simply in order to stop MUAs
4131         mangling messages that contain top-bit-set characters. It is therefore
4132         provided as an option. */
4133
4134         if (accept_8bitmime)
4135           {
4136           g = string_catn(g, smtp_code, 3);
4137           g = string_catn(g, US"-8BITMIME\r\n", 11);
4138           }
4139
4140         /* Advertise DSN support if configured to do so. */
4141         if (verify_check_host(&dsn_advertise_hosts) != FAIL)
4142           {
4143           g = string_catn(g, smtp_code, 3);
4144           g = string_catn(g, US"-DSN\r\n", 6);
4145           fl.dsn_advertised = TRUE;
4146           }
4147
4148         /* Advertise ETRN/VRFY/EXPN if there's are ACL checking whether a host is
4149         permitted to issue them; a check is made when any host actually tries. */
4150
4151         GET_OPTION("acl_smtp_etrn");
4152         if (acl_smtp_etrn)
4153           {
4154           g = string_catn(g, smtp_code, 3);
4155           g = string_catn(g, US"-ETRN\r\n", 7);
4156           }
4157         GET_OPTION("acl_smtp_vrfy");
4158         if (acl_smtp_vrfy)
4159           {
4160           g = string_catn(g, smtp_code, 3);
4161           g = string_catn(g, US"-VRFY\r\n", 7);
4162           }
4163         GET_OPTION("acl_smtp_expn");
4164         if (acl_smtp_expn)
4165           {
4166           g = string_catn(g, smtp_code, 3);
4167           g = string_catn(g, US"-EXPN\r\n", 7);
4168           }
4169
4170         /* Exim is quite happy with pipelining, so let the other end know that
4171         it is safe to use it, unless advertising is disabled. */
4172
4173         if (  f.pipelining_enable
4174            && verify_check_host(&pipelining_advertise_hosts) == OK)
4175           {
4176           g = string_catn(g, smtp_code, 3);
4177           g = string_catn(g, US"-PIPELINING\r\n", 13);
4178           sync_cmd_limit = NON_SYNC_CMD_PIPELINING;
4179           f.smtp_in_pipelining_advertised = TRUE;
4180
4181 #ifndef DISABLE_PIPE_CONNECT
4182           if (fl.pipe_connect_acceptable)
4183             {
4184             f.smtp_in_early_pipe_advertised = TRUE;
4185             g = string_catn(g, smtp_code, 3);
4186             g = string_catn(g, US"-" EARLY_PIPE_FEATURE_NAME "\r\n", EARLY_PIPE_FEATURE_LEN+3);
4187             }
4188 #endif
4189           }
4190
4191
4192         /* If any server authentication mechanisms are configured, advertise
4193         them if the current host is in auth_advertise_hosts. The problem with
4194         advertising always is that some clients then require users to
4195         authenticate (and aren't configurable otherwise) even though it may not
4196         be necessary (e.g. if the host is in host_accept_relay).
4197
4198         RFC 2222 states that SASL mechanism names contain only upper case
4199         letters, so output the names in upper case, though we actually recognize
4200         them in either case in the AUTH command. */
4201
4202         if (  auths
4203 #ifdef AUTH_TLS
4204            && !sender_host_authenticated
4205 #endif
4206            && verify_check_host(&auth_advertise_hosts) == OK
4207            )
4208           {
4209           BOOL first = TRUE;
4210           for (auth_instance * au = auths; au; au = au->next)
4211             {
4212             au->advertised = FALSE;
4213             if (au->server)
4214               {
4215               DEBUG(D_auth+D_expand) debug_printf_indent(
4216                 "Evaluating advertise_condition for %s %s athenticator\n",
4217                 au->name, au->public_name);
4218               if (  !au->advertise_condition
4219                  || expand_check_condition(au->advertise_condition, au->name,
4220                         US"authenticator")
4221                  )
4222                 {
4223                 int saveptr;
4224                 if (first)
4225                   {
4226                   g = string_catn(g, smtp_code, 3);
4227                   g = string_catn(g, US"-AUTH", 5);
4228                   first = FALSE;
4229                   fl.auth_advertised = TRUE;
4230                   }
4231                 saveptr = gstring_length(g);
4232                 g = string_catn(g, US" ", 1);
4233                 g = string_cat(g, au->public_name);
4234                 while (++saveptr < g->ptr) g->s[saveptr] = toupper(g->s[saveptr]);
4235                 au->advertised = TRUE;
4236                 }
4237               }
4238             }
4239
4240           if (!first) g = string_catn(g, US"\r\n", 2);
4241           }
4242
4243         /* RFC 3030 CHUNKING */
4244
4245         if (verify_check_host(&chunking_advertise_hosts) != FAIL)
4246           {
4247           g = string_catn(g, smtp_code, 3);
4248           g = string_catn(g, US"-CHUNKING\r\n", 11);
4249           f.chunking_offered = TRUE;
4250           chunking_state = CHUNKING_OFFERED;
4251           }
4252
4253 #ifndef DISABLE_TLS
4254         /* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
4255         if it has been included in the binary, and the host matches
4256         tls_advertise_hosts. We must *not* advertise if we are already in a
4257         secure connection. */
4258
4259         if (tls_in.active.sock < 0 &&
4260             verify_check_host(&tls_advertise_hosts) != FAIL)
4261           {
4262           g = string_catn(g, smtp_code, 3);
4263           g = string_catn(g, US"-STARTTLS\r\n", 11);
4264           fl.tls_advertised = TRUE;
4265           }
4266 #endif
4267 #ifdef EXPERIMENTAL_XCLIENT
4268         if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
4269           {
4270           g = string_catn(g, smtp_code, 3);
4271           g = xclient_smtp_advertise_str(g);
4272           }
4273 #endif
4274 #ifndef DISABLE_PRDR
4275         /* Per Recipient Data Response, draft by Eric A. Hall extending RFC */
4276         if (prdr_enable)
4277           {
4278           g = string_catn(g, smtp_code, 3);
4279           g = string_catn(g, US"-PRDR\r\n", 7);
4280           }
4281 #endif
4282
4283 #ifdef SUPPORT_I18N
4284         if (  accept_8bitmime
4285            && verify_check_host(&smtputf8_advertise_hosts) != FAIL)
4286           {
4287           g = string_catn(g, smtp_code, 3);
4288           g = string_catn(g, US"-SMTPUTF8\r\n", 11);
4289           fl.smtputf8_advertised = TRUE;
4290           }
4291 #endif
4292 #ifndef DISABLE_WELLKNOWN
4293         if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
4294           {
4295           g = string_catn(g, smtp_code, 3);
4296           g = string_catn(g, US"-WELLKNOWN\r\n", 12);
4297           }
4298 #endif
4299
4300         /* Finish off the multiline reply with one that is always available. */
4301
4302         g = string_catn(g, smtp_code, 3);
4303         g = string_catn(g, US" HELP\r\n", 7);
4304         }
4305
4306       /* Terminate the string (for debug), write it, and note that HELO/EHLO
4307       has been seen. */
4308
4309        {
4310         uschar * ehlo_resp;
4311         int len = len_string_from_gstring(g, &ehlo_resp);
4312 #ifndef DISABLE_TLS
4313         if (tls_in.active.sock >= 0)
4314           (void) tls_write(NULL, ehlo_resp, len,
4315 # ifndef DISABLE_PIPE_CONNECT
4316                           fl.pipe_connect_acceptable && pipeline_connect_sends());
4317 # else
4318                           FALSE);
4319 # endif
4320         else
4321 #endif
4322           (void) fwrite(ehlo_resp, 1, len, smtp_out);
4323
4324         DEBUG(D_receive) for (const uschar * t, * s = ehlo_resp;
4325                               s && (t = Ustrchr(s, '\r'));
4326                               s = t + 2)                                /* \r\n */
4327             debug_printf("%s %.*s\n",
4328                           s == g->s ? "SMTP>>" : "      ",
4329                           (int)(t - s), s);
4330         fl.helo_seen = TRUE;
4331        }
4332
4333       /* Reset the protocol and the state, abandoning any previous message. */
4334       received_protocol =
4335         (sender_host_address ? protocols : protocols_local)
4336           [ (fl.esmtp
4337             ? pextend + (sender_host_authenticated ? pauthed : 0)
4338             : pnormal)
4339           + (tls_in.active.sock >= 0 ? pcrpted : 0)
4340           ];
4341       cancel_cutthrough_connection(TRUE, US"sent EHLO response");
4342       reset_point = smtp_reset(reset_point);
4343       toomany = FALSE;
4344       break;   /* HELO/EHLO */
4345
4346 #ifndef DISABLE_WELLKNOWN
4347     case WELLKNOWN_CMD:
4348       HAD(SCH_WELLKNOWN);
4349       smtp_mailcmd_count++;
4350       smtp_wellknown_handler();
4351       break;
4352 #endif
4353
4354 #ifdef EXPERIMENTAL_XCLIENT
4355     case XCLIENT_CMD:
4356       {
4357       BOOL fatal = fl.helo_seen;
4358       uschar * errmsg;
4359       int resp;
4360
4361       HAD(SCH_XCLIENT);
4362       smtp_mailcmd_count++;
4363
4364       if ((errmsg = xclient_smtp_command(smtp_cmd_data, &resp, &fatal)))
4365         if (fatal)
4366           done = synprot_error(L_smtp_syntax_error, resp, NULL, errmsg);
4367         else
4368           {
4369           smtp_printf("%d %s\r\n", SP_NO_MORE, resp, errmsg);
4370           log_write(0, LOG_MAIN|LOG_REJECT, "rejected XCLIENT from %s: %s",
4371             host_and_ident(FALSE), errmsg);
4372           }
4373       else
4374         {
4375         fl.helo_seen = FALSE;                   /* Require another EHLO */
4376         smtp_code = string_sprintf("%d", resp);
4377
4378         /*XXX unclear in spec. if this needs to be an ESMTP banner,
4379         nor whether we get the original client's HELO after (or a proxy fake).
4380         We require that we do; the following HELO/EHLO handling will set
4381         sender_helo_name as normal. */
4382
4383         smtp_printf("%s XCLIENT success\r\n", SP_NO_MORE, smtp_code);
4384         }
4385       break; /* XCLIENT */
4386       }
4387 #endif
4388
4389
4390     /* The MAIL command requires an address as an operand. All we do
4391     here is to parse it for syntactic correctness. The form "<>" is
4392     a special case which converts into an empty string. The start/end
4393     pointers in the original are not used further for this address, as
4394     it is the canonical extracted address which is all that is kept. */
4395
4396     case MAIL_CMD:
4397       HAD(SCH_MAIL);
4398       smtp_mailcmd_count++;              /* Count for limit and ratelimit */
4399       message_start();
4400       was_rej_mail = TRUE;               /* Reset if accepted */
4401       env_mail_type_t * mail_args;       /* Sanity check & validate args */
4402
4403       if (!fl.helo_seen)
4404         if (  fl.helo_verify_required
4405            || verify_check_host(&hosts_require_helo) == OK)
4406           {
4407           log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
4408             "HELO/EHLO given", host_and_ident(FALSE));
4409           done = synprot_error(L_smtp_protocol_error, 503, NULL,
4410                       US"HELO or EHLO required");
4411           break;
4412           }
4413         else if (smtp_mailcmd_max < 0)
4414           smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4415
4416       if (sender_address)
4417         {
4418         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4419           US"sender already given");
4420         break;
4421         }
4422
4423       if (!*smtp_cmd_data)
4424         {
4425         done = synprot_error(L_smtp_protocol_error, 501, NULL,
4426           US"MAIL must have an address operand");
4427         break;
4428         }
4429
4430       /* Check to see if the limit for messages per connection would be
4431       exceeded by accepting further messages. */
4432
4433       if (smtp_mailcmd_max > 0 && smtp_mailcmd_count > smtp_mailcmd_max)
4434         {
4435         smtp_printf("421 too many messages in this connection\r\n", SP_NO_MORE);
4436         log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL command %s: too many "
4437           "messages in one connection", host_and_ident(TRUE));
4438         break;
4439         }
4440
4441       /* Reset for start of message - even if this is going to fail, we
4442       obviously need to throw away any previous data. */
4443
4444       cancel_cutthrough_connection(TRUE, US"MAIL received");
4445       reset_point = smtp_reset(reset_point);
4446       toomany = FALSE;
4447       sender_data = recipient_data = NULL;
4448
4449       /* Loop, checking for ESMTP additions to the MAIL FROM command. */
4450
4451       if (fl.esmtp) for(;;)
4452         {
4453         uschar *name, *value, *end;
4454         unsigned long int size;
4455         BOOL arg_error = FALSE;
4456
4457         if (!extract_option(&name, &value)) break;
4458
4459         for (mail_args = env_mail_type_list;
4460              mail_args->value != ENV_MAIL_OPT_NULL;
4461              mail_args++
4462             )
4463           if (strcmpic(name, mail_args->name) == 0)
4464             break;
4465         if (mail_args->need_value && strcmpic(value, US"") == 0)
4466           break;
4467
4468         switch(mail_args->value)
4469           {
4470           /* Handle SIZE= by reading the value. We don't do the check till later,
4471           in order to be able to log the sender address on failure. */
4472           case ENV_MAIL_OPT_SIZE:
4473             if (((size = Ustrtoul(value, &end, 10)), *end == 0))
4474               {
4475               if ((size == ULONG_MAX && errno == ERANGE) || size > INT_MAX)
4476                 size = INT_MAX;
4477               message_size = (int)size;
4478               }
4479             else
4480               arg_error = TRUE;
4481             break;
4482
4483           /* If this session was initiated with EHLO and accept_8bitmime is set,
4484           Exim will have indicated that it supports the BODY=8BITMIME option. In
4485           fact, it does not support this according to the RFCs, in that it does not
4486           take any special action for forwarding messages containing 8-bit
4487           characters. That is why accept_8bitmime is not the default setting, but
4488           some sites want the action that is provided. We recognize both "8BITMIME"
4489           and "7BIT" as body types, but take no action. */
4490           case ENV_MAIL_OPT_BODY:
4491             if (accept_8bitmime) {
4492               if (strcmpic(value, US"8BITMIME") == 0)
4493                 body_8bitmime = 8;
4494               else if (strcmpic(value, US"7BIT") == 0)
4495                 body_8bitmime = 7;
4496               else
4497                 {
4498                 body_8bitmime = 0;
4499                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4500                   US"invalid data for BODY");
4501                 goto COMMAND_LOOP;
4502                 }
4503               DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
4504               break;
4505             }
4506             arg_error = TRUE;
4507             break;
4508
4509           /* Handle the two DSN options, but only if configured to do so (which
4510           will have caused "DSN" to be given in the EHLO response). The code itself
4511           is included only if configured in at build time. */
4512
4513           case ENV_MAIL_OPT_RET:
4514             if (fl.dsn_advertised)
4515               {
4516               /* Check if RET has already been set */
4517               if (dsn_ret > 0)
4518                 {
4519                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4520                   US"RET can be specified once only");
4521                 goto COMMAND_LOOP;
4522                 }
4523               dsn_ret = strcmpic(value, US"HDRS") == 0
4524                 ? dsn_ret_hdrs
4525                 : strcmpic(value, US"FULL") == 0
4526                 ? dsn_ret_full
4527                 : 0;
4528               DEBUG(D_receive) debug_printf("DSN_RET: %d\n", dsn_ret);
4529               /* Check for invalid invalid value, and exit with error */
4530               if (dsn_ret == 0)
4531                 {
4532                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4533                   US"Value for RET is invalid");
4534                 goto COMMAND_LOOP;
4535                 }
4536               }
4537             break;
4538           case ENV_MAIL_OPT_ENVID:
4539             if (fl.dsn_advertised)
4540               {
4541               /* Check if the dsn envid has been already set */
4542               if (dsn_envid)
4543                 {
4544                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4545                   US"ENVID can be specified once only");
4546                 goto COMMAND_LOOP;
4547                 }
4548               dsn_envid = string_copy(value);
4549               DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid);
4550               }
4551             break;
4552
4553           /* Handle the AUTH extension. If the value given is not "<>" and either
4554           the ACL says "yes" or there is no ACL but the sending host is
4555           authenticated, we set it up as the authenticated sender. However, if the
4556           authenticator set a condition to be tested, we ignore AUTH on MAIL unless
4557           the condition is met. The value of AUTH is an xtext, which means that +,
4558           = and cntrl chars are coded in hex; however "<>" is unaffected by this
4559           coding. */
4560           case ENV_MAIL_OPT_AUTH:
4561             if (Ustrcmp(value, "<>") != 0)
4562               {
4563               int rc;
4564               uschar *ignore_msg;
4565
4566               if (auth_xtextdecode(value, &authenticated_sender) < 0)
4567                 {
4568                 /* Put back terminator overrides for error message */
4569                 value[-1] = '=';
4570                 name[-1] = ' ';
4571                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4572                   US"invalid data for AUTH");
4573                 goto COMMAND_LOOP;
4574                 }
4575               GET_OPTION("acl_smtp_mailauth");
4576               if (!acl_smtp_mailauth)
4577                 {
4578                 ignore_msg = US"client not authenticated";
4579                 rc = sender_host_authenticated ? OK : FAIL;
4580                 }
4581               else
4582                 {
4583                 ignore_msg = US"rejected by ACL";
4584                 rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth,
4585                   &user_msg, &log_msg);
4586                 }
4587
4588               switch (rc)
4589                 {
4590                 case OK:
4591                   if (authenticated_by == NULL ||
4592                       authenticated_by->mail_auth_condition == NULL ||
4593                       expand_check_condition(authenticated_by->mail_auth_condition,
4594                           authenticated_by->name, US"authenticator"))
4595                     break;     /* Accept the AUTH */
4596
4597                   ignore_msg = US"server_mail_auth_condition failed";
4598                   if (authenticated_id != NULL)
4599                     ignore_msg = string_sprintf("%s: authenticated ID=\"%s\"",
4600                       ignore_msg, authenticated_id);
4601
4602                 /* Fall through */
4603
4604                 case FAIL:
4605                   authenticated_sender = NULL;
4606                   log_write(0, LOG_MAIN, "ignoring AUTH=%s from %s (%s)",
4607                     value, host_and_ident(TRUE), ignore_msg);
4608                   break;
4609
4610                 /* Should only get DEFER or ERROR here. Put back terminator
4611                 overrides for error message */
4612
4613                 default:
4614                   value[-1] = '=';
4615                   name[-1] = ' ';
4616                   (void)smtp_handle_acl_fail(ACL_WHERE_MAILAUTH, rc, user_msg,
4617                     log_msg);
4618                   goto COMMAND_LOOP;
4619                 }
4620               }
4621               break;
4622
4623 #ifndef DISABLE_PRDR
4624           case ENV_MAIL_OPT_PRDR:
4625             if (prdr_enable)
4626               prdr_requested = TRUE;
4627             break;
4628 #endif
4629
4630 #ifdef SUPPORT_I18N
4631           case ENV_MAIL_OPT_UTF8:
4632             if (!fl.smtputf8_advertised)
4633               {
4634               done = synprot_error(L_smtp_syntax_error, 501, NULL,
4635                 US"SMTPUTF8 used when not advertised");
4636               goto COMMAND_LOOP;
4637               }
4638
4639             DEBUG(D_receive) debug_printf("smtputf8 requested\n");
4640             message_smtputf8 = allow_utf8_domains = TRUE;
4641             if (Ustrncmp(received_protocol, US"utf8", 4) != 0)
4642               {
4643               int old_pool = store_pool;
4644               store_pool = POOL_PERM;
4645               received_protocol = string_sprintf("utf8%s", received_protocol);
4646               store_pool = old_pool;
4647               }
4648             break;
4649 #endif
4650
4651           /* No valid option. Stick back the terminator characters and break
4652           the loop.  Do the name-terminator second as extract_option sets
4653           value==name when it found no equal-sign.
4654           An error for a malformed address will occur. */
4655           case ENV_MAIL_OPT_NULL:
4656             value[-1] = '=';
4657             name[-1] = ' ';
4658             arg_error = TRUE;
4659             break;
4660
4661           default:  assert(0);
4662           }
4663         /* Break out of for loop if switch() had bad argument or
4664            when start of the email address is reached */
4665         if (arg_error) break;
4666         }
4667
4668       /* If we have passed the threshold for rate limiting, apply the current
4669       delay, and update it for next time, provided this is a limited host. */
4670
4671       if (smtp_mailcmd_count > smtp_rlm_threshold &&
4672           verify_check_host(&smtp_ratelimit_hosts) == OK)
4673         {
4674         DEBUG(D_receive) debug_printf("rate limit MAIL: delay %.3g sec\n",
4675           smtp_delay_mail/1000.0);
4676         millisleep((int)smtp_delay_mail);
4677         smtp_delay_mail *= smtp_rlm_factor;
4678         if (smtp_delay_mail > (double)smtp_rlm_limit)
4679           smtp_delay_mail = (double)smtp_rlm_limit;
4680         }
4681
4682       /* Now extract the address, first applying any SMTP-time rewriting. The
4683       TRUE flag allows "<>" as a sender address. */
4684
4685       raw_sender = rewrite_existflags & rewrite_smtp
4686         /* deconst ok as smtp_cmd_data was not const */
4687         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4688                       global_rewrite_rules)
4689         : smtp_cmd_data;
4690
4691       raw_sender =
4692         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
4693           TRUE);
4694
4695       if (!raw_sender)
4696         {
4697         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4698         break;
4699         }
4700
4701       sender_address = raw_sender;
4702
4703       /* If there is a configured size limit for mail, check that this message
4704       doesn't exceed it. The check is postponed to this point so that the sender
4705       can be logged. */
4706
4707       if (thismessage_size_limit > 0 && message_size > thismessage_size_limit)
4708         {
4709         smtp_printf("552 Message size exceeds maximum permitted\r\n", SP_NO_MORE);
4710         log_write(L_size_reject,
4711             LOG_MAIN|LOG_REJECT, "rejected MAIL FROM:<%s> %s: "
4712             "message too big: size%s=%d max=%d",
4713             sender_address,
4714             host_and_ident(TRUE),
4715             (message_size == INT_MAX)? ">" : "",
4716             message_size,
4717             thismessage_size_limit);
4718         sender_address = NULL;
4719         break;
4720         }
4721
4722       /* Check there is enough space on the disk unless configured not to.
4723       When smtp_check_spool_space is set, the check is for thismessage_size_limit
4724       plus the current message - i.e. we accept the message only if it won't
4725       reduce the space below the threshold. Add 5000 to the size to allow for
4726       overheads such as the Received: line and storing of recipients, etc.
4727       By putting the check here, even when SIZE is not given, it allow VRFY
4728       and EXPN etc. to be used when space is short. */
4729
4730       if (!receive_check_fs(
4731            smtp_check_spool_space && message_size >= 0
4732               ? message_size + 5000 : 0))
4733         {
4734         smtp_printf("452 Space shortage, please try later\r\n", SP_NO_MORE);
4735         sender_address = NULL;
4736         break;
4737         }
4738
4739       /* If sender_address is unqualified, reject it, unless this is a locally
4740       generated message, or the sending host or net is permitted to send
4741       unqualified addresses - typically local machines behaving as MUAs -
4742       in which case just qualify the address. The flag is set above at the start
4743       of the SMTP connection. */
4744
4745       if (!sender_domain && *sender_address)
4746         if (f.allow_unqualified_sender)
4747           {
4748           sender_domain = Ustrlen(sender_address) + 1;
4749           /* deconst ok as sender_address was not const */
4750           sender_address = US rewrite_address_qualify(sender_address, FALSE);
4751           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
4752             raw_sender);
4753           }
4754         else
4755           {
4756           smtp_printf("501 %s: sender address must contain a domain\r\n", SP_NO_MORE,
4757             smtp_cmd_data);
4758           log_write(L_smtp_syntax_error,
4759             LOG_MAIN|LOG_REJECT,
4760             "unqualified sender rejected: <%s> %s%s",
4761             raw_sender,
4762             host_and_ident(TRUE),
4763             host_lookup_msg);
4764           sender_address = NULL;
4765           break;
4766           }
4767
4768       /* Apply an ACL check if one is defined, before responding. Afterwards,
4769       when pipelining is not advertised, do another sync check in case the ACL
4770       delayed and the client started sending in the meantime. */
4771
4772       GET_OPTION("acl_smtp_mail");
4773       if (acl_smtp_mail)
4774         {
4775         rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
4776         if (rc == OK && !f.smtp_in_pipelining_advertised && !check_sync())
4777           goto SYNC_FAILURE;
4778         }
4779       else
4780         rc = OK;
4781
4782       if (rc == OK || rc == DISCARD)
4783         {
4784         BOOL more = pipeline_response();
4785
4786         if (!user_msg)
4787           smtp_printf("%s%s%s", more, US"250 OK",
4788                     #ifndef DISABLE_PRDR
4789                       prdr_requested ? US", PRDR Requested" : US"",
4790                     #else
4791                       US"",
4792                     #endif
4793                       US"\r\n");
4794         else
4795           {
4796         #ifndef DISABLE_PRDR
4797           if (prdr_requested)
4798              user_msg = string_sprintf("%s%s", user_msg, US", PRDR Requested");
4799         #endif
4800           smtp_user_msg(US"250", user_msg);
4801           }
4802         smtp_delay_rcpt = smtp_rlr_base;
4803         f.recipients_discarded = (rc == DISCARD);
4804         was_rej_mail = FALSE;
4805         }
4806       else
4807         {
4808         done = smtp_handle_acl_fail(ACL_WHERE_MAIL, rc, user_msg, log_msg);
4809         sender_address = NULL;
4810         }
4811       break;
4812
4813
4814     /* The RCPT command requires an address as an operand. There may be any
4815     number of RCPT commands, specifying multiple recipients. We build them all
4816     into a data structure. The start/end values given by parse_extract_address
4817     are not used, as we keep only the extracted address. */
4818
4819     case RCPT_CMD:
4820       HAD(SCH_RCPT);
4821       /* We got really to many recipients. A check against configured
4822       limits is done later */
4823       if (rcpt_count < 0 || rcpt_count >= INT_MAX/2)
4824         log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Too many recipients: %d", rcpt_count);
4825       rcpt_count++;
4826       was_rcpt = fl.rcpt_in_progress = TRUE;
4827
4828       /* There must be a sender address; if the sender was rejected and
4829       pipelining was advertised, we assume the client was pipelining, and do not
4830       count this as a protocol error. Reset was_rej_mail so that further RCPTs
4831       get the same treatment. */
4832
4833       if (!sender_address)
4834         {
4835         if (f.smtp_in_pipelining_advertised && last_was_rej_mail)
4836           {
4837           smtp_printf("503 sender not yet given\r\n", SP_NO_MORE);
4838           was_rej_mail = TRUE;
4839           }
4840         else
4841           {
4842           done = synprot_error(L_smtp_protocol_error, 503, NULL,
4843             US"sender not yet given");
4844           was_rcpt = FALSE;             /* Not a valid RCPT */
4845           }
4846         rcpt_fail_count++;
4847         break;
4848         }
4849
4850       /* Check for an operand */
4851
4852       if (!smtp_cmd_data[0])
4853         {
4854         done = synprot_error(L_smtp_syntax_error, 501, NULL,
4855           US"RCPT must have an address operand");
4856         rcpt_fail_count++;
4857         break;
4858         }
4859
4860       /* Set the DSN flags orcpt and dsn_flags from the session*/
4861       orcpt = NULL;
4862       dsn_flags = 0;
4863
4864       if (fl.esmtp) for(;;)
4865         {
4866         uschar *name, *value;
4867
4868         if (!extract_option(&name, &value))
4869           break;
4870
4871         if (fl.dsn_advertised && strcmpic(name, US"ORCPT") == 0)
4872           {
4873           /* Check whether orcpt has been already set */
4874           if (orcpt)
4875             {
4876             done = synprot_error(L_smtp_syntax_error, 501, NULL,
4877               US"ORCPT can be specified once only");
4878             goto COMMAND_LOOP;
4879             }
4880           orcpt = string_copy(value);
4881           DEBUG(D_receive) debug_printf("DSN orcpt: %s\n", orcpt);
4882           }
4883
4884         else if (fl.dsn_advertised && strcmpic(name, US"NOTIFY") == 0)
4885           {
4886           /* Check if the notify flags have been already set */
4887           if (dsn_flags > 0)
4888             {
4889             done = synprot_error(L_smtp_syntax_error, 501, NULL,
4890                 US"NOTIFY can be specified once only");
4891             goto COMMAND_LOOP;
4892             }
4893           if (strcmpic(value, US"NEVER") == 0)
4894             dsn_flags |= rf_notify_never;
4895           else
4896             {
4897             uschar *p = value;
4898             while (*p != 0)
4899               {
4900               uschar *pp = p;
4901               while (*pp != 0 && *pp != ',') pp++;
4902               if (*pp == ',') *pp++ = 0;
4903               if (strcmpic(p, US"SUCCESS") == 0)
4904                 {
4905                 DEBUG(D_receive) debug_printf("DSN: Setting notify success\n");
4906                 dsn_flags |= rf_notify_success;
4907                 }
4908               else if (strcmpic(p, US"FAILURE") == 0)
4909                 {
4910                 DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n");
4911                 dsn_flags |= rf_notify_failure;
4912                 }
4913               else if (strcmpic(p, US"DELAY") == 0)
4914                 {
4915                 DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n");
4916                 dsn_flags |= rf_notify_delay;
4917                 }
4918               else
4919                 {
4920                 /* Catch any strange values */
4921                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4922                   US"Invalid value for NOTIFY parameter");
4923                 goto COMMAND_LOOP;
4924                 }
4925               p = pp;
4926               }
4927               DEBUG(D_receive) debug_printf("DSN Flags: %x\n", dsn_flags);
4928             }
4929           }
4930
4931         /* Unknown option. Stick back the terminator characters and break
4932         the loop. An error for a malformed address will occur. */
4933
4934         else
4935           {
4936           DEBUG(D_receive) debug_printf("Invalid RCPT option: %s : %s\n", name, value);
4937           name[-1] = ' ';
4938           value[-1] = '=';
4939           break;
4940           }
4941         }
4942
4943       /* Apply SMTP rewriting then extract the working address. Don't allow "<>"
4944       as a recipient address */
4945
4946       recipient = rewrite_existflags & rewrite_smtp
4947         /* deconst ok as smtp_cmd_data was not const */
4948         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4949             global_rewrite_rules)
4950         : smtp_cmd_data;
4951
4952       if (!(recipient = parse_extract_address(recipient, &errmess, &start, &end,
4953         &recipient_domain, FALSE)))
4954         {
4955         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4956         rcpt_fail_count++;
4957         break;
4958         }
4959
4960       /* If the recipient address is unqualified, reject it, unless this is a
4961       locally generated message. However, unqualified addresses are permitted
4962       from a configured list of hosts and nets - typically when behaving as
4963       MUAs rather than MTAs. Sad that SMTP is used for both types of traffic,
4964       really. The flag is set at the start of the SMTP connection.
4965
4966       RFC 1123 talks about supporting "the reserved mailbox postmaster"; I always
4967       assumed this meant "reserved local part", but the revision of RFC 821 and
4968       friends now makes it absolutely clear that it means *mailbox*. Consequently
4969       we must always qualify this address, regardless. */
4970
4971       if (!recipient_domain)
4972         if (!(recipient_domain = qualify_recipient(&recipient, smtp_cmd_data,
4973                                     US"recipient")))
4974           {
4975           rcpt_fail_count++;
4976           break;
4977           }
4978
4979       /* Check maximum allowed */
4980
4981       if (  rcpt_count+1 < 0
4982          || rcpt_count > recipients_max_expanded && recipients_max_expanded > 0)
4983         {
4984         if (recipients_max_reject)
4985           {
4986           rcpt_fail_count++;
4987           smtp_printf("552 too many recipients\r\n", SP_NO_MORE);
4988           if (!toomany)
4989             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: message "
4990               "rejected: sender=<%s> %s", sender_address, host_and_ident(TRUE));
4991           }
4992         else
4993           {
4994           rcpt_defer_count++;
4995           smtp_printf("452 too many recipients\r\n", SP_NO_MORE);
4996           if (!toomany)
4997             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: excess "
4998               "temporarily rejected: sender=<%s> %s", sender_address,
4999               host_and_ident(TRUE));
5000           }
5001
5002         toomany = TRUE;
5003         break;
5004         }
5005
5006       /* If we have passed the threshold for rate limiting, apply the current
5007       delay, and update it for next time, provided this is a limited host. */
5008
5009       if (rcpt_count > smtp_rlr_threshold &&
5010           verify_check_host(&smtp_ratelimit_hosts) == OK)
5011         {
5012         DEBUG(D_receive) debug_printf("rate limit RCPT: delay %.3g sec\n",
5013           smtp_delay_rcpt/1000.0);
5014         millisleep((int)smtp_delay_rcpt);
5015         smtp_delay_rcpt *= smtp_rlr_factor;
5016         if (smtp_delay_rcpt > (double)smtp_rlr_limit)
5017           smtp_delay_rcpt = (double)smtp_rlr_limit;
5018         }
5019
5020       /* If the MAIL ACL discarded all the recipients, we bypass ACL checking
5021       for them. Otherwise, check the access control list for this recipient. As
5022       there may be a delay in this, re-check for a synchronization error
5023       afterwards, unless pipelining was advertised. */
5024
5025       if (f.recipients_discarded)
5026         rc = DISCARD;
5027       else
5028         {
5029         GET_OPTION("acl_smtp_rcpt");
5030         if (  (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
5031                       &log_msg)) == OK
5032            && !f.smtp_in_pipelining_advertised && !check_sync())
5033           goto SYNC_FAILURE;
5034         }
5035
5036       /* The ACL was happy */
5037
5038       if (rc == OK)
5039         {
5040         BOOL more = pipeline_response();
5041
5042         if (user_msg)
5043           smtp_user_msg(US"250", user_msg);
5044         else
5045           smtp_printf("250 Accepted\r\n", more);
5046         receive_add_recipient(recipient, -1);
5047
5048         /* Set the dsn flags in the recipients_list */
5049         recipients_list[recipients_count-1].orcpt = orcpt;
5050         recipients_list[recipients_count-1].dsn_flags = dsn_flags;
5051
5052         /* DEBUG(D_receive) debug_printf("DSN: orcpt: %s  flags: %d\n",
5053           recipients_list[recipients_count-1].orcpt,
5054           recipients_list[recipients_count-1].dsn_flags); */
5055         }
5056
5057       /* The recipient was discarded */
5058
5059       else if (rc == DISCARD)
5060         {
5061         if (user_msg)
5062           smtp_user_msg(US"250", user_msg);
5063         else
5064           smtp_printf("250 Accepted\r\n", SP_NO_MORE);
5065         rcpt_fail_count++;
5066         discarded = TRUE;
5067         log_write(0, LOG_MAIN|LOG_REJECT, "%s F=<%s> RCPT %s: "
5068           "discarded by %s ACL%s%s", host_and_ident(TRUE),
5069           sender_address_unrewritten ? sender_address_unrewritten : sender_address,
5070           smtp_cmd_argument, f.recipients_discarded ? "MAIL" : "RCPT",
5071           log_msg ? US": " : US"", log_msg ? log_msg : US"");
5072         }
5073
5074       /* Either the ACL failed the address, or it was deferred. */
5075
5076       else
5077         {
5078         if (rc == FAIL) rcpt_fail_count++; else rcpt_defer_count++;
5079         done = smtp_handle_acl_fail(ACL_WHERE_RCPT, rc, user_msg, log_msg);
5080         }
5081       break;
5082
5083
5084     /* The DATA command is legal only if it follows successful MAIL FROM
5085     and RCPT TO commands. However, if pipelining is advertised, a bad DATA is
5086     not counted as a protocol error if it follows RCPT (which must have been
5087     rejected if there are no recipients.) This function is complete when a
5088     valid DATA command is encountered.
5089
5090     Note concerning the code used: RFC 2821 says this:
5091
5092      -  If there was no MAIL, or no RCPT, command, or all such commands
5093         were rejected, the server MAY return a "command out of sequence"
5094         (503) or "no valid recipients" (554) reply in response to the
5095         DATA command.
5096
5097     The example in the pipelining RFC 2920 uses 554, but I use 503 here
5098     because it is the same whether pipelining is in use or not.
5099
5100     If all the RCPT commands that precede DATA provoked the same error message
5101     (often indicating some kind of system error), it is helpful to include it
5102     with the DATA rejection (an idea suggested by Tony Finch). */
5103
5104     case BDAT_CMD:
5105       {
5106       int n;
5107
5108       HAD(SCH_BDAT);
5109       if (chunking_state != CHUNKING_OFFERED)
5110         {
5111         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5112           US"BDAT command used when CHUNKING not advertised");
5113         break;
5114         }
5115
5116       /* grab size, endmarker */
5117
5118       if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5119         {
5120         done = synprot_error(L_smtp_protocol_error, 501, NULL,
5121           US"missing size for BDAT command");
5122         break;
5123         }
5124       chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
5125         ? CHUNKING_LAST : CHUNKING_ACTIVE;
5126       chunking_data_left = chunking_datasize;
5127       DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
5128                                     (int)chunking_state, chunking_data_left);
5129
5130       f.bdat_readers_wanted = TRUE; /* FIXME: redundant vs chunking_state? */
5131       f.dot_ends = FALSE;
5132
5133       goto DATA_BDAT;
5134       }
5135
5136     case DATA_CMD:
5137       HAD(SCH_DATA);
5138       f.dot_ends = TRUE;
5139       f.bdat_readers_wanted = FALSE;
5140
5141     DATA_BDAT:          /* Common code for DATA and BDAT */
5142 #ifndef DISABLE_PIPE_CONNECT
5143       fl.pipe_connect_acceptable = FALSE;
5144 #endif
5145       if (!discarded && recipients_count <= 0)
5146         {
5147         if (fl.rcpt_smtp_response_same && rcpt_smtp_response)
5148           {
5149           uschar *code = US"503";
5150           int len = Ustrlen(rcpt_smtp_response);
5151           smtp_respond(code, 3, SR_NOT_FINAL, US"All RCPT commands were rejected with "
5152             "this error:");
5153           /* Responses from smtp_printf() will have \r\n on the end */
5154           if (len > 2 && rcpt_smtp_response[len-2] == '\r')
5155             rcpt_smtp_response[len-2] = 0;
5156           smtp_respond(code, 3, SR_NOT_FINAL, rcpt_smtp_response);
5157           }
5158         if (f.smtp_in_pipelining_advertised && last_was_rcpt)
5159           smtp_printf("503 Valid RCPT command must precede %s\r\n", SP_NO_MORE,
5160             smtp_names[smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)]]);
5161         else
5162           done = synprot_error(L_smtp_protocol_error, 503, NULL,
5163             smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)] == SCH_DATA
5164             ? US"valid RCPT command must precede DATA"
5165             : US"valid RCPT command must precede BDAT");
5166
5167         if (chunking_state > CHUNKING_OFFERED)
5168           {
5169           bdat_push_receive_functions();
5170           bdat_flush_data();
5171           }
5172         break;
5173         }
5174
5175       if (toomany && recipients_max_reject)
5176         {
5177         sender_address = NULL;  /* This will allow a new MAIL without RSET */
5178         sender_address_unrewritten = NULL;
5179         smtp_printf("554 Too many recipients\r\n", SP_NO_MORE);
5180
5181         if (chunking_state > CHUNKING_OFFERED)
5182           {
5183           bdat_push_receive_functions();
5184           bdat_flush_data();
5185           }
5186         break;
5187         }
5188
5189       if (chunking_state > CHUNKING_OFFERED)
5190         rc = OK;        /* There is no predata ACL or go-ahead output for BDAT */
5191       else
5192         {
5193         /* If there is a predata-ACL, re-check the synchronization afterwards,
5194         since the ACL may have delayed.  To handle cutthrough delivery enforce a
5195         dummy call to get the DATA command sent. */
5196
5197         GET_OPTION("acl_smtp_predata");
5198         if (!acl_smtp_predata && cutthrough.cctx.sock < 0)
5199           rc = OK;
5200         else
5201           {
5202           uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept";
5203           f.enable_dollar_recipients = TRUE;
5204           rc = acl_check(ACL_WHERE_PREDATA, NULL, acl, &user_msg,
5205             &log_msg);
5206           f.enable_dollar_recipients = FALSE;
5207           if (rc == OK && !check_sync())
5208             goto SYNC_FAILURE;
5209
5210           if (rc != OK)
5211             {   /* Either the ACL failed the address, or it was deferred. */
5212             done = smtp_handle_acl_fail(ACL_WHERE_PREDATA, rc, user_msg, log_msg);
5213             break;
5214             }
5215           }
5216
5217         if (user_msg)
5218           smtp_user_msg(US"354", user_msg);
5219         else
5220           smtp_printf(
5221             "354 Enter message, ending with \".\" on a line by itself\r\n", SP_NO_MORE);
5222         }
5223
5224       if (f.bdat_readers_wanted)
5225         bdat_push_receive_functions();
5226
5227 #ifdef TCP_QUICKACK
5228       if (smtp_in)      /* all ACKs needed to ramp window up for bulk data */
5229         (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
5230                 US &on, sizeof(on));
5231 #endif
5232       done = 3;
5233       message_ended = END_NOTENDED;   /* Indicate in middle of data */
5234
5235       break;
5236
5237
5238     case VRFY_CMD:
5239       {
5240       uschar * address;
5241
5242       HAD(SCH_VRFY);
5243
5244       if (!(address = parse_extract_address(smtp_cmd_data, &errmess,
5245             &start, &end, &recipient_domain, FALSE)))
5246         {
5247         smtp_printf("501 %s\r\n", SP_NO_MORE, errmess);
5248         break;
5249         }
5250
5251       if (!recipient_domain)
5252         if (!(recipient_domain = qualify_recipient(&address, smtp_cmd_data,
5253                                     US"verify")))
5254           break;
5255
5256       GET_OPTION("acl_smtp_vrfy");
5257       if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
5258                     &user_msg, &log_msg)) != OK)
5259         done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
5260       else
5261         {
5262         uschar * s = NULL;
5263         address_item * addr = deliver_make_addr(address, FALSE);
5264
5265         switch(verify_address(addr, NULL, vopt_is_recipient | vopt_qualify, -1,
5266                -1, -1, NULL, NULL, NULL))
5267           {
5268           case OK:
5269             s = string_sprintf("250 <%s> is deliverable", address);
5270             break;
5271
5272           case DEFER:
5273             s = (addr->user_message != NULL)?
5274               string_sprintf("451 <%s> %s", address, addr->user_message) :
5275               string_sprintf("451 Cannot resolve <%s> at this time", address);
5276             break;
5277
5278           case FAIL:
5279             s = (addr->user_message != NULL)?
5280               string_sprintf("550 <%s> %s", address, addr->user_message) :
5281               string_sprintf("550 <%s> is not deliverable", address);
5282             log_write(0, LOG_MAIN, "VRFY failed for %s %s",
5283               smtp_cmd_argument, host_and_ident(TRUE));
5284             break;
5285           }
5286
5287         smtp_printf("%s\r\n", SP_NO_MORE, s);
5288         }
5289       break;
5290       }
5291
5292
5293     case EXPN_CMD:
5294       HAD(SCH_EXPN);
5295       GET_OPTION("acl_smtp_expn");
5296       rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
5297       if (rc != OK)
5298         done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
5299       else
5300         {
5301         BOOL save_log_testing_mode = f.log_testing_mode;
5302         f.address_test_mode = f.log_testing_mode = TRUE;
5303         (void) verify_address(deliver_make_addr(smtp_cmd_data, FALSE),
5304           smtp_out, vopt_is_recipient | vopt_qualify | vopt_expn, -1, -1, -1,
5305           NULL, NULL, NULL);
5306         f.address_test_mode = FALSE;
5307         f.log_testing_mode = save_log_testing_mode;    /* true for -bh */
5308         }
5309       break;
5310
5311
5312     #ifndef DISABLE_TLS
5313
5314     case STARTTLS_CMD:
5315       HAD(SCH_STARTTLS);
5316       if (!fl.tls_advertised)
5317         {
5318         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5319           US"STARTTLS command used when not advertised");
5320         break;
5321         }
5322
5323       /* Apply an ACL check if one is defined */
5324
5325       GET_OPTION("acl_smtp_starttls");
5326       if (  acl_smtp_starttls
5327          && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
5328                     &user_msg, &log_msg)) != OK
5329          )
5330         {
5331         done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg);
5332         break;
5333         }
5334
5335       /* RFC 2487 is not clear on when this command may be sent, though it
5336       does state that all information previously obtained from the client
5337       must be discarded if a TLS session is started. It seems reasonable to
5338       do an implied RSET when STARTTLS is received. */
5339
5340       incomplete_transaction_log(US"STARTTLS");
5341       cancel_cutthrough_connection(TRUE, US"STARTTLS received");
5342       reset_point = smtp_reset(reset_point);
5343       toomany = FALSE;
5344       cmd_list[CL_STLS].is_mail_cmd = FALSE;
5345
5346       /* There's an attack where more data is read in past the STARTTLS command
5347       before TLS is negotiated, then assumed to be part of the secure session
5348       when used afterwards; we use segregated input buffers, so are not
5349       vulnerable, but we want to note when it happens and, for sheer paranoia,
5350       ensure that the buffer is "wiped".
5351       Pipelining sync checks will normally have protected us too, unless disabled
5352       by configuration. */
5353
5354       if (receive_hasc())
5355         {
5356         DEBUG(D_any)
5357           debug_printf("Non-empty input buffer after STARTTLS; naive attack?\n");
5358         if (tls_in.active.sock < 0)
5359           smtp_inend = smtp_inptr = smtp_inbuffer;
5360         /* and if TLS is already active, tls_server_start() should fail */
5361         }
5362
5363       /* There is nothing we value in the input buffer and if TLS is successfully
5364       negotiated, we won't use this buffer again; if TLS fails, we'll just read
5365       fresh content into it.  The buffer contains arbitrary content from an
5366       untrusted remote source; eg: NOOP <shellcode>\r\nSTARTTLS\r\n
5367       It seems safest to just wipe away the content rather than leave it as a
5368       target to jump to. */
5369
5370       memset(smtp_inbuffer, 0, IN_BUFFER_SIZE);
5371
5372       /* Attempt to start up a TLS session, and if successful, discard all
5373       knowledge that was obtained previously. At least, that's what the RFC says,
5374       and that's what happens by default. However, in order to work round YAEB,
5375       there is an option to remember the esmtp state. Sigh.
5376
5377       We must allow for an extra EHLO command and an extra AUTH command after
5378       STARTTLS that don't add to the nonmail command count. */
5379
5380       s = NULL;
5381       if ((rc = tls_server_start(&s)) == OK)
5382         {
5383         if (!tls_remember_esmtp)
5384           fl.helo_seen = fl.esmtp = fl.auth_advertised = f.smtp_in_pipelining_advertised = FALSE;
5385         cmd_list[CL_EHLO].is_mail_cmd = TRUE;
5386         cmd_list[CL_AUTH].is_mail_cmd = TRUE;
5387         cmd_list[CL_TLAU].is_mail_cmd = TRUE;
5388         if (sender_helo_name)
5389           {
5390           sender_helo_name = NULL;
5391           host_build_sender_fullhost();  /* Rebuild */
5392           set_process_info("handling incoming TLS connection from %s",
5393             host_and_ident(FALSE));
5394           }
5395         received_protocol =
5396           (sender_host_address ? protocols : protocols_local)
5397             [ (fl.esmtp
5398               ? pextend + (sender_host_authenticated ? pauthed : 0)
5399               : pnormal)
5400             + (tls_in.active.sock >= 0 ? pcrpted : 0)
5401             ];
5402
5403         sender_host_auth_pubname = sender_host_authenticated = NULL;
5404         authenticated_id = NULL;
5405         sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
5406         DEBUG(D_tls) debug_printf("TLS active\n");
5407         break;     /* Successful STARTTLS */
5408         }
5409       else
5410         (void) smtp_log_tls_fail(s);
5411
5412       /* Some local configuration problem was discovered before actually trying
5413       to do a TLS handshake; give a temporary error. */
5414
5415       if (rc == DEFER)
5416         {
5417         smtp_printf("454 TLS currently unavailable\r\n", SP_NO_MORE);
5418         break;
5419         }
5420
5421       /* Hard failure. Reject everything except QUIT or closed connection. One
5422       cause for failure is a nested STARTTLS, in which case tls_in.active remains
5423       set, but we must still reject all incoming commands.  Another is a handshake
5424       failure - and there may some encrypted data still in the pipe to us, which we
5425       see as garbage commands. */
5426
5427       DEBUG(D_tls) debug_printf("TLS failed to start\n");
5428       while (done <= 0) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
5429         {
5430         case EOF_CMD:
5431           log_close_event(US"by EOF");
5432           smtp_notquit_exit(US"tls-failed", NULL, NULL);
5433           done = 2;
5434           break;
5435
5436         /* It is perhaps arguable as to which exit ACL should be called here,
5437         but as it is probably a situation that almost never arises, it
5438         probably doesn't matter. We choose to call the real QUIT ACL, which in
5439         some sense is perhaps "right". */
5440
5441         case QUIT_CMD:
5442           f.smtp_in_quit = TRUE;
5443           user_msg = NULL;
5444           GET_OPTION("acl_smtp_quit");
5445           if (  acl_smtp_quit
5446              && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
5447                                 &log_msg)) == ERROR))
5448               log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
5449                 log_msg);
5450           if (user_msg)
5451             smtp_respond(US"221", 3, SR_FINAL, user_msg);
5452           else
5453             smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
5454           log_close_event(US"by QUIT");
5455           done = 2;
5456           break;
5457
5458         default:
5459           smtp_printf("554 Security failure\r\n", SP_NO_MORE);
5460           break;
5461         }
5462       tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
5463       break;
5464     #endif
5465
5466
5467     /* The ACL for QUIT is provided for gathering statistical information or
5468     similar; it does not affect the response code, but it can supply a custom
5469     message. */
5470
5471     case QUIT_CMD:
5472       smtp_quit_handler(&user_msg, &log_msg);
5473       done = 2;
5474       break;
5475
5476
5477     case RSET_CMD:
5478       smtp_rset_handler();
5479       cancel_cutthrough_connection(TRUE, US"RSET received");
5480       reset_point = smtp_reset(reset_point);
5481       toomany = FALSE;
5482       break;
5483
5484
5485     case NOOP_CMD:
5486       HAD(SCH_NOOP);
5487       smtp_printf("250 OK\r\n", SP_NO_MORE);
5488       break;
5489
5490
5491     /* Show ETRN/EXPN/VRFY if there's an ACL for checking hosts; if actually
5492     used, a check will be done for permitted hosts. Show STARTTLS only if not
5493     already in a TLS session and if it would be advertised in the EHLO
5494     response. */
5495
5496     case HELP_CMD:
5497       HAD(SCH_HELP);
5498       smtp_printf("214-Commands supported:\r\n214", SP_MORE);
5499       smtp_printf(" AUTH", SP_MORE);
5500 #ifndef DISABLE_TLS
5501       if (tls_in.active.sock < 0 &&
5502           verify_check_host(&tls_advertise_hosts) != FAIL)
5503         smtp_printf(" STARTTLS", SP_MORE);
5504 #endif
5505       smtp_printf(" HELO EHLO MAIL RCPT DATA BDAT", SP_MORE);
5506       smtp_printf(" NOOP QUIT RSET HELP", SP_MORE);
5507       if (acl_smtp_etrn) smtp_printf(" ETRN", SP_MORE);
5508       if (acl_smtp_expn) smtp_printf(" EXPN", SP_MORE);
5509       if (acl_smtp_vrfy) smtp_printf(" VRFY", SP_MORE);
5510 #ifndef DISABLE_WELLKNOWN
5511       if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
5512         smtp_printf(" WELLKNOWN", SP_MORE);
5513 #endif
5514 #ifdef EXPERIMENTAL_XCLIENT
5515       if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
5516         smtp_printf(" XCLIENT", SP_MORE);
5517 #endif
5518       smtp_printf("\r\n", SP_NO_MORE);
5519       break;
5520
5521
5522     case EOF_CMD:
5523       incomplete_transaction_log(US"connection lost");
5524       smtp_notquit_exit(US"connection-lost", US"421",
5525         US"%s lost input connection", smtp_active_hostname);
5526
5527       /* Don't log by default unless in the middle of a message, as some mailers
5528       just drop the call rather than sending QUIT, and it clutters up the logs.
5529       */
5530
5531       if (sender_address || recipients_count > 0)
5532         log_write(L_lost_incoming_connection, LOG_MAIN,
5533           "unexpected %s while reading SMTP command from %s%s%s D=%s",
5534           f.sender_host_unknown ? "EOF" : "disconnection",
5535           f.tcp_in_fastopen_logged
5536           ? US""
5537           : f.tcp_in_fastopen
5538           ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO "
5539           : US"",
5540           host_and_ident(FALSE), smtp_read_error,
5541           string_timesince(&smtp_connection_start)
5542           );
5543
5544       else
5545         log_write(L_smtp_connection, LOG_MAIN, "%s %slost%s D=%s",
5546           smtp_get_connection_info(),
5547           f.tcp_in_fastopen && !f.tcp_in_fastopen_logged ? US"TFO " : US"",
5548           smtp_read_error,
5549           string_timesince(&smtp_connection_start)
5550           );
5551
5552       done = 1;
5553       break;
5554
5555
5556     case ETRN_CMD:
5557       HAD(SCH_ETRN);
5558       if (sender_address)
5559         {
5560         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5561           US"ETRN is not permitted inside a transaction");
5562         break;
5563         }
5564
5565       log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
5566         host_and_ident(FALSE));
5567
5568       GET_OPTION("acl_smtp_etrn");
5569       if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
5570                   &user_msg, &log_msg)) != OK)
5571         {
5572         done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg);
5573         break;
5574         }
5575
5576       /* Compute the serialization key for this command. */
5577
5578       etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
5579
5580       /* If a command has been specified for running as a result of ETRN, we
5581       permit any argument to ETRN. If not, only the # standard form is permitted,
5582       since that is strictly the only kind of ETRN that can be implemented
5583       according to the RFC. */
5584
5585       GET_OPTION("smtp_etrn_command");
5586       if (smtp_etrn_command)
5587         {
5588         uschar *error;
5589         BOOL rc;
5590         etrn_command = smtp_etrn_command;
5591         deliver_domain = smtp_cmd_data;
5592         rc = transport_set_up_command(&argv, smtp_etrn_command, TSUC_EXPAND_ARGS, 0, NULL,
5593           US"ETRN processing", &error);
5594         deliver_domain = NULL;
5595         if (!rc)
5596           {
5597           log_write(0, LOG_MAIN|LOG_PANIC, "failed to set up ETRN command: %s",
5598             error);
5599           smtp_printf("458 Internal failure\r\n", SP_NO_MORE);
5600           break;
5601           }
5602         }
5603
5604       /* Else set up to call Exim with the -R option. */
5605
5606       else
5607         {
5608         if (*smtp_cmd_data++ != '#')
5609           {
5610           done = synprot_error(L_smtp_syntax_error, 501, NULL,
5611             US"argument must begin with #");
5612           break;
5613           }
5614         etrn_command = US"exim -R";
5615         argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE,
5616           *queue_name ? 4 : 2,
5617           US"-R", smtp_cmd_data,
5618           US"-MCG", queue_name);
5619         }
5620
5621       /* If we are host-testing, don't actually do anything. */
5622
5623       if (host_checking)
5624         {
5625         HDEBUG(D_any)
5626           {
5627           debug_printf("ETRN command is: %s\n", etrn_command);
5628           debug_printf("ETRN command execution skipped\n");
5629           }
5630         if (user_msg == NULL) smtp_printf("250 OK\r\n", SP_NO_MORE);
5631           else smtp_user_msg(US"250", user_msg);
5632         break;
5633         }
5634
5635
5636       /* If ETRN queue runs are to be serialized, check the database to
5637       ensure one isn't already running. */
5638
5639       if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
5640         {
5641         smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
5642         break;
5643         }
5644
5645       /* Fork a child process and run the command. We don't want to have to
5646       wait for the process at any point, so set SIGCHLD to SIG_IGN before
5647       forking. It should be set that way anyway for external incoming SMTP,
5648       but we save and restore to be tidy. If serialization is required, we
5649       actually run the command in yet another process, so we can wait for it
5650       to complete and then remove the serialization lock. */
5651
5652       oldsignal = signal(SIGCHLD, SIG_IGN);
5653
5654       if ((pid = exim_fork(US"etrn-command")) == 0)
5655         {
5656         smtp_input = FALSE;       /* This process is not associated with the */
5657         (void)fclose(smtp_in);    /* SMTP call any more. */
5658         (void)fclose(smtp_out);
5659
5660         signal(SIGCHLD, SIG_DFL);      /* Want to catch child */
5661
5662         /* If not serializing, do the exec right away. Otherwise, fork down
5663         into another process. */
5664
5665         if (  !smtp_etrn_serialize
5666            || (pid = exim_fork(US"etrn-serialised-command")) == 0)
5667           {
5668           DEBUG(D_exec) debug_print_argv(argv);
5669           exim_nullstd();                   /* Ensure std{in,out,err} exist */
5670           /* argv[0] should be untainted, from child_exec_exim() */
5671           execv(CS argv[0], (char *const *)argv);
5672           log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
5673             etrn_command, strerror(errno));
5674           _exit(EXIT_FAILURE);         /* paranoia */
5675           }
5676
5677         /* Obey this if smtp_serialize and the 2nd fork yielded non-zero. That
5678         is, we are in the first subprocess, after forking again. All we can do
5679         for a failing fork is to log it. Otherwise, wait for the 2nd process to
5680         complete, before removing the serialization. */
5681
5682         if (pid < 0)
5683           log_write(0, LOG_MAIN|LOG_PANIC, "2nd fork for serialized ETRN "
5684             "failed: %s", strerror(errno));
5685         else
5686           {
5687           int status;
5688           DEBUG(D_any) debug_printf("waiting for serialized ETRN process %d\n",
5689             (int)pid);
5690           (void)wait(&status);
5691           DEBUG(D_any) debug_printf("serialized ETRN process %d ended\n",
5692             (int)pid);
5693           }
5694
5695         enq_end(etrn_serialize_key);
5696         exim_underbar_exit(EXIT_SUCCESS);
5697         }
5698
5699       /* Back in the top level SMTP process. Check that we started a subprocess
5700       and restore the signal state. */
5701
5702       if (pid < 0)
5703         {
5704         log_write(0, LOG_MAIN|LOG_PANIC, "fork of process for ETRN failed: %s",
5705           strerror(errno));
5706         smtp_printf("458 Unable to fork process\r\n", SP_NO_MORE);
5707         if (smtp_etrn_serialize) enq_end(etrn_serialize_key);
5708         }
5709       else
5710         if (!user_msg)
5711           smtp_printf("250 OK\r\n", SP_NO_MORE);
5712         else
5713           smtp_user_msg(US"250", user_msg);
5714
5715       signal(SIGCHLD, oldsignal);
5716       break;
5717
5718
5719     case BADARG_CMD:
5720       done = synprot_error(L_smtp_syntax_error, 501, NULL,
5721         US"unexpected argument data");
5722       break;
5723
5724
5725     /* This currently happens only for NULLs, but could be extended. */
5726
5727     case BADCHAR_CMD:
5728       done = synprot_error(L_smtp_syntax_error, 0, NULL,       /* Just logs */
5729         US"NUL character(s) present (shown as '?')");
5730       smtp_printf("501 NUL characters are not allowed in SMTP commands\r\n",
5731                   SP_NO_MORE);
5732       break;
5733
5734
5735     case BADSYN_CMD:
5736     SYNC_FAILURE:
5737       {
5738         unsigned nchars = 150;
5739         uschar * buf = receive_getbuf(&nchars);         /* destructive read */
5740         buf[nchars] = '\0';
5741         incomplete_transaction_log(US"sync failure");
5742         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
5743           "(next input sent too soon: pipelining was%s advertised): "
5744           "rejected \"%s\" %s next input=\"%s\" (%u bytes)",
5745           f.smtp_in_pipelining_advertised ? "" : " not",
5746           smtp_cmd_buffer, host_and_ident(TRUE),
5747           string_printing(buf), nchars);
5748         smtp_notquit_exit(US"synchronization-error", US"554",
5749           US"SMTP synchronization error");
5750         done = 1;   /* Pretend eof - drops connection */
5751         break;
5752       }
5753
5754
5755     case TOO_MANY_NONMAIL_CMD:
5756       s = smtp_cmd_buffer;
5757       Uskip_nonwhite(&s);
5758       incomplete_transaction_log(US"too many non-mail commands");
5759       log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5760         "nonmail commands (last was \"%.*s\")",  host_and_ident(FALSE),
5761         (int)(s - smtp_cmd_buffer), smtp_cmd_buffer);
5762       smtp_notquit_exit(US"bad-commands", US"554", US"Too many nonmail commands");
5763       done = 1;   /* Pretend eof - drops connection */
5764       break;
5765
5766 #ifdef SUPPORT_PROXY
5767     case PROXY_FAIL_IGNORE_CMD:
5768       smtp_printf("503 Command refused, required Proxy negotiation failed\r\n", SP_NO_MORE);
5769       break;
5770 #endif
5771
5772     default:
5773       if (unknown_command_count++ >= smtp_max_unknown_commands)
5774         {
5775         log_write(L_smtp_syntax_error, LOG_MAIN,
5776           "SMTP syntax error in \"%s\" %s %s",
5777           string_printing(smtp_cmd_buffer), host_and_ident(TRUE),
5778           US"unrecognized command");
5779         incomplete_transaction_log(US"unrecognized command");
5780         smtp_notquit_exit(US"bad-commands", US"500",
5781           US"Too many unrecognized commands");
5782         done = 2;
5783         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5784           "unrecognized commands (last was \"%s\")", host_and_ident(FALSE),
5785           string_printing(smtp_cmd_buffer));
5786         }
5787       else
5788         done = synprot_error(L_smtp_syntax_error, 500, NULL,
5789           US"unrecognized command");
5790       break;
5791     }
5792
5793   /* This label is used by goto's inside loops that want to break out to
5794   the end of the command-processing loop. */
5795
5796   COMMAND_LOOP:
5797   last_was_rej_mail = was_rej_mail;     /* Remember some last commands for */
5798   last_was_rcpt = was_rcpt;             /* protocol error handling */
5799   }
5800
5801 return done - 2;  /* Convert yield values */
5802 }
5803
5804
5805
5806 gstring *
5807 authres_smtpauth(gstring * g)
5808 {
5809 if (!sender_host_authenticated)
5810   return g;
5811
5812 g = string_append(g, 2, US";\n\tauth=pass (", sender_host_auth_pubname);
5813
5814 if (Ustrcmp(sender_host_auth_pubname, "tls") == 0)
5815   g = authenticated_id
5816     ? string_append(g, 2, US") x509.auth=", authenticated_id)
5817     : string_cat(g, US") reason=x509.auth");
5818 else
5819   g = authenticated_id
5820     ? string_append(g, 2, US") smtp.auth=", authenticated_id)
5821     : string_cat(g, US", no id saved)");
5822
5823 if (authenticated_sender)
5824   g = string_append(g, 2, US" smtp.mailfrom=", authenticated_sender);
5825 return g;
5826 }
5827
5828
5829
5830 /* vi: aw ai sw=2
5831 */
5832 /* End of smtp_in.c */