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