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