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