febe7c117706968109c8f523393ee1051d6b5d28
[exim.git] / src / src / transport.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim Maintainers 2020 - 2024 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* See the file NOTICE for conditions of use and distribution. */
8 /* SPDX-License-Identifier: GPL-2.0-or-later */
9
10 /* General functions concerned with transportation, and generic options for all
11 transports. */
12
13
14 #include "exim.h"
15
16 /* Generic options for transports, all of which live inside transport_instance
17 data blocks and which therefore have the opt_public flag set. Note that there
18 are other options living inside this structure which can be set only from
19 certain transports. */
20 #define LOFF(field) OPT_OFF(transport_instance, field)
21
22 optionlist optionlist_transports[] = {
23   /*    name            type                                    value */
24   { "*expand_group",    opt_stringptr|opt_hidden|opt_public,
25                  LOFF(expand_gid) },
26   { "*expand_user",     opt_stringptr|opt_hidden|opt_public,
27                  LOFF(expand_uid) },
28   { "*headers_rewrite_flags", opt_int|opt_public|opt_hidden,
29                  LOFF(rewrite_existflags) },
30   { "*headers_rewrite_rules", opt_void|opt_public|opt_hidden,
31                  LOFF(rewrite_rules) },
32   { "*set_group",       opt_bool|opt_hidden|opt_public,
33                  LOFF(gid_set) },
34   { "*set_user",        opt_bool|opt_hidden|opt_public,
35                  LOFF(uid_set) },
36   { "body_only",        opt_bool|opt_public,
37                  LOFF(body_only) },
38   { "current_directory", opt_stringptr|opt_public,
39                  LOFF(current_dir) },
40   { "debug_print",      opt_stringptr | opt_public,
41                  LOFF(debug_string) },
42   { "delivery_date_add", opt_bool|opt_public,
43                  LOFF(delivery_date_add) },
44   { "disable_logging",  opt_bool|opt_public,
45                  LOFF(disable_logging) },
46   { "driver",           opt_stringptr|opt_public,
47                  LOFF(drinst.driver_name) },
48   { "envelope_to_add",   opt_bool|opt_public,
49                  LOFF(envelope_to_add) },
50 #ifndef DISABLE_EVENT
51   { "event_action",     opt_stringptr | opt_public,
52                  LOFF(event_action) },
53 #endif
54   { "group",             opt_expand_gid|opt_public,
55                  LOFF(gid) },
56   { "headers_add",      opt_stringptr|opt_public|opt_rep_str,
57                  LOFF(add_headers) },
58   { "headers_only",     opt_bool|opt_public,
59                  LOFF(headers_only) },
60   { "headers_remove",   opt_stringptr|opt_public|opt_rep_str,
61                  LOFF(remove_headers) },
62   { "headers_rewrite",  opt_rewrite|opt_public,
63                  LOFF(headers_rewrite) },
64   { "home_directory",   opt_stringptr|opt_public,
65                  LOFF(home_dir) },
66   { "initgroups",       opt_bool|opt_public,
67                  LOFF(initgroups) },
68   { "max_parallel",     opt_stringptr|opt_public,
69                  LOFF(max_parallel) },
70   { "message_size_limit", opt_stringptr|opt_public,
71                  LOFF(message_size_limit) },
72   { "rcpt_include_affixes", opt_bool|opt_public,
73                  LOFF(rcpt_include_affixes) },
74   { "retry_use_local_part", opt_bool|opt_public,
75                  LOFF(retry_use_local_part) },
76   { "return_path",      opt_stringptr|opt_public,
77                  LOFF(return_path) },
78   { "return_path_add",   opt_bool|opt_public,
79                  LOFF(return_path_add) },
80   { "shadow_condition", opt_stringptr|opt_public,
81                  LOFF(shadow_condition) },
82   { "shadow_transport", opt_stringptr|opt_public,
83                  LOFF(shadow) },
84   { "transport_filter", opt_stringptr|opt_public,
85                  LOFF(filter_command) },
86   { "transport_filter_timeout", opt_time|opt_public,
87                  LOFF(filter_timeout) },
88   { "user",             opt_expand_uid|opt_public,
89                  LOFF(uid) }
90 };
91
92 int optionlist_transports_size = nelem(optionlist_transports);
93
94 #ifdef MACRO_PREDEF
95
96 # include "macro_predef.h"
97
98 void
99 options_transports(void)
100 {
101 uschar buf[64];
102
103 options_from_list(optionlist_transports, nelem(optionlist_transports), US"TRANSPORTS", NULL);
104
105 for (transport_info * ti= transports_available; ti->drinfo.driver_name[0]; ti++)
106   {
107   spf(buf, sizeof(buf), US"_DRIVER_TRANSPORT_%T", ti->drinfo.driver_name);
108   builtin_macro_create(buf);
109   options_from_list(ti->drinfo.options, (unsigned)*ti->drinfo.options_count,
110                     US"TRANSPORT", ti->drinfo.driver_name);
111   }
112 }
113
114 #else   /*!MACRO_PREDEF*/
115
116 /* Structure for keeping list of addresses that have been added to
117 Envelope-To:, in order to avoid duplication. */
118
119 struct aci {
120   struct aci *next;
121   address_item *ptr;
122   };
123
124
125 /* Static data for write_chunk() */
126
127 static uschar *chunk_ptr;           /* chunk pointer */
128 static uschar *nl_check;            /* string to look for at line start */
129 static int     nl_check_length;     /* length of same */
130 static uschar *nl_escape;           /* string to insert */
131 static int     nl_escape_length;    /* length of same */
132 static int     nl_partial_match;    /* length matched at chunk end */
133
134
135 /*************************************************
136 *             Initialize transport list           *
137 *************************************************/
138
139 /* Read the transports section of the configuration file, and set up a chain of
140 transport instances according to its contents. Each transport has generic
141 options and may also have its own private options. This function is only ever
142 called when transports == NULL. We use generic code in readconf to do most of
143 the work. */
144
145 void
146 transport_init(void)
147 {
148 readconf_driver_init((driver_instance **)&transports,     /* chain anchor */
149   (driver_info *)transports_available,   /* available drivers */
150   sizeof(transport_info),                /* size of info block */
151   &transport_defaults,                   /* default values for generic options*/
152   sizeof(transport_instance),            /* size of instance block */
153   optionlist_transports,                 /* generic options */
154   optionlist_transports_size,
155   US"transport");
156
157 /* Now scan the configured transports and check inconsistencies. A shadow
158 transport is permitted only for local transports. */
159
160 for (transport_instance * t = transports; t; t = t->drinst.next)
161   {
162   transport_info * ti = t->drinst.info;
163   if (!ti->local && t->shadow)
164     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
165       "shadow transport not allowed on non-local transport %s", t->drinst.name);
166
167   if (t->body_only && t->headers_only)
168     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
169       "%s transport: body_only and headers_only are mutually exclusive",
170       t->drinst.name);
171   }
172 }
173
174
175
176 /*************************************************
177 *             Write block of data                *
178 *************************************************/
179
180 static int
181 tpt_write(int fd, uschar * block, int len, BOOL more, int options)
182 {
183 return
184 #ifndef DISABLE_TLS
185   tls_out.active.sock == fd
186     ? tls_write(tls_out.active.tls_ctx, block, len, more) :
187 #endif
188 #ifdef MSG_MORE
189   more && !(options & topt_not_socket) ? send(fd, block, len, MSG_MORE) :
190 #endif
191   write(fd, block, len);
192 }
193
194 /* Subroutine called by write_chunk() and at the end of the message actually
195 to write a data block. Also called directly by some transports to write
196 additional data to the file descriptor (e.g. prefix, suffix).
197
198 If a transport wants data transfers to be timed, it sets a non-zero value in
199 transport_write_timeout. A non-zero transport_write_timeout causes a timer to
200 be set for each block of data written from here. If time runs out, then write()
201 fails and provokes an error return. The caller can then inspect sigalrm_seen to
202 check for a timeout.
203
204 On some systems, if a quota is exceeded during the write, the yield is the
205 number of bytes written rather than an immediate error code. This also happens
206 on some systems in other cases, for example a pipe that goes away because the
207 other end's process terminates (Linux). On other systems, (e.g. Solaris 2) you
208 get the error codes the first time.
209
210 The write() function is also interruptible; the Solaris 2.6 man page says:
211
212      If write() is interrupted by a signal before it writes any
213      data, it will return -1 with errno set to EINTR.
214
215      If write() is interrupted by a signal after it successfully
216      writes some data, it will return the number of bytes written.
217
218 To handle these cases, we want to restart the write() to output the remainder
219 of the data after a non-negative return from write(), except after a timeout.
220 In the error cases (EDQUOT, EPIPE) no bytes get written the second time, and a
221 proper error then occurs. In principle, after an interruption, the second
222 write() could suffer the same fate, but we do not want to continue for
223 evermore, so stick a maximum repetition count on the loop to act as a
224 longstop.
225
226 Arguments:
227   tctx      transport context: file descriptor or string to write to
228   block     block of bytes to write
229   len       number of bytes to write
230   more      further data expected soon
231
232 Returns:    TRUE on success, FALSE on failure (with errno preserved);
233               transport_count is incremented by the number of bytes written
234 */
235
236 static BOOL
237 transport_write_block_fd(transport_ctx * tctx, uschar * block, int len, BOOL more)
238 {
239 int rc, save_errno;
240 int local_timeout = transport_write_timeout;
241 int connretry = 1;
242 int fd = tctx->u.fd;
243
244 /* This loop is for handling incomplete writes and other retries. In most
245 normal cases, it is only ever executed once. */
246
247 for (int i = 0; i < 100; i++)
248   {
249   DEBUG(D_transport)
250     debug_printf("writing data block fd=%d size=%d timeout=%d%s\n",
251       fd, len, local_timeout, more ? " (more expected)" : "");
252
253   /* When doing TCP Fast Open we may get this far before the 3-way handshake
254   is complete, and write returns ENOTCONN.  Detect that, wait for the socket
255   to become writable, and retry once only. */
256
257   for(;;)
258     {
259     /* This code makes use of alarm() in order to implement the timeout. This
260     isn't a very tidy way of doing things. Using non-blocking I/O with select()
261     provides a neater approach. However, I don't know how to do this when TLS is
262     in use. */
263
264     if (transport_write_timeout <= 0)   /* No timeout wanted */
265       {
266       rc = tpt_write(fd, block, len, more, tctx->options);
267       save_errno = errno;
268       }
269     else                                /* Timeout wanted. */
270       {
271       sigalrm_seen = FALSE;
272       ALARM(local_timeout);
273         rc = tpt_write(fd, block, len, more, tctx->options);
274         save_errno = errno;
275       local_timeout = ALARM_CLR(0);
276       if (sigalrm_seen)
277         {
278         errno = ETIMEDOUT;
279         return FALSE;
280         }
281       }
282
283     if (rc >= 0 || errno != ENOTCONN || connretry <= 0)
284       break;
285
286     poll_one_fd(fd, POLLOUT, -1);               /* could set timeout? retval check? */
287     connretry--;
288     }
289
290   /* Hopefully, the most common case is success, so test that first. */
291
292   if (rc == len) { transport_count += len; return TRUE; }
293
294   /* A non-negative return code is an incomplete write. Try again for the rest
295   of the block. If we have exactly hit the timeout, give up. */
296
297   if (rc >= 0)
298     {
299     len -= rc;
300     block += rc;
301     transport_count += rc;
302     DEBUG(D_transport) debug_printf("write incomplete (%d)\n", rc);
303     goto CHECK_TIMEOUT;   /* A few lines below */
304     }
305
306   /* A negative return code with an EINTR error is another form of
307   incomplete write, zero bytes having been written */
308
309   if (save_errno == EINTR)
310     {
311     DEBUG(D_transport)
312       debug_printf("write interrupted before anything written\n");
313     goto CHECK_TIMEOUT;   /* A few lines below */
314     }
315
316   /* A response of EAGAIN from write() is likely only in the case of writing
317   to a FIFO that is not swallowing the data as fast as Exim is writing it. */
318
319   if (save_errno == EAGAIN)
320     {
321     DEBUG(D_transport)
322       debug_printf("write temporarily locked out, waiting 1 sec\n");
323     sleep(1);
324
325     /* Before continuing to try another write, check that we haven't run out of
326     time. */
327
328     CHECK_TIMEOUT:
329     if (transport_write_timeout > 0 && local_timeout <= 0)
330       {
331       errno = ETIMEDOUT;
332       return FALSE;
333       }
334     continue;
335     }
336
337   /* Otherwise there's been an error */
338
339   DEBUG(D_transport) debug_printf("writing error %d: %s\n", save_errno,
340     strerror(save_errno));
341   errno = save_errno;
342   return FALSE;
343   }
344
345 /* We've tried and tried and tried but still failed */
346
347 errno = ERRNO_WRITEINCOMPLETE;
348 return FALSE;
349 }
350
351
352 BOOL
353 transport_write_block(transport_ctx * tctx, uschar *block, int len, BOOL more)
354 {
355 if (!(tctx->options & topt_output_string))
356   return transport_write_block_fd(tctx, block, len, more);
357
358 /* Write to expanding-string.  NOTE: not NUL-terminated */
359
360 if (!tctx->u.msg)
361   tctx->u.msg = string_get(1024);
362
363 tctx->u.msg = string_catn(tctx->u.msg, block, len);
364 return TRUE;
365 }
366
367
368
369
370 /*************************************************
371 *             Write formatted string             *
372 *************************************************/
373
374 /* This is called by various transports. It is a convenience function.
375
376 Arguments:
377   fd          file descriptor
378   format      string format
379   ...         arguments for format
380
381 Returns:      the yield of transport_write_block()
382 */
383
384 BOOL
385 transport_write_string(int fd, const char *format, ...)
386 {
387 transport_ctx tctx = {{0}};
388 gstring gs = { .size = big_buffer_size, .ptr = 0, .s = big_buffer };
389 va_list ap;
390
391 /* Use taint-unchecked routines for writing into big_buffer, trusting
392 that the result will never be expanded. */
393
394 va_start(ap, format);
395 if (!string_vformat(&gs, SVFMT_TAINT_NOCHK, format, ap))
396   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "overlong formatted string in transport");
397 va_end(ap);
398 tctx.u.fd = fd;
399 return transport_write_block(&tctx, gs.s, gs.ptr, FALSE);
400 }
401
402
403
404
405 void
406 transport_write_reset(int options)
407 {
408 if (!(options & topt_continuation)) chunk_ptr = deliver_out_buffer;
409 nl_partial_match = -1;
410 nl_check_length = nl_escape_length = 0;
411 }
412
413
414
415 /*************************************************
416 *              Write character chunk             *
417 *************************************************/
418
419 /* Subroutine used by transport_write_message() to scan character chunks for
420 newlines and act appropriately. The object is to minimise the number of writes.
421 The output byte stream is buffered up in deliver_out_buffer, which is written
422 only when it gets full, thus minimizing write operations and TCP packets.
423
424 Static data is used to handle the case when the last character of the previous
425 chunk was NL, or matched part of the data that has to be escaped.
426
427 Arguments:
428   tctx       transport context - processing to be done during output,
429                 and file descriptor to write to
430   chunk      pointer to data to write
431   len        length of data to write
432
433 In addition, the static nl_xxx variables must be set as required.
434
435 Returns:     TRUE on success, FALSE on failure (with errno preserved)
436 */
437
438 BOOL
439 write_chunk(transport_ctx * tctx, const uschar * chunk, int len)
440 {
441 const uschar * start = chunk;
442 const uschar * end = chunk + len;
443 int mlen = DELIVER_OUT_BUFFER_SIZE - nl_escape_length - 2;
444
445 /* The assumption is made that the check string will never stretch over move
446 than one chunk since the only time there are partial matches is when copying
447 the body in large buffers. There is always enough room in the buffer for an
448 escape string, since the loop below ensures this for each character it
449 processes, and it won't have stuck in the escape string if it left a partial
450 match. */
451
452 if (nl_partial_match >= 0)
453   {
454   if (nl_check_length > 0 && len >= nl_check_length &&
455       Ustrncmp(start, nl_check + nl_partial_match,
456         nl_check_length - nl_partial_match) == 0)
457     {
458     Ustrncpy(chunk_ptr, nl_escape, nl_escape_length);
459     chunk_ptr += nl_escape_length;
460     start += nl_check_length - nl_partial_match;
461     }
462
463   /* The partial match was a false one. Insert the characters carried over
464   from the previous chunk. */
465
466   else if (nl_partial_match > 0)
467     {
468     Ustrncpy(chunk_ptr, nl_check, nl_partial_match);
469     chunk_ptr += nl_partial_match;
470     }
471
472   nl_partial_match = -1;
473   }
474
475 /* Now process the characters in the chunk. Whenever we hit a newline we check
476 for possible escaping. The code for the non-NL route should be as fast as
477 possible. */
478
479 for (const uschar * ptr = start; ptr < end; ptr++)
480   {
481   int ch, len;
482
483   /* Flush the buffer if it has reached the threshold - we want to leave enough
484   room for the next uschar, plus a possible extra CR for an LF, plus the escape
485   string. */
486
487   if ((len = chunk_ptr - deliver_out_buffer) > mlen)
488     {
489     DEBUG(D_transport) debug_printf("flushing headers buffer\n");
490
491     /* If CHUNKING, prefix with BDAT (size) NON-LAST.  Also, reap responses
492     from previous SMTP commands. */
493
494     if (tctx->options & topt_use_bdat  &&  tctx->chunk_cb)
495       {
496       if (  tctx->chunk_cb(tctx, (unsigned)len, 0) != OK
497          || !transport_write_block(tctx, deliver_out_buffer, len, FALSE)
498          || tctx->chunk_cb(tctx, 0, tc_reap_prev) != OK
499          )
500         return FALSE;
501       }
502     else
503       if (!transport_write_block(tctx, deliver_out_buffer, len, FALSE))
504         return FALSE;
505     chunk_ptr = deliver_out_buffer;
506     }
507
508   /* Remove CR before NL if required */
509
510   if (  *ptr == '\r' && ptr[1] == '\n'
511      && !(tctx->options & topt_use_crlf)
512      && f.spool_file_wireformat
513      )
514     ptr++;
515
516   if ((ch = *ptr) == '\n')
517     {
518     int left = end - ptr - 1;  /* count of chars left after NL */
519
520     /* Insert CR before NL if required */
521
522     if (tctx->options & topt_use_crlf && !f.spool_file_wireformat)
523       *chunk_ptr++ = '\r';
524     *chunk_ptr++ = '\n';
525     transport_newlines++;
526
527     /* The check_string test (formerly "from hack") replaces the specific
528     string at the start of a line with an escape string (e.g. "From " becomes
529     ">From " or "." becomes "..". It is a case-sensitive test. The length
530     check above ensures there is always enough room to insert this string. */
531
532     if (nl_check_length > 0)
533       {
534       if (left >= nl_check_length &&
535           Ustrncmp(ptr+1, nl_check, nl_check_length) == 0)
536         {
537         Ustrncpy(chunk_ptr, nl_escape, nl_escape_length);
538         chunk_ptr += nl_escape_length;
539         ptr += nl_check_length;
540         }
541
542       /* Handle the case when there isn't enough left to match the whole
543       check string, but there may be a partial match. We remember how many
544       characters matched, and finish processing this chunk. */
545
546       else if (left <= 0) nl_partial_match = 0;
547
548       else if (Ustrncmp(ptr+1, nl_check, left) == 0)
549         {
550         nl_partial_match = left;
551         ptr = end;
552         }
553       }
554     }
555
556   /* Not a NL character */
557
558   else *chunk_ptr++ = ch;
559   }
560
561 return TRUE;
562 }
563
564
565
566
567 /*************************************************
568 *        Generate address for RCPT TO            *
569 *************************************************/
570
571 /* This function puts together an address for RCPT to, using the caseful
572 version of the local part and the caseful version of the domain. If there is no
573 prefix or suffix, or if affixes are to be retained, we can just use the
574 original address. Otherwise, if there is a prefix but no suffix we can use a
575 pointer into the original address. If there is a suffix, however, we have to
576 build a new string.
577
578 Arguments:
579   addr              the address item
580   include_affixes   TRUE if affixes are to be included
581
582 Returns:            a string
583 */
584
585 const uschar *
586 transport_rcpt_address(address_item *addr, BOOL include_affixes)
587 {
588 uschar *at;
589 int plen, slen;
590
591 if (include_affixes)
592   {
593   setflag(addr, af_include_affixes);  /* Affects logged => line */
594   return addr->address;
595   }
596
597 if (!addr->suffix)
598   {
599   if (!addr->prefix) return addr->address;
600   return addr->address + Ustrlen(addr->prefix);
601   }
602
603 at = Ustrrchr(addr->address, '@');
604 plen = addr->prefix ? Ustrlen(addr->prefix) : 0;
605 slen = Ustrlen(addr->suffix);
606
607 return string_sprintf("%.*s@%s", (int)(at - addr->address - plen - slen),
608    addr->address + plen, at + 1);
609 }
610
611
612 /*************************************************
613 *  Output Envelope-To: address & scan duplicates *
614 *************************************************/
615
616 /* This function is called from internal_transport_write_message() below, when
617 generating an Envelope-To: header line. It checks for duplicates of the given
618 address and its ancestors. When one is found, this function calls itself
619 recursively, to output the envelope address of the duplicate.
620
621 We want to avoid duplication in the list, which can arise for example when
622 A->B,C and then both B and C alias to D. This can also happen when there are
623 unseen drivers in use. So a list of addresses that have been output is kept in
624 the plist variable.
625
626 It is also possible to have loops in the address ancestry/duplication graph,
627 for example if there are two top level addresses A and B and we have A->B,C and
628 B->A. To break the loop, we use a list of processed addresses in the dlist
629 variable.
630
631 After handling duplication, this function outputs the progenitor of the given
632 address.
633
634 Arguments:
635   p         the address we are interested in
636   pplist    address of anchor of the list of addresses not to output
637   pdlist    address of anchor of the list of processed addresses
638   first     TRUE if this is the first address; set it FALSE afterwards
639   tctx      transport context - processing to be done during output
640               and the file descriptor to write to
641
642 Returns:    FALSE if writing failed
643 */
644
645 static BOOL
646 write_env_to(address_item *p, struct aci **pplist, struct aci **pdlist,
647   BOOL *first, transport_ctx * tctx)
648 {
649 address_item *pp;
650 struct aci *ppp;
651
652 /* Do nothing if we have already handled this address. If not, remember it
653 so that we don't handle it again. */
654
655 for (ppp = *pdlist; ppp; ppp = ppp->next) if (p == ppp->ptr) return TRUE;
656
657 ppp = store_get(sizeof(struct aci), GET_UNTAINTED);
658 ppp->next = *pdlist;
659 *pdlist = ppp;
660 ppp->ptr = p;
661
662 /* Now scan up the ancestry, checking for duplicates at each generation. */
663
664 for (pp = p;; pp = pp->parent)
665   {
666   address_item *dup;
667   for (dup = addr_duplicate; dup; dup = dup->next)
668     if (dup->dupof == pp)   /* a dup of our address */
669       if (!write_env_to(dup, pplist, pdlist, first, tctx))
670         return FALSE;
671   if (!pp->parent) break;
672   }
673
674 /* Check to see if we have already output the progenitor. */
675
676 for (ppp = *pplist; ppp; ppp = ppp->next) if (pp == ppp->ptr) break;
677 if (ppp) return TRUE;
678
679 /* Remember what we have output, and output it. */
680
681 ppp = store_get(sizeof(struct aci), GET_UNTAINTED);
682 ppp->next = *pplist;
683 *pplist = ppp;
684 ppp->ptr = pp;
685
686 if (!*first && !write_chunk(tctx, US",\n ", 3)) return FALSE;
687 *first = FALSE;
688 return write_chunk(tctx, pp->address, Ustrlen(pp->address));
689 }
690
691
692
693
694 /* Add/remove/rewrite headers, and send them plus the empty-line separator.
695
696 Globals:
697   header_list
698
699 Arguments:
700   addr                  (chain of) addresses (for extra headers), or NULL;
701                           only the first address is used
702   tctx                  transport context
703   sendfn                function for output (transport or verify)
704
705 Returns:                TRUE on success; FALSE on failure.
706 */
707 BOOL
708 transport_headers_send(transport_ctx * tctx,
709   BOOL (*sendfn)(transport_ctx * tctx, const uschar * s, int len))
710 {
711 const uschar * list;
712 transport_instance * tblock = tctx ? tctx->tblock : NULL;
713 address_item * addr = tctx ? tctx->addr : NULL;
714
715 /* Then the message's headers. Don't write any that are flagged as "old";
716 that means they were rewritten, or are a record of envelope rewriting, or
717 were removed (e.g. Bcc). If remove_headers is not null, skip any headers that
718 match any entries therein.  It is a colon-sep list; expand the items
719 separately and squash any empty ones.
720 Then check addr->prop.remove_headers too, provided that addr is not NULL. */
721
722 for (header_line * h = header_list; h; h = h->next) if (h->type != htype_old)
723   {
724   BOOL include_header = TRUE;
725
726   list = tblock ? tblock->remove_headers : NULL;
727   for (int i = 0; i < 2; i++)    /* For remove_headers && addr->prop.remove_headers */
728     {
729     if (list)
730       {
731       int sep = ':';         /* This is specified as a colon-separated list */
732       uschar *s, *ss;
733       while ((s = string_nextinlist(&list, &sep, NULL, 0)))
734         {
735         int len;
736
737         if (i == 0)
738           if (!(s = expand_string(s)) && !f.expand_string_forcedfail)
739             {
740             errno = ERRNO_CHHEADER_FAIL;
741             return FALSE;
742             }
743         len = s ? Ustrlen(s) : 0;
744         if (len && s[len-1] == '*')     /* trailing glob */
745           {
746           if (strncmpic(h->text, s, len-1) == 0) break;
747           }
748         else
749           {
750           if (strncmpic(h->text, s, len) != 0) continue;
751           ss = h->text + len;
752           while (*ss == ' ' || *ss == '\t') ss++;
753           if (*ss == ':') break;
754           }
755         }
756       if (s) { include_header = FALSE; break; }
757       }
758     if (addr) list = addr->prop.remove_headers;
759     }
760
761   /* If this header is to be output, try to rewrite it if there are rewriting
762   rules. */
763
764   if (include_header)
765     {
766     int len;
767     if (tblock && tblock->rewrite_rules)
768       {
769       rmark reset_point = store_mark();
770       header_line * hh;
771
772       if ((hh = rewrite_header(h, NULL, NULL, tblock->rewrite_rules,
773                   tblock->rewrite_existflags, FALSE)))
774         {
775         len = hh->slen;
776         if (tctx->options & topt_truncate_headers && len > 998) len = 998;
777         if (!sendfn(tctx, hh->text, len)) return FALSE;
778         store_reset(reset_point);
779         continue;     /* With the next header line */
780         }
781       }
782
783     /* Either no rewriting rules, or it didn't get rewritten */
784
785     len = h->slen;
786     if (tctx->options & topt_truncate_headers && len > 998) len = 998;
787     if (!sendfn(tctx, h->text, len)) return FALSE;
788     }
789
790   /* Header removed */
791
792   else
793     DEBUG(D_transport) debug_printf("removed header line:\n %s---\n", h->text);
794   }
795
796 /* Add on any address-specific headers. If there are multiple addresses,
797 they will all have the same headers in order to be batched. The headers
798 are chained in reverse order of adding (so several addresses from the
799 same alias might share some of them) but we want to output them in the
800 opposite order. This is a bit tedious, but there shouldn't be very many
801 of them. We just walk the list twice, reversing the pointers each time,
802 but on the second time, write out the items.
803
804 Headers added to an address by a router are guaranteed to end with a newline.
805 */
806
807 if (addr)
808   {
809   header_line * hprev = addr->prop.extra_headers, * hnext, * h;
810
811   for (int i = 0; i < 2; i++)
812     for (h = hprev, hprev = NULL; h; h = hnext)
813       {
814       hnext = h->next;
815       h->next = hprev;
816       hprev = h;
817       if (i == 1)
818         {
819         if (!sendfn(tctx, h->text, h->slen)) return FALSE;
820         DEBUG(D_transport)
821           debug_printf("added header line(s):\n %s---\n", h->text);
822         }
823       }
824   }
825
826 /* If a string containing additional headers exists it is a newline-sep
827 list.  Expand each item and write out the result.  This is done last so that
828 if it (deliberately or accidentally) isn't in header format, it won't mess
829 up any other headers. An empty string or a forced expansion failure are
830 noops. An added header string from a transport may not end with a newline;
831 add one if it does not. */
832
833 if (tblock && (list = CUS tblock->add_headers))
834   {
835   int sep = '\n';
836   uschar * s;
837
838   while ((s = string_nextinlist(&list, &sep, NULL, 0)))
839     if ((s = expand_string(s)))
840       {
841       int len = Ustrlen(s);
842       if (len > 0)
843         {
844         if (!sendfn(tctx, s, len)) return FALSE;
845         if (s[len-1] != '\n' && !sendfn(tctx, US"\n", 1))
846           return FALSE;
847         DEBUG(D_transport)
848           {
849           debug_printf("added header line:\n %s", s);
850           if (s[len-1] != '\n') debug_printf("\n");
851           debug_printf("---\n");
852           }
853         }
854       }
855     else if (!f.expand_string_forcedfail)
856       { errno = ERRNO_CHHEADER_FAIL; return FALSE; }
857   }
858
859 /* Separate headers from body with a blank line */
860
861 return sendfn(tctx, US"\n", 1);
862 }
863
864
865 /*************************************************
866 *                Write the message               *
867 *************************************************/
868
869 /* This function writes the message to the given file descriptor. The headers
870 are in the in-store data structure, and the rest of the message is in the open
871 file descriptor deliver_datafile. Make sure we start it at the beginning.
872
873 . If add_return_path is TRUE, a "return-path:" header is added to the message,
874   containing the envelope sender's address.
875
876 . If add_envelope_to is TRUE, a "envelope-to:" header is added to the message,
877   giving the top-level envelope address that caused this delivery to happen.
878
879 . If add_delivery_date is TRUE, a "delivery-date:" header is added to the
880   message. It gives the time and date that delivery took place.
881
882 . If check_string is not null, the start of each line is checked for that
883   string. If it is found, it is replaced by escape_string. This used to be
884   the "from hack" for files, and "smtp_dots" for escaping SMTP dots.
885
886 . If use_crlf is true, newlines are turned into CRLF (SMTP output).
887
888 The yield is TRUE if all went well, and FALSE if not. Exit *immediately* after
889 any writing or reading error, leaving the code in errno intact. Error exits
890 can include timeouts for certain transports, which are requested by setting
891 transport_write_timeout non-zero.
892
893 Arguments:
894   tctx
895     (fd, msg)           Either an fd, to write the message to,
896                         or a string: if null write message to allocated space
897                         otherwire take content as headers.
898     addr                (chain of) addresses (for extra headers), or NULL;
899                           only the first address is used
900     tblock              optional transport instance block (NULL signifies NULL/0):
901       add_headers           a string containing one or more headers to add; it is
902                             expanded, and must be in correct RFC 822 format as
903                             it is transmitted verbatim; NULL => no additions,
904                             and so does empty string or forced expansion fail
905       remove_headers        a colon-separated list of headers to remove, or NULL
906       rewrite_rules         chain of header rewriting rules
907       rewrite_existflags    flags for the rewriting rules
908     options               bit-wise options:
909       add_return_path       if TRUE, add a "return-path" header
910       add_envelope_to       if TRUE, add a "envelope-to" header
911       add_delivery_date     if TRUE, add a "delivery-date" header
912       use_crlf              if TRUE, turn NL into CR LF
913       end_dot               if TRUE, send a terminating "." line at the end
914       no_flush              if TRUE, do not flush at end
915       no_headers            if TRUE, omit the headers
916       no_body               if TRUE, omit the body
917     check_string          a string to check for at the start of lines, or NULL
918     escape_string         a string to insert in front of any check string
919   size_limit              if > 0, this is a limit to the size of message written;
920                             it is used when returning messages to their senders,
921                             and is approximate rather than exact, owing to chunk
922                             buffering
923
924 Returns:                TRUE on success; FALSE (with errno) on failure.
925                         In addition, the global variable transport_count
926                         is incremented by the number of bytes written.
927 */
928
929 static BOOL
930 internal_transport_write_message(transport_ctx * tctx, int size_limit)
931 {
932 int len, size = 0;
933
934 /* Initialize pointer in output buffer. */
935
936 transport_write_reset(tctx->options);
937
938 /* Set up the data for start-of-line data checking and escaping */
939
940 if (tctx->check_string && tctx->escape_string)
941   {
942   nl_check = tctx->check_string;
943   nl_check_length = Ustrlen(nl_check);
944   nl_escape = tctx->escape_string;
945   nl_escape_length = Ustrlen(nl_escape);
946   }
947
948 /* Whether the escaping mechanism is applied to headers or not is controlled by
949 an option (set for SMTP, not otherwise). Negate the length if not wanted till
950 after the headers. */
951
952 if (!(tctx->options & topt_escape_headers))
953   nl_check_length = -nl_check_length;
954
955 /* Write the headers if required, including any that have to be added. If there
956 are header rewriting rules, apply them.  The datasource is not the -D spoolfile
957 so temporarily hide the global that adjusts for its format. */
958
959 if (!(tctx->options & topt_no_headers))
960   {
961   BOOL save_wireformat = f.spool_file_wireformat;
962   f.spool_file_wireformat = FALSE;
963
964   /* Add return-path: if requested. */
965
966   if (tctx->options & topt_add_return_path)
967     {
968     int n;
969     uschar * s = string_sprintf("Return-path: <%.*s>\n%n",
970                           EXIM_EMAILADDR_MAX, return_path, &n);
971     if (!write_chunk(tctx, s, n)) goto bad;
972     }
973
974   /* Add envelope-to: if requested */
975
976   if (tctx->options & topt_add_envelope_to)
977     {
978     BOOL first = TRUE;
979     struct aci *plist = NULL;
980     struct aci *dlist = NULL;
981     rmark reset_point = store_mark();
982
983     if (!write_chunk(tctx, US"Envelope-to: ", 13)) goto bad;
984
985     /* Pick up from all the addresses. The plist and dlist variables are
986     anchors for lists of addresses already handled; they have to be defined at
987     this level because write_env_to() calls itself recursively. */
988
989     for (address_item * p = tctx->addr; p; p = p->next)
990       if (!write_env_to(p, &plist, &dlist, &first, tctx))
991         goto bad;
992
993     /* Add a final newline and reset the store used for tracking duplicates */
994
995     if (!write_chunk(tctx, US"\n", 1)) goto bad;
996     store_reset(reset_point);
997     }
998
999   /* Add delivery-date: if requested. */
1000
1001   if (tctx->options & topt_add_delivery_date)
1002     {
1003     uschar * s = tod_stamp(tod_full);
1004
1005     if (  !write_chunk(tctx, US"Delivery-date: ", 15)
1006        || !write_chunk(tctx, s, Ustrlen(s))
1007        || !write_chunk(tctx, US"\n", 1)) goto bad;
1008     }
1009
1010   /* Then the message's headers. Don't write any that are flagged as "old";
1011   that means they were rewritten, or are a record of envelope rewriting, or
1012   were removed (e.g. Bcc). If remove_headers is not null, skip any headers that
1013   match any entries therein. Then check addr->prop.remove_headers too, provided that
1014   addr is not NULL. */
1015
1016   if (!transport_headers_send(tctx, &write_chunk))
1017     {
1018 bad:
1019     f.spool_file_wireformat = save_wireformat;
1020     return FALSE;
1021     }
1022
1023   f.spool_file_wireformat = save_wireformat;
1024   }
1025
1026 /* When doing RFC3030 CHUNKING output, work out how much data would be in a
1027 last-BDAT, consisting of the current write_chunk() output buffer fill
1028 (optimally, all of the headers - but it does not matter if we already had to
1029 flush that buffer with non-last BDAT prependix) plus the amount of body data
1030 (as expanded for CRLF lines).  Then create and write BDAT(s), and ensure
1031 that further use of write_chunk() will not prepend BDATs.
1032 The first BDAT written will also first flush any outstanding MAIL and RCPT
1033 commands which were buffered thans to PIPELINING.
1034 Commands go out (using a send()) from a different buffer to data (using a
1035 write()).  They might not end up in the same TCP segment, which is
1036 suboptimal. */
1037
1038 if (tctx->options & topt_use_bdat)
1039   {
1040   off_t fsize;
1041   int hsize;
1042
1043   if ((hsize = chunk_ptr - deliver_out_buffer) < 0)
1044     hsize = 0;
1045   if (!(tctx->options & topt_no_body))
1046     {
1047     if ((fsize = lseek(deliver_datafile, 0, SEEK_END)) < 0) return FALSE;
1048     fsize -= spool_data_start_offset(message_id);
1049     if (size_limit > 0  &&  fsize > size_limit)
1050       fsize = size_limit;
1051     size = hsize + fsize;
1052     if (tctx->options & topt_use_crlf  &&  !f.spool_file_wireformat)
1053       size += body_linecount;   /* account for CRLF-expansion */
1054
1055     /* With topt_use_bdat we never do dot-stuffing; no need to
1056     account for any expansion due to that. */
1057     }
1058
1059   /* If the message is large, emit first a non-LAST chunk with just the
1060   headers, and reap the command responses.  This lets us error out early
1061   on RCPT rejects rather than sending megabytes of data.  Include headers
1062   on the assumption they are cheap enough and some clever implementations
1063   might errorcheck them too, on-the-fly, and reject that chunk. */
1064
1065   if (size > DELIVER_OUT_BUFFER_SIZE && hsize > 0)
1066     {
1067     DEBUG(D_transport)
1068       debug_printf("sending small initial BDAT; hsize=%d\n", hsize);
1069     if (  tctx->chunk_cb(tctx, hsize, 0) != OK
1070        || !transport_write_block(tctx, deliver_out_buffer, hsize, FALSE)
1071        || tctx->chunk_cb(tctx, 0, tc_reap_prev) != OK
1072        )
1073       return FALSE;
1074     chunk_ptr = deliver_out_buffer;
1075     size -= hsize;
1076     }
1077
1078   /* Emit a LAST datachunk command, and unmark the context for further
1079   BDAT commands. */
1080
1081   if (tctx->chunk_cb(tctx, size, tc_chunk_last) != OK)
1082     return FALSE;
1083   tctx->options &= ~topt_use_bdat;
1084   }
1085
1086 /* If the body is required, ensure that the data for check strings (formerly
1087 the "from hack") is enabled by negating the length if necessary. (It will be
1088 negative in cases where it isn't to apply to the headers). Then ensure the body
1089 is positioned at the start of its file (following the message id), then write
1090 it, applying the size limit if required. */
1091
1092 /* If we have a wireformat -D file (CRNL lines, non-dotstuffed, no ending dot)
1093 and we want to send a body without dotstuffing or ending-dot, in-clear,
1094 then we can just dump it using sendfile.
1095 This should get used for CHUNKING output and also for writing the -K file for
1096 dkim signing,  when we had CHUNKING input.  */
1097
1098 #ifdef OS_SENDFILE
1099 if (  f.spool_file_wireformat
1100    && !(tctx->options & (topt_no_body | topt_end_dot))
1101    && !nl_check_length
1102    && tls_out.active.sock != tctx->u.fd
1103    )
1104   {
1105   ssize_t copied = 0;
1106   off_t offset = spool_data_start_offset(message_id);
1107
1108   /* Write out any header data in the buffer */
1109
1110   if ((len = chunk_ptr - deliver_out_buffer) > 0)
1111     {
1112     if (!transport_write_block(tctx, deliver_out_buffer, len, TRUE))
1113       return FALSE;
1114     size -= len;
1115     }
1116
1117   DEBUG(D_transport) debug_printf("using sendfile for body\n");
1118
1119   while(size > 0)
1120     {
1121     if ((copied = os_sendfile(tctx->u.fd, deliver_datafile, &offset, size)) <= 0) break;
1122     size -= copied;
1123     }
1124   return copied >= 0;
1125   }
1126 #else
1127 DEBUG(D_transport) debug_printf("cannot use sendfile for body: no support\n");
1128 #endif
1129
1130 DEBUG(D_transport)
1131   if (!(tctx->options & topt_no_body))
1132     debug_printf("cannot use sendfile for body: %s\n",
1133       !f.spool_file_wireformat ? "spoolfile not wireformat"
1134       : tctx->options & topt_end_dot ? "terminating dot wanted"
1135       : nl_check_length ? "dot- or From-stuffing wanted"
1136       : "TLS output wanted");
1137
1138 if (!(tctx->options & topt_no_body))
1139   {
1140   unsigned long size = size_limit > 0 ? size_limit : ULONG_MAX;
1141
1142   nl_check_length = abs(nl_check_length);
1143   nl_partial_match = 0;
1144   if (lseek(deliver_datafile, spool_data_start_offset(message_id), SEEK_SET) < 0)
1145     return FALSE;
1146   while (  (len = MIN(DELIVER_IN_BUFFER_SIZE, size)) > 0
1147         && (len = read(deliver_datafile, deliver_in_buffer, len)) > 0)
1148     {
1149     if (!write_chunk(tctx, deliver_in_buffer, len))
1150       return FALSE;
1151     size -= len;
1152     }
1153
1154   /* A read error on the body will have left len == -1 and errno set. */
1155
1156   if (len != 0) return FALSE;
1157   }
1158
1159 /* Finished with the check string, and spool-format consideration */
1160
1161 nl_check_length = nl_escape_length = 0;
1162 f.spool_file_wireformat = FALSE;
1163
1164 /* If requested, add a terminating "." line (SMTP output). */
1165
1166 if (tctx->options & topt_end_dot)
1167   {
1168   smtp_debug_cmd(US".", 0);
1169   if (!write_chunk(tctx, US".\n", 2))
1170     return FALSE;
1171   }
1172
1173 /* Write out any remaining data in the buffer before returning. */
1174
1175 return (len = chunk_ptr - deliver_out_buffer) <= 0
1176   || transport_write_block(tctx, deliver_out_buffer, len,
1177                             !!(tctx->options & topt_no_flush));
1178 }
1179
1180
1181
1182
1183 /*************************************************
1184 *    External interface to write the message     *
1185 *************************************************/
1186
1187 /* If there is no filtering required, call the internal function above to do
1188 the real work, passing over all the arguments from this function. Otherwise,
1189 set up a filtering process, fork another process to call the internal function
1190 to write to the filter, and in this process just suck from the filter and write
1191 down the fd in the transport context. At the end, tidy up the pipes and the
1192 processes.
1193
1194 Arguments:     as for internal_transport_write_message() above
1195
1196 Returns:       TRUE on success; FALSE (with errno) for any failure
1197                transport_count is incremented by the number of bytes written
1198 */
1199
1200 BOOL
1201 transport_write_message(transport_ctx * tctx, int size_limit)
1202 {
1203 BOOL last_filter_was_NL = TRUE;
1204 BOOL save_spool_file_wireformat = f.spool_file_wireformat;
1205 BOOL yield;
1206 int rc, len, fd_read, fd_write, save_errno;
1207 int pfd[2] = {-1, -1};
1208 pid_t filter_pid, write_pid;
1209
1210 f.transport_filter_timed_out = FALSE;
1211
1212 /* If there is no filter command set up, call the internal function that does
1213 the actual work, passing it the incoming fd, and return its result. */
1214
1215 if (  !transport_filter_argv
1216    || !*transport_filter_argv
1217    || !**transport_filter_argv
1218    )
1219   return internal_transport_write_message(tctx, size_limit);
1220
1221 /* Otherwise the message must be written to a filter process and read back
1222 before being written to the incoming fd. First set up the special processing to
1223 be done during the copying. */
1224
1225 nl_partial_match = -1;
1226
1227 if (tctx->check_string && tctx->escape_string)
1228   {
1229   nl_check = tctx->check_string;
1230   nl_check_length = Ustrlen(nl_check);
1231   nl_escape = tctx->escape_string;
1232   nl_escape_length = Ustrlen(nl_escape);
1233   }
1234 else nl_check_length = nl_escape_length = 0;
1235
1236 /* Start up a subprocess to run the command. Ensure that our main fd will
1237 be closed when the subprocess execs, but remove the flag afterwards.
1238 (Otherwise, if this is a TCP/IP socket, it can't get passed on to another
1239 process to deliver another message.) We get back stdin/stdout file descriptors.
1240 If the process creation failed, give an error return. */
1241
1242 fd_read = -1;
1243 fd_write = -1;
1244 save_errno = 0;
1245 yield = FALSE;
1246 write_pid = (pid_t)(-1);
1247
1248   {
1249   int bits = fcntl(tctx->u.fd, F_GETFD);
1250   (void) fcntl(tctx->u.fd, F_SETFD, bits | FD_CLOEXEC);
1251   filter_pid = child_open(USS transport_filter_argv, NULL, 077,
1252                           &fd_write, &fd_read, FALSE, US"transport-filter");
1253   (void) fcntl(tctx->u.fd, F_SETFD, bits & ~FD_CLOEXEC);
1254   }
1255 if (filter_pid < 0) goto TIDY_UP;      /* errno set */
1256
1257 DEBUG(D_transport)
1258   debug_printf("process %d running as transport filter: fd_write=%d fd_read=%d\n",
1259     (int)filter_pid, fd_write, fd_read);
1260
1261 /* Fork subprocess to write the message to the filter, and return the result
1262 via a(nother) pipe. While writing to the filter, we do not do the CRLF,
1263 smtp dots, or check string processing. */
1264
1265 if (pipe(pfd) != 0) goto TIDY_UP;      /* errno set */
1266 if ((write_pid = exim_fork(US"tpt-filter-writer")) == 0)
1267   {
1268   BOOL rc;
1269   (void)close(fd_read);
1270   (void)close(pfd[pipe_read]);
1271   nl_check_length = nl_escape_length = 0;
1272
1273   tctx->u.fd = fd_write;
1274   tctx->check_string = tctx->escape_string = NULL;
1275   tctx->options &= ~(topt_use_crlf | topt_end_dot | topt_use_bdat | topt_no_flush);
1276
1277   rc = internal_transport_write_message(tctx, size_limit);
1278
1279   save_errno = errno;
1280   if (  write(pfd[pipe_write], (void *)&rc, sizeof(BOOL))
1281         != sizeof(BOOL)
1282      || write(pfd[pipe_write], (void *)&save_errno, sizeof(int))
1283         != sizeof(int)
1284      || write(pfd[pipe_write], (void *)&tctx->addr->more_errno, sizeof(int))
1285         != sizeof(int)
1286      || write(pfd[pipe_write], (void *)&tctx->addr->delivery_time, sizeof(struct timeval))
1287         != sizeof(struct timeval)
1288      )
1289     rc = FALSE; /* compiler quietening */
1290   exim_underbar_exit(EXIT_SUCCESS);
1291   }
1292 save_errno = errno;
1293
1294 /* Parent process: close our copy of the writing subprocess' pipes. */
1295
1296 (void)close(pfd[pipe_write]);
1297 (void)close(fd_write);
1298 fd_write = -1;
1299
1300 /* Writing process creation failed */
1301
1302 if (write_pid < 0)
1303   {
1304   errno = save_errno;    /* restore */
1305   goto TIDY_UP;
1306   }
1307
1308 /* When testing, let the subprocess get going */
1309
1310 testharness_pause_ms(250);
1311
1312 DEBUG(D_transport)
1313   debug_printf("process %d writing to transport filter\n", (int)write_pid);
1314
1315 /* Copy the message from the filter to the output fd. A read error leaves len
1316 == -1 and errno set. We need to apply a timeout to the read, to cope with
1317 the case when the filter gets stuck, but it can be quite a long one. The
1318 default is 5m, but this is now configurable. */
1319
1320 DEBUG(D_transport) debug_printf("copying from the filter\n");
1321
1322 /* Copy the output of the filter, remembering if the last character was NL. If
1323 no data is returned, that counts as "ended with NL" (default setting of the
1324 variable is TRUE).  The output should always be unix-format as we converted
1325 any wireformat source on writing input to the filter. */
1326
1327 f.spool_file_wireformat = FALSE;
1328 chunk_ptr = deliver_out_buffer;
1329
1330 for (;;)
1331   {
1332   sigalrm_seen = FALSE;
1333   ALARM(transport_filter_timeout);
1334   len = read(fd_read, deliver_in_buffer, DELIVER_IN_BUFFER_SIZE);
1335   ALARM_CLR(0);
1336   if (sigalrm_seen)
1337     {
1338     DEBUG(D_transport) debug_printf("timed out reading from filter\n");
1339     errno = ETIMEDOUT;
1340     f.transport_filter_timed_out = TRUE;
1341     goto TIDY_UP;
1342     }
1343
1344   /* If the read was successful, write the block down the original fd,
1345   remembering whether it ends in \n or not. */
1346
1347   if (len > 0)
1348     {
1349     if (!write_chunk(tctx, deliver_in_buffer, len)) goto TIDY_UP;
1350     last_filter_was_NL = (deliver_in_buffer[len-1] == '\n');
1351     }
1352
1353   /* Otherwise, break the loop. If we have hit EOF, set yield = TRUE. */
1354
1355   else
1356     {
1357     if (len == 0) yield = TRUE;
1358     break;
1359     }
1360   }
1361
1362 /* Tidying up code. If yield = FALSE there has been an error and errno is set
1363 to something. Ensure the pipes are all closed and the processes are removed. If
1364 there has been an error, kill the processes before waiting for them, just to be
1365 sure. Also apply a paranoia timeout. */
1366
1367 TIDY_UP:
1368 f.spool_file_wireformat = save_spool_file_wireformat;
1369 save_errno = errno;
1370
1371 (void)close(fd_read);
1372 if (fd_write > 0) (void)close(fd_write);
1373
1374 if (!yield)
1375   {
1376   if (filter_pid > 0) kill(filter_pid, SIGKILL);
1377   if (write_pid > 0)  kill(write_pid, SIGKILL);
1378   }
1379
1380 /* Wait for the filter process to complete. */
1381
1382 DEBUG(D_transport) debug_printf("waiting for filter process\n");
1383 if (filter_pid > 0 && (rc = child_close(filter_pid, 30)) != 0 && yield)
1384   {
1385   yield = FALSE;
1386   save_errno = ERRNO_FILTER_FAIL;
1387   tctx->addr->more_errno = rc;
1388   DEBUG(D_transport) debug_printf("filter process returned %d\n", rc);
1389   }
1390
1391 /* Wait for the writing process to complete. If it ends successfully,
1392 read the results from its pipe, provided we haven't already had a filter
1393 process failure. */
1394
1395 DEBUG(D_transport) debug_printf("waiting for writing process\n");
1396 if (write_pid > 0)
1397   {
1398   rc = child_close(write_pid, 30);
1399   if (yield)
1400     if (rc == 0)
1401       {
1402       BOOL ok;
1403       if (read(pfd[pipe_read], (void *)&ok, sizeof(BOOL)) != sizeof(BOOL))
1404         {
1405         DEBUG(D_transport)
1406           debug_printf("pipe read from writing process: %s\n", strerror(errno));
1407         save_errno = ERRNO_FILTER_FAIL;
1408         yield = FALSE;
1409         }
1410       else if (!ok)
1411         {               /* Try to drain the pipe; read fails are don't care */
1412         int dummy = read(pfd[pipe_read], (void *)&save_errno, sizeof(int));
1413         dummy = read(pfd[pipe_read], (void *)&tctx->addr->more_errno, sizeof(int));
1414         dummy = read(pfd[pipe_read], (void *)&tctx->addr->delivery_time, sizeof(struct timeval));
1415         yield = FALSE;
1416         }
1417       }
1418     else
1419       {
1420       yield = FALSE;
1421       save_errno = ERRNO_FILTER_FAIL;
1422       tctx->addr->more_errno = rc;
1423       DEBUG(D_transport) debug_printf("writing process returned %d\n", rc);
1424       }
1425   }
1426 (void)close(pfd[pipe_read]);
1427
1428 /* If there have been no problems we can now add the terminating "." if this is
1429 SMTP output, turning off escaping beforehand. If the last character from the
1430 filter was not NL, insert a NL to make the SMTP protocol work. */
1431
1432 if (yield)
1433   {
1434   nl_check_length = nl_escape_length = 0;
1435   f.spool_file_wireformat = FALSE;
1436   if (  tctx->options & topt_end_dot
1437      && ( last_filter_was_NL
1438         ? !write_chunk(tctx, US".\n", 2)
1439         : !write_chunk(tctx, US"\n.\n", 3)
1440      )  )
1441     { smtp_debug_cmd(US".", 0); yield = FALSE; }
1442
1443   /* Write out any remaining data in the buffer. */
1444
1445   else
1446     yield = (len = chunk_ptr - deliver_out_buffer) <= 0
1447           || transport_write_block(tctx, deliver_out_buffer, len, FALSE);
1448   }
1449 else
1450   errno = save_errno;      /* From some earlier error */
1451
1452 DEBUG(D_transport)
1453   {
1454   debug_printf("end of filtering transport writing: yield=%d\n", yield);
1455   if (!yield)
1456     debug_printf(" errno=%d more_errno=%d\n", errno, tctx->addr->more_errno);
1457   }
1458
1459 return yield;
1460 }
1461
1462
1463
1464
1465
1466 /*************************************************
1467 *            Update waiting database             *
1468 *************************************************/
1469
1470 /* This is called when an address is deferred by remote transports that are
1471 capable of sending more than one message over one connection. A database is
1472 maintained for each transport, keeping track of which messages are waiting for
1473 which hosts. The transport can then consult this when eventually a successful
1474 delivery happens, and if it finds that another message is waiting for the same
1475 host, it can fire up a new process to deal with it using the same connection.
1476
1477 The database records are keyed by host name. They can get full if there are
1478 lots of messages waiting, and so there is a continuation mechanism for them.
1479
1480 Each record contains a list of message ids, packed end to end without any
1481 zeros. Each one is MESSAGE_ID_LENGTH bytes long. The count field says how many
1482 in this record, and the sequence field says if there are any other records for
1483 this host. If the sequence field is 0, there are none. If it is 1, then another
1484 record with the name <hostname>:0 exists; if it is 2, then two other records
1485 with sequence numbers 0 and 1 exist, and so on.
1486
1487 Currently, an exhaustive search of all continuation records has to be done to
1488 determine whether to add a message id to a given record. This shouldn't be
1489 too bad except in extreme cases. I can't figure out a *simple* way of doing
1490 better.
1491
1492 Old records should eventually get swept up by the exim_tidydb utility.
1493
1494 Arguments:
1495   hostlist  list of hosts that this message could be sent to
1496   tpname    name of the transport
1497
1498 Returns:    nothing
1499 */
1500
1501 void
1502 transport_update_waiting(host_item * hostlist, const uschar * tpname)
1503 {
1504 const uschar * prevname = US"";
1505 open_db dbblock, * dbp;
1506
1507 if (!is_new_message_id(message_id))
1508   {
1509   DEBUG(D_transport) debug_printf("message_id %s is not new format; "
1510     "skipping wait-%s database update\n", message_id, tpname);
1511   return;
1512   }
1513
1514 DEBUG(D_transport) debug_printf("updating wait-%s database\n", tpname);
1515
1516 /* Open the database (or transaction) for this transport */
1517
1518 if ( continue_wait_db
1519    ? !dbfn_transaction_start(dbp = continue_wait_db)
1520    : !(dbp = dbfn_open(string_sprintf("wait-%.200s", tpname),
1521                       O_RDWR|O_CREAT, &dbblock, TRUE, TRUE))
1522    )
1523   return;
1524
1525 /* Scan the list of hosts for which this message is waiting, and ensure
1526 that the message id is in each host record. */
1527
1528 for (host_item * host = hostlist; host; host = host->next)
1529   {
1530   BOOL already = FALSE;
1531   dbdata_wait * host_record;
1532   int host_length;
1533   uschar buffer[256];
1534
1535   /* Skip if this is the same host as we just processed; otherwise remember
1536   the name for next time. */
1537
1538   if (Ustrcmp(prevname, host->name) == 0) continue;
1539   prevname = host->name;
1540
1541   /* Look up the host record; if there isn't one, make an empty one. */
1542
1543   if (!(host_record = dbfn_read(dbp, host->name)))
1544     {
1545     host_record = store_get(sizeof(dbdata_wait) + MESSAGE_ID_LENGTH, GET_UNTAINTED);
1546     host_record->count = host_record->sequence = 0;
1547     }
1548
1549   /* Compute the current length */
1550
1551   host_length = host_record->count * MESSAGE_ID_LENGTH;
1552
1553   /* Search the record to see if the current message is already in it. */
1554
1555   for (uschar * s = host_record->text; s < host_record->text + host_length;
1556        s += MESSAGE_ID_LENGTH)
1557     {
1558     /* If any ID is seen which is not new-format, wipe the record and
1559     any continuations */
1560
1561     if (!is_new_message_id(s))
1562       {
1563       DEBUG(D_hints_lookup)
1564         debug_printf_indent("NOTE: old or corrupt message-id found in wait=%.200s"
1565           " hints DB; deleting records for %s\n", tpname, host->name);
1566
1567       (void) dbfn_delete(dbp, host->name);
1568       for (int i = host_record->sequence - 1; i >= 0; i--)
1569         (void) dbfn_delete(dbp,
1570                     (sprintf(CS buffer, "%.200s:%d", host->name, i), buffer));
1571
1572       host_record->count = host_record->sequence = 0;
1573       break;
1574       }
1575     if (Ustrncmp(s, message_id, MESSAGE_ID_LENGTH) == 0)
1576       { already = TRUE; break; }
1577     }
1578
1579   /* If we haven't found this message in the main record, search any
1580   continuation records that exist. */
1581
1582   for (int i = host_record->sequence - 1; i >= 0 && !already; i--)
1583     {
1584     dbdata_wait *cont;
1585     sprintf(CS buffer, "%.200s:%d", host->name, i);
1586     if ((cont = dbfn_read(dbp, buffer)))
1587       {
1588       int clen = cont->count * MESSAGE_ID_LENGTH;
1589       for (uschar * s = cont->text; s < cont->text + clen; s += MESSAGE_ID_LENGTH)
1590         if (Ustrncmp(s, message_id, MESSAGE_ID_LENGTH) == 0)
1591           { already = TRUE; break; }
1592       }
1593     }
1594
1595   /* If this message is already in a record, no need to update. */
1596
1597   if (already)
1598     {
1599     DEBUG(D_transport) debug_printf("already listed for %s\n", host->name);
1600     continue;
1601     }
1602
1603
1604   /* If this record is full, write it out with a new name constructed
1605   from the sequence number, increase the sequence number, and empty
1606   the record.  If we're doing a two-phase queue run initial phase, ping the
1607   daemon to consider running a delivery on this host. */
1608
1609   if (host_record->count >= WAIT_NAME_MAX)
1610     {
1611     sprintf(CS buffer, "%.200s:%d", host->name, host_record->sequence);
1612     dbfn_write(dbp, buffer, host_record, sizeof(dbdata_wait) + host_length);
1613 #ifndef DISABLE_QUEUE_RAMP
1614     if (f.queue_2stage && queue_fast_ramp && !queue_run_in_order)
1615       queue_notify_daemon(message_id);
1616 #endif
1617     host_record->sequence++;
1618     host_record->count = 0;
1619     host_length = 0;
1620     }
1621
1622   /* If this record is not full, increase the size of the record to
1623   allow for one new message id. */
1624
1625   else
1626     {
1627     dbdata_wait *newr =
1628       store_get(sizeof(dbdata_wait) + host_length + MESSAGE_ID_LENGTH, GET_UNTAINTED);
1629     memcpy(newr, host_record, sizeof(dbdata_wait) + host_length);
1630     host_record = newr;
1631     }
1632
1633   /* Now add the new name on the end */
1634
1635   memcpy(host_record->text + host_length, message_id, MESSAGE_ID_LENGTH);
1636   host_record->count++;
1637   host_length += MESSAGE_ID_LENGTH;
1638
1639   /* Update the database */
1640
1641   dbfn_write(dbp, host->name, host_record, sizeof(dbdata_wait) + host_length);
1642   DEBUG(D_transport) debug_printf("added %.*s to queue for %s\n",
1643                                   MESSAGE_ID_LENGTH, message_id, host->name);
1644   }
1645
1646 /* All now done */
1647
1648 if (continue_wait_db)
1649   dbfn_transaction_commit(dbp);
1650 else
1651   dbfn_close(dbp);
1652 }
1653
1654
1655
1656
1657 /*************************************************
1658 *         Test for waiting messages              *
1659 *************************************************/
1660
1661 /* This function is called by a remote transport which uses the previous
1662 function to remember which messages are waiting for which remote hosts. It's
1663 called after a successful delivery and its job is to check whether there is
1664 another message waiting for the same host. However, it doesn't do this if the
1665 current continue sequence is greater than the maximum supplied as an argument,
1666 or greater than the global connection_max_messages, which, if set, overrides.
1667
1668 It is also called if conditions are otherwise right for pipelining a QUIT after
1669 the message data, since if there is another message waiting we do not want to
1670 send that QUIT.
1671
1672 Arguments:
1673   transport_name     name of the transport
1674   hostname           name of the host
1675   local_message_max  maximum number of messages down one connection
1676                        as set by the caller transport
1677   new_message_id     set to the message id of a waiting message
1678   oicf_func          function to call to validate if it is ok to send
1679                      to this message_id from the current instance.
1680   oicf_data          opaque data for oicf_func
1681
1682 Returns:             TRUE if new_message_id set; FALSE otherwise
1683 */
1684
1685 typedef struct msgq_s
1686 {
1687     uschar  message_id [MESSAGE_ID_LENGTH + 1];
1688     BOOL    bKeep;
1689 } msgq_t;
1690
1691 BOOL
1692 transport_check_waiting(const uschar * transport_name, const uschar * hostname,
1693   int local_message_max, uschar * new_message_id,
1694   oicf oicf_func, void * oicf_data)
1695 {
1696 dbdata_wait * host_record;
1697 int host_length;
1698 open_db dbblock, * dbp;
1699
1700 int         i;
1701 struct stat statbuf;
1702
1703 DEBUG(D_transport)
1704   {
1705   debug_printf("transport_check_waiting entered\n");
1706   debug_printf("  sequence=%d local_max=%d global_max=%d\n",
1707     continue_sequence, local_message_max, connection_max_messages);
1708   acl_level++;
1709   }
1710
1711 /* Do nothing if we have hit the maximum number that can be sent down one
1712 connection. */
1713
1714 if (connection_max_messages >= 0) local_message_max = connection_max_messages;
1715 if (local_message_max > 0 && continue_sequence >= local_message_max)
1716   {
1717   DEBUG(D_transport)
1718     debug_printf_indent("max messages for one connection reached: returning\n");
1719   goto retfalse;
1720   }
1721
1722 /* Open the waiting information database. */
1723
1724 if ( continue_wait_db
1725    ? !dbfn_transaction_start(dbp = continue_wait_db)
1726    : !(dbp = dbfn_open(string_sprintf("wait-%.200s", transport_name),
1727                       O_RDWR, &dbblock, TRUE, TRUE))
1728    )
1729   {
1730   DEBUG(D_transport)
1731     debug_printf_indent("no messages waiting for %s\n", hostname);
1732   goto retfalse;
1733   }
1734
1735 /* See if there is a record for this host; if not, there's nothing to do. */
1736
1737 if (!(host_record = dbfn_read(dbp, hostname)))
1738   {
1739   DEBUG(D_transport)
1740     debug_printf_indent("no messages waiting for %s\n", hostname);
1741   goto dbclose_false;
1742   }
1743
1744 /* If the data in the record looks corrupt, just log something and
1745 don't try to use it. */
1746
1747 if (host_record->count > WAIT_NAME_MAX)
1748   {
1749   log_write(0, LOG_MAIN|LOG_PANIC, "smtp-wait database entry for %s has bad "
1750     "count=%d (max=%d)", hostname, host_record->count, WAIT_NAME_MAX);
1751   goto dbclose_false;
1752   }
1753
1754 /* Scan the message ids in the record in order
1755 until one is found for which a spool file actually exists. If the record gets
1756 emptied, delete it and continue with any continuation records that may exist.
1757 */
1758
1759 /* For Bug 1141, I refactored this major portion of the routine, it is risky
1760 but the 1 off will remain without it.  This code now allows me to SKIP over
1761 a message I do not want to send out on this run.  */
1762
1763 host_length = host_record->count * MESSAGE_ID_LENGTH;
1764
1765 while (1)
1766   {
1767   msgq_t * msgq;
1768   int msgq_count = 0, msgq_actual = 0;
1769   BOOL bFound = FALSE, bContinuation = FALSE;
1770
1771   /* create an array to read entire message queue into memory for processing  */
1772
1773   msgq = store_get(sizeof(msgq_t) * host_record->count, GET_UNTAINTED);
1774   msgq_actual = msgq_count = host_record->count;
1775
1776   for (i = 0; i < host_record->count; ++i)
1777     {
1778     /* If any ID is seen which is not new-format, wipe the record and
1779     any continuations */
1780
1781     if (!is_new_message_id(host_record->text + (i * MESSAGE_ID_LENGTH)))
1782       {
1783       uschar buffer[256];
1784       DEBUG(D_hints_lookup)
1785         debug_printf_indent("NOTE: old or corrupt message-id found in wait=%.200s"
1786           " hints DB; deleting records for %s\n", transport_name, hostname);
1787       (void) dbfn_delete(dbp, hostname);
1788       for (int j = host_record->sequence - 1; j >= 0; j--)
1789         (void) dbfn_delete(dbp,
1790                     (sprintf(CS buffer, "%.200s:%d", hostname, j), buffer));
1791       goto dbclose_false;
1792       }
1793     msgq[i].bKeep = TRUE;
1794
1795     Ustrncpy_nt(msgq[i].message_id, host_record->text + (i * MESSAGE_ID_LENGTH),
1796       MESSAGE_ID_LENGTH);
1797     msgq[i].message_id[MESSAGE_ID_LENGTH] = 0;
1798     }
1799
1800   /* first thing remove current message id if it exists */
1801   /*XXX but what if it has un-sent addrs? */
1802
1803   for (i = 0; i < msgq_count; ++i)
1804     if (Ustrcmp(msgq[i].message_id, message_id) == 0)
1805       {
1806       msgq[i].bKeep = FALSE;
1807       break;
1808       }
1809
1810   /* now find the next acceptable message_id */
1811
1812   for (i = 0; i < msgq_count; i++) if (msgq[i].bKeep)
1813     {
1814     uschar subdir[2];
1815     uschar * mid = msgq[i].message_id;
1816
1817     set_subdir_str(subdir, mid, 0);
1818     if (Ustat(spool_fname(US"input", subdir, mid, US"-D"), &statbuf) != 0)
1819       msgq[i].bKeep = FALSE;
1820     else if (!oicf_func || oicf_func(mid, oicf_data))
1821       {
1822       Ustrcpy_nt(new_message_id, mid);
1823       msgq[i].bKeep = FALSE;
1824       bFound = TRUE;
1825       break;
1826       }
1827     }
1828
1829   /* re-count */
1830   for (msgq_actual = 0, i = 0; i < msgq_count; ++i)
1831     if (msgq[i].bKeep)
1832       msgq_actual++;
1833
1834   /* reassemble the host record, based on removed message ids, from in
1835   memory queue  */
1836
1837   if (msgq_actual <= 0)
1838     {
1839     host_length = 0;
1840     host_record->count = 0;
1841     }
1842   else
1843     {
1844     host_length = msgq_actual * MESSAGE_ID_LENGTH;
1845     host_record->count = msgq_actual;
1846
1847     if (msgq_actual < msgq_count)
1848       {
1849       int new_count;
1850       for (new_count = 0, i = 0; i < msgq_count; ++i)
1851         if (msgq[i].bKeep)
1852           Ustrncpy(&host_record->text[new_count++ * MESSAGE_ID_LENGTH],
1853             msgq[i].message_id, MESSAGE_ID_LENGTH);
1854
1855       host_record->text[new_count * MESSAGE_ID_LENGTH] = 0;
1856       }
1857     }
1858
1859   /* Check for a continuation record. */
1860
1861   while (host_length <= 0)
1862     {
1863     dbdata_wait * newr = NULL;
1864     uschar buffer[256];
1865
1866     /* Search for a continuation */
1867
1868     for (int i = host_record->sequence - 1; i >= 0 && !newr; i--)
1869       {
1870       sprintf(CS buffer, "%.200s:%d", hostname, i);
1871       newr = dbfn_read(dbp, buffer);
1872       }
1873
1874     /* If no continuation, delete the current and break the loop */
1875
1876     if (!newr)
1877       {
1878       dbfn_delete(dbp, hostname);
1879       break;
1880       }
1881
1882     /* Else replace the current with the continuation */
1883
1884     dbfn_delete(dbp, buffer);
1885     host_record = newr;
1886     host_length = host_record->count * MESSAGE_ID_LENGTH;
1887
1888     bContinuation = TRUE;
1889     }
1890
1891   if (bFound)           /* Usual exit from main loop */
1892     break;
1893
1894   /* If host_length <= 0 we have emptied a record and not found a good message,
1895   and there are no continuation records. Otherwise there is a continuation
1896   record to process. */
1897
1898   if (host_length <= 0)
1899     {
1900     DEBUG(D_transport) debug_printf_indent("waiting messages already delivered\n");
1901     goto dbclose_false;
1902     }
1903
1904   /* we were not able to find an acceptable message, nor was there a
1905   continuation record.  So bug out, outer logic will clean this up.
1906   */
1907
1908   if (!bContinuation)
1909     {
1910     Ustrcpy(new_message_id, message_id);
1911     goto dbclose_false;
1912     }
1913   }             /* we need to process a continuation record */
1914
1915 /* Control gets here when an existing message has been encountered; its
1916 id is in new_message_id, and host_length is the revised length of the
1917 host record. If it is zero, the record has been removed. Update the
1918 record if required, close the database, and return TRUE. */
1919
1920 if (host_length > 0)
1921   {
1922   host_record->count = host_length/MESSAGE_ID_LENGTH;
1923   dbfn_write(dbp, hostname, host_record, (int)sizeof(dbdata_wait) + host_length);
1924   }
1925
1926 if (continue_wait_db)
1927   dbfn_transaction_commit(dbp);
1928 else
1929   dbfn_close(dbp);
1930
1931 DEBUG(D_transport)
1932   {
1933   acl_level--;
1934   debug_printf("transport_check_waiting: TRUE (found %s)\n", new_message_id);
1935   }
1936 return TRUE;
1937
1938 dbclose_false:
1939   if (continue_wait_db)
1940     dbfn_transaction_commit(dbp);
1941   else
1942     dbfn_close(dbp);
1943
1944 retfalse:
1945   DEBUG(D_transport)
1946     {acl_level--; debug_printf("transport_check_waiting: FALSE\n"); }
1947   return FALSE;
1948 }
1949
1950 /*************************************************
1951 *    Deliver waiting message down same socket    *
1952 *************************************************/
1953
1954 /* Just the regain-root-privilege exec portion */
1955 void
1956 transport_do_pass_socket(const uschar * transport_name, const uschar * hostname,
1957   const uschar * hostaddress, uschar * id, int socket_fd)
1958 {
1959 int i = 13;
1960 const uschar **argv;
1961
1962 #ifndef DISABLE_TLS
1963 if (smtp_peer_options & OPTION_TLS) i += 6;
1964 #endif
1965 #ifndef DISABLE_ESMTP_LIMITS
1966 if (continue_limit_mail || continue_limit_rcpt || continue_limit_rcptdom)
1967                                     i += 4;
1968 #endif
1969 if (queue_run_pid != (pid_t)0)      i += 3;
1970 #ifdef SUPPORT_SOCKS
1971 if (proxy_session)                  i += 5;
1972 #endif
1973
1974 /* Set up the calling arguments; use the standard function for the basics,
1975 but we have a number of extras that may be added. */
1976
1977 argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, &i, FALSE, 0);
1978
1979 if (f.smtp_authenticated)                       argv[i++] = US"-MCA";
1980 if (smtp_peer_options & OPTION_CHUNKING)        argv[i++] = US"-MCK";
1981 if (smtp_peer_options & OPTION_DSN)             argv[i++] = US"-MCD";
1982 if (smtp_peer_options & OPTION_PIPE)            argv[i++] = US"-MCP";
1983 if (smtp_peer_options & OPTION_SIZE)            argv[i++] = US"-MCS";
1984 #ifndef DISABLE_TLS
1985 if (smtp_peer_options & OPTION_TLS)
1986   if (tls_out.active.sock >= 0 || continue_proxy_cipher)
1987     {
1988     argv[i++] = US"-MCt";
1989     argv[i++] = sending_ip_address;
1990     argv[i++] = string_sprintf("%d", sending_port);
1991     argv[i++] = tls_out.active.sock >= 0 ? tls_out.cipher : continue_proxy_cipher;
1992
1993     if (tls_out.sni)
1994       {
1995       argv[i++] =
1996 #ifdef SUPPORT_DANE
1997         tls_out.dane_verified ? US"-MCr" :
1998 #endif
1999         US"-MCs";
2000       argv[i++] = tls_out.sni;
2001       }
2002     }
2003   else
2004     argv[i++] = US"-MCT";
2005 #endif
2006
2007 #ifndef DISABLE_ESMTP_LIMITS
2008 if (continue_limit_mail || continue_limit_rcpt || continue_limit_rcptdom)
2009   {
2010   argv[i++] = US"-MCL";
2011   argv[i++] = string_sprintf("%u", continue_limit_mail);
2012   argv[i++] = string_sprintf("%u", continue_limit_rcpt);
2013   argv[i++] = string_sprintf("%u", continue_limit_rcptdom);
2014   }
2015 #endif
2016
2017 if (queue_run_pid != (pid_t)0)
2018   {
2019   argv[i++] = US"-MCQ";
2020   argv[i++] = string_sprintf("%d", queue_run_pid);
2021   argv[i++] = string_sprintf("%d", queue_run_pipe);
2022   }
2023
2024 #ifdef SUPPORT_SOCKS
2025 if (proxy_session)
2026   {
2027   argv[i++] = US"-MCp";
2028   argv[i++] = proxy_local_address;
2029   argv[i++] = string_sprintf("%d", proxy_local_port);
2030   argv[i++] = proxy_external_address;
2031   argv[i++] = string_sprintf("%d", proxy_external_port);
2032   }
2033 #endif
2034
2035 argv[i++] = US"-MC";
2036 argv[i++] = US transport_name;
2037 argv[i++] = US hostname;
2038 argv[i++] = US hostaddress;
2039 argv[i++] = string_sprintf("%d", continue_sequence + 1);
2040 argv[i++] = id;
2041 argv[i++] = NULL;
2042
2043 /* Arrange for the channel to be on stdin. */
2044
2045 if (socket_fd != 0)
2046   {
2047   (void)dup2(socket_fd, 0);
2048   (void)close(socket_fd);
2049   }
2050
2051 DEBUG(D_exec) debug_print_argv(argv);
2052 exim_nullstd();                          /* Ensure std{out,err} exist */
2053 /* argv[0] should be untainted, from child_exec_exim() */
2054 execv(CS argv[0], (char *const *)argv);
2055
2056 DEBUG(D_any) debug_printf("execv failed: %s\n", strerror(errno));
2057 _exit(errno);         /* Note: must be _exit(), NOT exit() */
2058 }
2059
2060
2061
2062
2063 /* Enforce all args untainted, for consistency with a router-sourced pipe
2064 command, where (because the whole line is passed as one to the tpt) a
2065 tainted arg taints the executable name.  It's unclear also that letting an
2066 attacker supply command arguments is wise. */
2067
2068 static BOOL
2069 arg_is_tainted(const uschar * s, int argn, address_item * addr,
2070   const uschar * etext, uschar ** errptr)
2071 {
2072 if (is_tainted(s))
2073   {
2074   uschar * msg = string_sprintf("Tainted arg %d for %s command: '%s'",
2075                                 argn, etext, s);
2076   if (addr)
2077     {
2078     addr->transport_return = FAIL;
2079     addr->message = msg;
2080     }
2081   else *errptr = msg;
2082   return TRUE;
2083   }
2084 return FALSE;
2085 }
2086
2087
2088 /*************************************************
2089 *          Set up direct (non-shell) command     *
2090 *************************************************/
2091
2092 /* This function is called when a command line is to be parsed and executed
2093 directly, without the use of /bin/sh. It is called by the pipe transport,
2094 the queryprogram router, for any ${run } expansion,
2095 and also from the main delivery code when setting up a
2096 transport filter process. The code for ETRN also makes use of this; in that
2097 case, no addresses are passed.
2098
2099 Arguments:
2100   argvptr            pointer to anchor for argv vector
2101   cmd                points to the command string (modified IN PLACE)
2102   flags              bits for expand-args, allow taint, allow $recipients
2103   expand_failed      error value to set if expansion fails; not relevant if
2104                      addr == NULL
2105   addr               chain of addresses, or NULL
2106   etext              text for use in error messages
2107   errptr             where to put error message if addr is NULL;
2108                      otherwise it is put in the first address
2109
2110 Returns:             TRUE if all went well; otherwise an error will be
2111                      set in the first address and FALSE returned
2112 */
2113
2114 BOOL
2115 transport_set_up_command(const uschar *** argvptr, const uschar * cmd,
2116   unsigned flags, int expand_failed, address_item * addr,
2117   const uschar * etext, uschar ** errptr)
2118 {
2119 const uschar ** argv, * s;
2120 int address_count = 0, argcount = 0, max_args;
2121
2122 /* Get store in which to build an argument list. Count the number of addresses
2123 supplied, and allow for that many arguments, plus an additional 60, which
2124 should be enough for anybody. Multiple addresses happen only when the local
2125 delivery batch option is set. */
2126
2127 for (address_item * ad = addr; ad; ad = ad->next) address_count++;
2128 max_args = address_count + 60;
2129 *argvptr = argv = store_get((max_args+1)*sizeof(uschar *), GET_UNTAINTED);
2130
2131 /* Split the command up into arguments terminated by white space. Lose
2132 trailing space at the start and end. Double-quoted arguments can contain \\ and
2133 \" escapes and so can be handled by the standard function; single-quoted
2134 arguments are verbatim. Copy each argument into a new string. */
2135
2136 s = cmd;
2137 Uskip_whitespace(&s);
2138
2139 for (; *s && argcount < max_args; argcount++)
2140   {
2141   if (*s == '\'')
2142     {
2143     int n = Ustrcspn(++s, "'");
2144     argv[argcount] = string_copyn(s, n);
2145     if (*(s += n) == '\'') s++;
2146     }
2147   else
2148     argv[argcount] = string_dequote(CUSS &s);
2149   Uskip_whitespace(&s);
2150   }
2151
2152 argv[argcount] = NULL;
2153
2154 /* If *s != 0 we have run out of argument slots. */
2155
2156 if (*s)
2157   {
2158   uschar *msg = string_sprintf("Too many arguments in command \"%s\" in "
2159     "%s", cmd, etext);
2160   if (addr)
2161     {
2162     addr->transport_return = FAIL;
2163     addr->message = msg;
2164     }
2165   else *errptr = msg;
2166   return FALSE;
2167   }
2168
2169 /* Expand each individual argument if required. Expansion happens for pipes set
2170 up in filter files and with directly-supplied commands. It does not happen if
2171 the pipe comes from a traditional .forward file. A failing expansion is a big
2172 disaster if the command came from Exim's configuration; if it came from a user
2173 it is just a normal failure. The expand_failed value is used as the error value
2174 to cater for these two cases.
2175
2176 An argument consisting just of the text "$pipe_addresses" is treated specially.
2177 It is not passed to the general expansion function. Instead, it is replaced by
2178 a number of arguments, one for each address. This avoids problems with shell
2179 metacharacters and spaces in addresses.
2180
2181 If the parent of the top address has an original part of "system-filter", this
2182 pipe was set up by the system filter, and we can permit the expansion of
2183 $recipients. */
2184
2185 DEBUG(D_transport)
2186   {
2187   debug_printf("direct command:\n");
2188   for (int i = 0; argv[i]; i++)
2189     debug_printf("  argv[%d] = '%s'\n", i, string_printing(argv[i]));
2190   }
2191
2192 if (flags & TSUC_EXPAND_ARGS)
2193   {
2194   BOOL allow_dollar_recipients = (flags & TSUC_ALLOW_RECIPIENTS)
2195     || (addr && addr->parent && Ustrcmp(addr->parent->address, "system-filter") == 0);  /*XXX could we check this at caller? */
2196
2197   for (int i = 0; argv[i]; i++)
2198     {
2199     DEBUG(D_expand) debug_printf_indent("arg %d\n", i);
2200
2201     /* Handle special fudge for passing an address list */
2202
2203     if (addr &&
2204         (Ustrcmp(argv[i], "$pipe_addresses") == 0 ||
2205          Ustrcmp(argv[i], "${pipe_addresses}") == 0))
2206       {
2207       int additional;
2208
2209       if (argcount + address_count - 1 > max_args)
2210         {
2211         addr->transport_return = FAIL;
2212         addr->message = string_sprintf("Too many arguments to command \"%s\" "
2213           "in %s", cmd, etext);
2214         return FALSE;
2215         }
2216
2217       additional = address_count - 1;
2218       if (additional > 0)
2219         memmove(argv + i + 1 + additional, argv + i + 1,
2220           (argcount - i)*sizeof(uschar *));
2221
2222       for (address_item * ad = addr; ad; ad = ad->next)
2223         {
2224         /* $pipe_addresses is spefically not checked for taint, because there is
2225         a testcase (321) depending on it.  It's unclear if the exact thing being
2226         done really needs to be legitimate, though I suspect it reflects an
2227         actual use-case that showed up a bug.
2228         This is a hole in the taint-pretection, mitigated only in that
2229         shell-syntax metachars cannot be injected via this route. */
2230
2231         DEBUG(D_transport) if (is_tainted(ad->address))
2232           debug_printf("tainted element '%s' from $pipe_addresses\n", ad->address);
2233
2234         argv[i++] = ad->address;
2235         argcount++;
2236         }
2237
2238       /* Subtract one since we replace $pipe_addresses */
2239       argcount--;
2240       i--;
2241       }
2242
2243       /* Handle special case of $address_pipe when af_force_command is set */
2244
2245     else if (addr && testflag(addr,af_force_command) &&
2246         (Ustrcmp(argv[i], "$address_pipe") == 0 ||
2247          Ustrcmp(argv[i], "${address_pipe}") == 0))
2248       {
2249       int address_pipe_argcount = 0;
2250       int address_pipe_max_args;
2251       uschar **address_pipe_argv;
2252
2253       /* We can never have more then the argv we will be loading into */
2254       address_pipe_max_args = max_args - argcount + 1;
2255
2256       DEBUG(D_transport)
2257         debug_printf("address_pipe_max_args=%d\n", address_pipe_max_args);
2258
2259       /* We allocate an additional for (uschar *)0 */
2260       address_pipe_argv = store_get((address_pipe_max_args+1)*sizeof(uschar *), GET_UNTAINTED);
2261
2262       /* +1 because addr->local_part[0] == '|' since af_force_command is set */
2263       s = expand_cstring(addr->local_part + 1);
2264
2265       if (!s || !*s)
2266         {
2267         addr->transport_return = FAIL;
2268         addr->message = string_sprintf("Expansion of \"%s\" "
2269            "from command \"%s\" in %s failed: %s",
2270            (addr->local_part + 1), cmd, etext, expand_string_message);
2271         return FALSE;
2272         }
2273
2274       Uskip_whitespace(&s);                     /* strip leading space */
2275
2276       while (*s && address_pipe_argcount < address_pipe_max_args)
2277         {
2278         if (*s == '\'')
2279           {
2280           int n = Ustrcspn(++s, "'");
2281           argv[argcount] = string_copyn(s, n);
2282           if (*(s += n) == '\'') s++;
2283           }
2284         else
2285           address_pipe_argv[address_pipe_argcount++] = string_dequote(CUSS &s);
2286         Uskip_whitespace(&s);                   /* strip space after arg */
2287         }
2288
2289       address_pipe_argv[address_pipe_argcount] = NULL;
2290
2291       /* If *s != 0 we have run out of argument slots. */
2292       if (*s)
2293         {
2294         uschar *msg = string_sprintf("Too many arguments in $address_pipe "
2295           "\"%s\" in %s", addr->local_part + 1, etext);
2296         if (addr)
2297           {
2298           addr->transport_return = FAIL;
2299           addr->message = msg;
2300           }
2301         else *errptr = msg;
2302         return FALSE;
2303         }
2304
2305       /* address_pipe_argcount - 1
2306       because we are replacing $address_pipe in the argument list
2307       with the first thing it expands to */
2308
2309       if (argcount + address_pipe_argcount - 1 > max_args)
2310         {
2311         addr->transport_return = FAIL;
2312         addr->message = string_sprintf("Too many arguments to command "
2313           "\"%s\" after expanding $address_pipe in %s", cmd, etext);
2314         return FALSE;
2315         }
2316
2317       /* If we are not just able to replace the slot that contained
2318       $address_pipe (address_pipe_argcount == 1)
2319       We have to move the existing argv by address_pipe_argcount - 1
2320       Visually if address_pipe_argcount == 2:
2321       [argv 0][argv 1][argv 2($address_pipe)][argv 3][0]
2322       [argv 0][argv 1][ap_arg0][ap_arg1][old argv 3][0] */
2323
2324       if (address_pipe_argcount > 1)
2325         memmove(
2326           /* current position + additional args */
2327           argv + i + address_pipe_argcount,
2328           /* current position + 1 (for the (uschar *)0 at the end) */
2329           argv + i + 1,
2330           /* -1 for the (uschar *)0 at the end)*/
2331           (argcount - i)*sizeof(uschar *)
2332         );
2333
2334       /* Now we fill in the slots we just moved argv out of
2335       [argv 0][argv 1][argv 2=pipeargv[0]][argv 3=pipeargv[1]][old argv 3][0] */
2336
2337       for (int address_pipe_i = 0;
2338            address_pipe_argv[address_pipe_i];
2339            address_pipe_i++, argcount++)
2340         {
2341         uschar * s = address_pipe_argv[address_pipe_i];
2342         if (arg_is_tainted(s, i, addr, etext, errptr)) return FALSE;
2343         argv[i++] = s;
2344         }
2345
2346       /* Subtract one since we replace $address_pipe */
2347       argcount--;
2348       i--;
2349       }
2350
2351     /* Handle normal expansion string */
2352
2353     else
2354       {
2355       const uschar *expanded_arg;
2356       BOOL enable_dollar_recipients_g = f.enable_dollar_recipients;
2357       f.enable_dollar_recipients = allow_dollar_recipients;
2358       expanded_arg = expand_cstring(argv[i]);
2359       f.enable_dollar_recipients = enable_dollar_recipients_g;
2360
2361       if (!expanded_arg)
2362         {
2363         uschar *msg = string_sprintf("Expansion of \"%s\" "
2364           "from command \"%s\" in %s failed: %s",
2365           argv[i], cmd, etext, expand_string_message);
2366         if (addr)
2367           {
2368           addr->transport_return = expand_failed;
2369           addr->message = msg;
2370           }
2371         else *errptr = msg;
2372         return FALSE;
2373         }
2374
2375       if (  f.running_in_test_harness && is_tainted(expanded_arg)
2376          && Ustrcmp(etext, "queryprogram router") == 0)
2377         {                       /* hack, would be good to not need it */
2378         DEBUG(D_transport)
2379           debug_printf("SPECIFIC TESTSUITE EXEMPTION: tainted arg '%s'\n",
2380                       expanded_arg);
2381         }
2382       else if (  !(flags & TSUC_ALLOW_TAINTED_ARGS)
2383               && arg_is_tainted(expanded_arg, i, addr, etext, errptr))
2384         return FALSE;
2385       argv[i] = expanded_arg;
2386       }
2387     }
2388
2389   DEBUG(D_transport)
2390     {
2391     debug_printf("direct command after expansion:\n");
2392     for (int i = 0; argv[i]; i++)
2393       {
2394       debug_printf("  argv[%d] = '%s'\n", i, string_printing(argv[i]));
2395       debug_print_taint(argv[i]);
2396       }
2397     }
2398   }
2399
2400 return TRUE;
2401 }
2402
2403
2404
2405 /* For error messages, a string describing the config location associated
2406 with current processing.  NULL if we are not in a transport. */
2407 /* Name only, for now */
2408
2409 uschar *
2410 transport_current_name(void)
2411 {
2412 if (!transport_name) return NULL;
2413 return string_sprintf(" (transport %s, %s %d)", transport_name, driver_srcfile, driver_srcline);
2414 }
2415
2416 #endif  /*!MACRO_PREDEF*/
2417 /* vi: aw ai sw=2
2418 */
2419 /* End of transport.c */