Debug: option access for expansion
[exim.git] / src / src / transports / pipe.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim maintainers 2020 - 2023 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* See the file NOTICE for conditions of use and distribution. */
8 /* SPDX-License-Identifier: GPL-2.0-or-later */
9
10
11 #include "../exim.h"
12 #include "pipe.h"
13
14 #ifdef HAVE_SETCLASSRESOURCES
15 #include <login_cap.h>
16 #endif
17
18
19
20 /* Options specific to the pipe transport. They must be in alphabetic
21 order (note that "_" comes before the lower case letters). Those starting
22 with "*" are not settable by the user but are used by the option-reading
23 software for alternative value types. Some options are stored in the transport
24 instance block so as to be publicly visible; these are flagged with opt_public.
25 */
26 #define LOFF(field) OPT_OFF(pipe_transport_options_block, field)
27
28 optionlist pipe_transport_options[] = {
29   { "allow_commands",    opt_stringptr, LOFF(allow_commands) },
30   { "batch_id",          opt_stringptr | opt_public,
31       OPT_OFF(transport_instance, batch_id) },
32   { "batch_max",         opt_int | opt_public,
33       OPT_OFF(transport_instance, batch_max) },
34   { "check_string",      opt_stringptr, LOFF(check_string) },
35   { "command",           opt_stringptr, LOFF(cmd) },
36   { "environment",       opt_stringptr, LOFF(environment) },
37   { "escape_string",     opt_stringptr, LOFF(escape_string) },
38   { "force_command",         opt_bool,  LOFF(force_command) },
39   { "freeze_exec_fail",  opt_bool,      LOFF(freeze_exec_fail) },
40   { "freeze_signal",     opt_bool,      LOFF(freeze_signal) },
41   { "ignore_status",     opt_bool,      LOFF(ignore_status) },
42   { "log_defer_output",  opt_bool | opt_public,
43       OPT_OFF(transport_instance, log_defer_output) },
44   { "log_fail_output",   opt_bool | opt_public,
45       OPT_OFF(transport_instance, log_fail_output) },
46   { "log_output",        opt_bool | opt_public,
47       OPT_OFF(transport_instance, log_output) },
48   { "max_output",        opt_mkint,     LOFF(max_output) },
49   { "message_prefix",    opt_stringptr, LOFF(message_prefix) },
50   { "message_suffix",    opt_stringptr, LOFF(message_suffix) },
51   { "path",              opt_stringptr, LOFF(path) },
52   { "permit_coredump",   opt_bool,      LOFF(permit_coredump) },
53   { "pipe_as_creator",   opt_bool | opt_public,
54       OPT_OFF(transport_instance, deliver_as_creator) },
55   { "restrict_to_path",  opt_bool,      LOFF(restrict_to_path) },
56   { "return_fail_output",opt_bool | opt_public,
57       OPT_OFF(transport_instance, return_fail_output) },
58   { "return_output",     opt_bool | opt_public,
59       OPT_OFF(transport_instance, return_output) },
60   { "temp_errors",       opt_stringptr, LOFF(temp_errors) },
61   { "timeout",           opt_time,      LOFF(timeout) },
62   { "timeout_defer",     opt_bool,      LOFF(timeout_defer) },
63   { "umask",             opt_octint,    LOFF(umask) },
64   { "use_bsmtp",         opt_bool,      LOFF(use_bsmtp) },
65   #ifdef HAVE_SETCLASSRESOURCES
66   { "use_classresources", opt_bool,     LOFF(use_classresources) },
67   #endif
68   { "use_crlf",          opt_bool,      LOFF(use_crlf) },
69   { "use_shell",         opt_bool,      LOFF(use_shell) },
70 };
71
72 /* Size of the options list. An extern variable has to be used so that its
73 address can appear in the tables drtables.c. */
74
75 int pipe_transport_options_count =
76   sizeof(pipe_transport_options)/sizeof(optionlist);
77
78
79 #ifdef MACRO_PREDEF
80
81 /* Dummy values */
82 pipe_transport_options_block pipe_transport_option_defaults = {0};
83 void pipe_transport_init(transport_instance *tblock) {}
84 BOOL pipe_transport_entry(transport_instance *tblock, address_item *addr) {return FALSE;}
85
86 #else   /*!MACRO_PREDEF*/
87
88
89 /* Default private options block for the pipe transport. */
90
91 pipe_transport_options_block pipe_transport_option_defaults = {
92   .path =       US"/bin:/usr/bin",
93   .temp_errors = US mac_expanded_string(EX_TEMPFAIL) ":"
94                    mac_expanded_string(EX_CANTCREAT),
95   .umask =      022,
96   .max_output = 20480,
97   .timeout =    60*60,
98   /* all others null/zero/false */
99 };
100
101
102
103 /*************************************************
104 *              Setup entry point                 *
105 *************************************************/
106
107 /* Called for each delivery in the privileged state, just before the uid/gid
108 are changed and the main entry point is called. In a system that supports the
109 login_cap facilities, this function is used to set the class resource limits
110 for the user.  It may also re-enable coredumps.
111
112 Arguments:
113   tblock     points to the transport instance
114   addrlist   addresses about to be delivered (not used)
115   dummy      not used (doesn't pass back data)
116   uid        the uid that will be set (not used)
117   gid        the gid that will be set (not used)
118   errmsg     where to put an error message
119
120 Returns:     OK, FAIL, or DEFER
121 */
122
123 static int
124 pipe_transport_setup(transport_instance *tblock, address_item *addrlist,
125   transport_feedback *dummy, uid_t uid, gid_t gid, uschar **errmsg)
126 {
127 pipe_transport_options_block *ob =
128   (pipe_transport_options_block *)(tblock->options_block);
129
130 #ifdef HAVE_SETCLASSRESOURCES
131 if (ob->use_classresources)
132   {
133   struct passwd *pw = getpwuid(uid);
134   if (pw != NULL)
135     {
136     login_cap_t *lc = login_getpwclass(pw);
137     if (lc != NULL)
138       {
139       setclassresources(lc);
140       login_close(lc);
141       }
142     }
143   }
144 #endif
145
146 #ifdef RLIMIT_CORE
147 if (ob->permit_coredump)
148   {
149   struct rlimit rl;
150   rl.rlim_cur = RLIM_INFINITY;
151   rl.rlim_max = RLIM_INFINITY;
152   if (setrlimit(RLIMIT_CORE, &rl) < 0)
153     {
154 #ifdef SETRLIMIT_NOT_SUPPORTED
155     if (errno != ENOSYS && errno != ENOTSUP)
156 #endif
157       log_write(0, LOG_MAIN,
158           "delivery setrlimit(RLIMIT_CORE, RLIM_INFINITY) failed: %s",
159           strerror(errno));
160     }
161   }
162 #endif
163
164 return OK;
165 }
166
167
168
169 /*************************************************
170 *          Initialization entry point            *
171 *************************************************/
172
173 /* Called for each instance, after its options have been read, to
174 enable consistency checks to be done, or anything else that needs
175 to be set up. */
176
177 void
178 pipe_transport_init(transport_instance *tblock)
179 {
180 pipe_transport_options_block *ob =
181   (pipe_transport_options_block *)(tblock->options_block);
182
183 /* Set up the setup entry point, to be called in the privileged state */
184
185 tblock->setup = pipe_transport_setup;
186
187 /* If pipe_as_creator is set, then uid/gid should not be set. */
188
189 if (tblock->deliver_as_creator && (tblock->uid_set || tblock->gid_set ||
190   tblock->expand_uid != NULL || tblock->expand_gid != NULL))
191     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
192       "both pipe_as_creator and an explicit uid/gid are set for the %s "
193         "transport", tblock->name);
194
195 /* If a fixed uid field is set, then a gid field must also be set. */
196
197 if (tblock->uid_set && !tblock->gid_set && tblock->expand_gid == NULL)
198   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
199     "user set without group for the %s transport", tblock->name);
200
201 /* Temp_errors must consist only of digits and colons, but there can be
202 spaces round the colons, so allow them too. */
203
204 if (ob->temp_errors != NULL && Ustrcmp(ob->temp_errors, "*") != 0)
205   {
206   size_t p = Ustrspn(ob->temp_errors, "0123456789: ");
207   if (ob->temp_errors[p] != 0)
208     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
209       "temp_errors must be a list of numbers or an asterisk for the %s "
210       "transport", tblock->name);
211   }
212
213 /* Only one of return_output/return_fail_output or log_output/log_fail_output
214 should be set. */
215
216 if (tblock->return_output && tblock->return_fail_output)
217   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
218     "both return_output and return_fail_output set for %s transport",
219     tblock->name);
220
221 if (tblock->log_output && tblock->log_fail_output)
222   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
223     "both log_output and log_fail_output set for the %s transport",
224     tblock->name);
225
226 /* If batch SMTP is set, force the check and escape strings, and arrange that
227 headers are also escaped. */
228
229 if (ob->use_bsmtp)
230   {
231   ob->check_string = US".";
232   ob->escape_string = US"..";
233   ob->options |= topt_escape_headers;
234   }
235
236 /* If not batch SMTP, and message_prefix or message_suffix are unset, insert
237 default values for them. */
238
239 else
240   {
241   if (ob->message_prefix == NULL) ob->message_prefix =
242     US"From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox}\n";
243   if (ob->message_suffix == NULL) ob->message_suffix = US"\n";
244   }
245
246 /* The restrict_to_path  and use_shell options are incompatible */
247
248 if (ob->restrict_to_path && ob->use_shell)
249   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
250     "both restrict_to_path and use_shell set for %s transport",
251     tblock->name);
252
253 /* The allow_commands and use_shell options are incompatible */
254
255 if (ob->allow_commands && ob->use_shell)
256   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
257     "both allow_commands and use_shell set for %s transport",
258     tblock->name);
259
260 /* Set up the bitwise options for transport_write_message from the various
261 driver options. Only one of body_only and headers_only can be set. */
262
263 ob->options |=
264     (tblock->body_only ? topt_no_headers : 0)
265   | (tblock->headers_only ? topt_no_body : 0)
266   | (tblock->return_path_add ? topt_add_return_path : 0)
267   | (tblock->delivery_date_add ? topt_add_delivery_date : 0)
268   | (tblock->envelope_to_add ? topt_add_envelope_to : 0)
269   | (ob->use_crlf ? topt_use_crlf : 0);
270 }
271
272
273
274 /*************************************************
275 *          Set up direct (non-shell) command     *
276 *************************************************/
277
278 /* This function is called when a command line is to be parsed by the transport
279 and executed directly, without the use of /bin/sh.
280
281 Arguments:
282   argvptr            pointer to anchor for argv vector
283   cmd                points to the command string
284   expand_arguments   true if expansion is to occur
285   expand_fail        error if expansion fails
286   addr               chain of addresses
287   tname              the transport name
288   ob                 the transport options block
289
290 Returns:             TRUE if all went well; otherwise an error will be
291                      set in the first address and FALSE returned
292 */
293
294 static BOOL
295 set_up_direct_command(const uschar *** argvptr, const uschar * cmd,
296   BOOL expand_arguments, int expand_fail, address_item * addr, uschar * tname,
297   pipe_transport_options_block * ob)
298 {
299 BOOL permitted = FALSE;
300 const uschar **argv;
301
302 /* Set up "transport <name>" to be put in any error messages, and then
303 call the common function for creating an argument list and expanding
304 the items if necessary. If it fails, this function fails (error information
305 is in the addresses). */
306
307 if (!transport_set_up_command(argvptr, cmd,
308       expand_arguments ? TSUC_EXPAND_ARGS : 0,
309       expand_fail, addr, string_sprintf("%.50s transport", tname), NULL))
310   return FALSE;
311
312 /* Point to the set-up arguments. */
313
314 argv = *argvptr;
315
316 /* If allow_commands is set, see if the command is in the permitted list. */
317
318 GET_OPTION("allow_commands");
319 if (ob->allow_commands)
320   {
321   int sep = 0;
322   const uschar *s;
323   uschar *p;
324
325   if (!(s = expand_string(ob->allow_commands)))
326     {
327     addr->transport_return = DEFER;
328     addr->message = string_sprintf("failed to expand string \"%s\" "
329       "for %s transport: %s", ob->allow_commands, tname, expand_string_message);
330     return FALSE;
331     }
332
333   while ((p = string_nextinlist(&s, &sep, NULL, 0)))
334     if (Ustrcmp(p, argv[0]) == 0) { permitted = TRUE; break; }
335   }
336
337 /* If permitted is TRUE it means the command was found in the allowed list, and
338 no further checks are done. If permitted = FALSE, it either means
339 allow_commands wasn't set, or that the command didn't match anything in the
340 list. In both cases, if restrict_to_path is set, we fail if the command
341 contains any slashes, but if restrict_to_path is not set, we must fail the
342 command only if allow_commands is set. */
343
344 if (!permitted)
345   {
346   if (ob->restrict_to_path)
347     {
348     if (Ustrchr(argv[0], '/') != NULL)
349       {
350       addr->transport_return = FAIL;
351       addr->message = string_sprintf("\"/\" found in \"%s\" (command for %s "
352         "transport) - failed for security reasons", cmd, tname);
353       return FALSE;
354       }
355     }
356
357   else if (ob->allow_commands)
358     {
359     addr->transport_return = FAIL;
360     addr->message = string_sprintf("\"%s\" command not permitted by %s "
361       "transport", argv[0], tname);
362     return FALSE;
363     }
364   }
365
366 /* If the command is not an absolute path, search the PATH directories
367 for it. */
368
369 if (argv[0][0] != '/')
370   {
371   int sep = 0;
372   uschar * p;
373
374   GET_OPTION("path");
375   for (const uschar * listptr = expand_string(ob->path);
376       p = string_nextinlist(&listptr, &sep, NULL, 0); )
377     {
378     struct stat statbuf;
379     sprintf(CS big_buffer, "%.256s/%.256s", p, argv[0]);
380     if (Ustat(big_buffer, &statbuf) == 0)
381       {
382       argv[0] = string_copy(big_buffer);
383       break;
384       }
385     }
386   if (!p)
387     {
388     addr->transport_return = FAIL;
389     addr->message = string_sprintf("\"%s\" command not found for %s transport",
390       argv[0], tname);
391     return FALSE;
392     }
393   }
394
395 return TRUE;
396 }
397
398
399 /*************************************************
400 *               Set up shell command             *
401 *************************************************/
402
403 /* This function is called when a command line is to be passed to /bin/sh
404 without parsing inside the transport.
405
406 Arguments:
407   argvptr            pointer to anchor for argv vector
408   cmd                points to the command string
409   expand_arguments   true if expansion is to occur
410   expand_fail        error if expansion fails
411   addr               chain of addresses
412   tname              the transport name
413
414 Returns:             TRUE if all went well; otherwise an error will be
415                      set in the first address and FALSE returned
416 */
417
418 static BOOL
419 set_up_shell_command(const uschar *** argvptr, const uschar * cmd,
420   BOOL expand_arguments, int expand_fail, address_item * addr, uschar * tname)
421 {
422 const uschar **argv;
423
424 *argvptr = argv = store_get((4)*sizeof(uschar *), GET_UNTAINTED);
425
426 argv[0] = US"/bin/sh";
427 argv[1] = US"-c";
428
429 /* We have to take special action to handle the special "variable" called
430 $pipe_addresses, which is not recognized by the normal expansion function. */
431
432 if (expand_arguments)
433   {
434   uschar * p = Ustrstr(cmd, "pipe_addresses");
435   gstring * g = NULL;
436
437   DEBUG(D_transport)
438     debug_printf("shell pipe command before expansion:\n  %s\n", cmd);
439
440   /* Allow $recipients in the expansion iff it comes from a system filter */
441
442   f.enable_dollar_recipients = addr && addr->parent &&
443     Ustrcmp(addr->parent->address, "system-filter") == 0;
444
445   if (p != NULL && (
446          (p > cmd && p[-1] == '$') ||
447          (p > cmd + 1 && p[-2] == '$' && p[-1] == '{' && p[14] == '}')))
448     {
449     uschar *q = p + 14;
450
451     if (p[-1] == '{') { q++; p--; }
452
453     g = string_get(Ustrlen(cmd) + 64);
454     g = string_catn(g, cmd, p - cmd - 1);
455
456     for (address_item * ad = addr; ad; ad = ad->next)
457       {
458       DEBUG(D_transport) if (is_tainted(ad->address))
459         debug_printf("tainted element '%s' from $pipe_addresses\n", ad->address);
460
461       /*XXX string_append_listele() ? */
462       if (ad != addr) g = string_catn(g, US" ", 1);
463       g = string_cat(g, ad->address);
464       }
465
466     g = string_cat(g, q);
467     argv[2] = (cmd = string_from_gstring(g)) ? expand_cstring(cmd) : NULL;
468     }
469   else
470     argv[2] = expand_cstring(cmd);
471
472   f.enable_dollar_recipients = FALSE;
473
474   if (!argv[2])
475     {
476     addr->transport_return = f.search_find_defer ? DEFER : expand_fail;
477     addr->message = string_sprintf("Expansion of command \"%s\" "
478       "in %s transport failed: %s",
479       cmd, tname, expand_string_message);
480     return FALSE;
481     }
482
483   DEBUG(D_transport)
484     debug_printf("shell pipe command after expansion:\n  %s\n", argv[2]);
485   }
486 else
487   {
488   DEBUG(D_transport)
489     debug_printf("shell pipe command (no expansion):\n  %s\n", cmd);
490   argv[2] = cmd;
491   }
492
493 argv[3] = US 0;
494 return TRUE;
495 }
496
497
498
499
500 /*************************************************
501 *              Main entry point                  *
502 *************************************************/
503
504 /* See local README for interface details. This transport always returns FALSE,
505 indicating that the status in the first address is the status for all addresses
506 in a batch. */
507
508 BOOL
509 pipe_transport_entry(
510   transport_instance *tblock,      /* data for this instantiation */
511   address_item *addr)              /* address(es) we are working on */
512 {
513 pid_t pid, outpid;
514 int fd_in, fd_out, rc;
515 int envcount = 0;
516 int envsep = 0;
517 int expand_fail;
518 pipe_transport_options_block *ob =
519   (pipe_transport_options_block *)(tblock->options_block);
520 int timeout = ob->timeout;
521 BOOL written_ok = FALSE;
522 BOOL expand_arguments;
523 const uschar ** argv;
524 uschar * envp[50];
525 const uschar * envlist = ob->environment;
526 const uschar * cmd;
527 uschar * ss;
528 uschar * eol = ob->use_crlf ? US"\r\n" : US"\n";
529 transport_ctx tctx = {
530   .tblock = tblock,
531   .addr = addr,
532   .check_string = ob->check_string,
533   .escape_string = ob->escape_string,
534   ob->options | topt_not_socket /* set at initialization time */
535 };
536
537 DEBUG(D_transport) debug_printf("%s transport entered\n", tblock->name);
538
539 /* Set up for the good case */
540
541 addr->transport_return = OK;
542 addr->basic_errno = 0;
543
544 /* Pipes are not accepted as general addresses, but they can be generated from
545 .forward files or alias files. In those cases, the pfr flag is set, and the
546 command to be obeyed is pointed to by addr->local_part; it starts with the pipe
547 symbol. In other cases, the command is supplied as one of the pipe transport's
548 options. */
549
550 if (testflag(addr, af_pfr) && addr->local_part[0] == '|')
551   if (ob->force_command)
552     {
553     /* Enables expansion of $address_pipe into separate arguments */
554     setflag(addr, af_force_command);
555     GET_OPTION("commsnd");
556     cmd = ob->cmd;
557     expand_arguments = TRUE;
558     expand_fail = PANIC;
559     }
560   else
561     {
562     cmd = addr->local_part + 1;
563     while (isspace(*cmd)) cmd++;
564     expand_arguments = testflag(addr, af_expand_pipe);
565     expand_fail = FAIL;
566     }
567 else
568   {
569   GET_OPTION("commsnd");
570   cmd = ob->cmd;
571   expand_arguments = TRUE;
572   expand_fail = PANIC;
573   }
574
575 /* If no command has been supplied, we are in trouble.
576 We also check for an empty string since it may be
577 coming from addr->local_part[0] == '|' */
578
579 if (!cmd || !*cmd)
580   {
581   addr->transport_return = DEFER;
582   addr->message = string_sprintf("no command specified for %s transport",
583     tblock->name);
584   return FALSE;
585   }
586 if (is_tainted(cmd))
587   {
588   DEBUG(D_transport) debug_printf("cmd '%s' is tainted\n", cmd);
589   addr->message = string_sprintf("Tainted '%s' (command "
590     "for %s transport) not permitted", cmd, tblock->name);
591   addr->transport_return = PANIC;
592   return FALSE;
593   }
594
595 /* When a pipe is set up by a filter file, there may be values for $thisaddress
596 and numerical the variables in existence. These are passed in
597 addr->pipe_expandn for use here. */
598
599 if (expand_arguments && addr->pipe_expandn)
600   {
601   uschar **ss = addr->pipe_expandn;
602   expand_nmax = -1;
603   if (*ss) filter_thisaddress = *ss++;
604   while (*ss)
605     {
606     expand_nstring[++expand_nmax] = *ss;
607     expand_nlength[expand_nmax] = Ustrlen(*ss++);
608     }
609   }
610
611 /* The default way of processing the command is to split it up into arguments
612 here, and run it directly. This offers some security advantages. However, there
613 are installations that want by default to run commands under /bin/sh always, so
614 there is an option to do that. */
615
616 if (ob->use_shell)
617   {
618   if (!set_up_shell_command(&argv, cmd, expand_arguments, expand_fail, addr,
619     tblock->name)) return FALSE;
620   }
621 else if (!set_up_direct_command(&argv, cmd, expand_arguments, expand_fail, addr,
622   tblock->name, ob)) return FALSE;
623
624 expand_nmax = -1;           /* Reset */
625 filter_thisaddress = NULL;
626
627 /* Set up the environment for the command. */
628
629 envp[envcount++] = string_sprintf("LOCAL_PART=%s", deliver_localpart);
630 envp[envcount++] = string_sprintf("LOGNAME=%s", deliver_localpart);
631 envp[envcount++] = string_sprintf("USER=%s", deliver_localpart);
632 envp[envcount++] = string_sprintf("LOCAL_PART_PREFIX=%#s",
633   deliver_localpart_prefix);
634 envp[envcount++] = string_sprintf("LOCAL_PART_SUFFIX=%#s",
635   deliver_localpart_suffix);
636 envp[envcount++] = string_sprintf("DOMAIN=%s", deliver_domain);
637 envp[envcount++] = string_sprintf("HOME=%#s", deliver_home);
638 envp[envcount++] = string_sprintf("MESSAGE_ID=%s", message_id);
639 envp[envcount++] = string_sprintf("PATH=%s", expand_string(ob->path));
640 envp[envcount++] = string_sprintf("RECIPIENT=%#s%#s%#s@%#s",
641   deliver_localpart_prefix, deliver_localpart, deliver_localpart_suffix,
642   deliver_domain);
643 envp[envcount++] = string_sprintf("QUALIFY_DOMAIN=%s", qualify_domain_sender);
644 envp[envcount++] = string_sprintf("SENDER=%s", sender_address);
645 envp[envcount++] = US"SHELL=/bin/sh";
646
647 if (addr->host_list)
648   envp[envcount++] = string_sprintf("HOST=%s", addr->host_list->name);
649
650 if (f.timestamps_utc)
651   envp[envcount++] = US"TZ=UTC";
652 else if (timezone_string && timezone_string[0])
653   envp[envcount++] = string_sprintf("TZ=%s", timezone_string);
654
655 /* Add any requested items */
656
657 GET_OPTION("environment");
658 if (envlist)
659   if (!(envlist = expand_cstring(envlist)))
660     {
661     addr->transport_return = DEFER;
662     addr->message = string_sprintf("failed to expand string \"%s\" "
663       "for %s transport: %s", ob->environment, tblock->name,
664       expand_string_message);
665     return FALSE;
666     }
667
668 while ((ss = string_nextinlist(&envlist, &envsep, NULL, 0)))
669    {
670    if (envcount > nelem(envp) - 2)
671      {
672      addr->transport_return = DEFER;
673      addr->basic_errno = E2BIG;
674      addr->message = string_sprintf("too many environment settings for "
675        "%s transport", tblock->name);
676      return FALSE;
677      }
678    envp[envcount++] = string_copy(ss);
679    }
680
681 envp[envcount] = NULL;
682
683 /* If the -N option is set, can't do any more. */
684
685 if (f.dont_deliver)
686   {
687   DEBUG(D_transport)
688     debug_printf("*** delivery by %s transport bypassed by -N option",
689       tblock->name);
690   return FALSE;
691   }
692
693
694 /* Handling the output from the pipe is tricky. If a file for catching this
695 output is provided, we could in theory just hand that fd over to the process,
696 but this isn't very safe because it might loop and carry on writing for
697 ever (which is exactly what happened in early versions of Exim). Therefore we
698 use the standard child_open() function, which creates pipes. We can then read
699 our end of the output pipe and count the number of bytes that come through,
700 chopping the sub-process if it exceeds some limit.
701
702 However, this means we want to run a sub-process with both its input and output
703 attached to pipes. We can't handle that easily from a single parent process
704 using straightforward code such as the transport_write_message() function
705 because the subprocess might not be reading its input because it is trying to
706 write to a full output pipe. The complication of redesigning the world to
707 handle this is too great - simpler just to run another process to do the
708 reading of the output pipe. */
709
710
711 /* As this is a local transport, we are already running with the required
712 uid/gid and current directory. Request that the new process be a process group
713 leader, so we can kill it and all its children on a timeout. */
714
715 if ((pid = child_open(USS argv, envp, ob->umask, &fd_in, &fd_out, TRUE,
716                         US"pipe-tpt-cmd")) < 0)
717   {
718   addr->transport_return = DEFER;
719   addr->message = string_sprintf(
720     "Failed to create child process for %s transport: %s", tblock->name,
721       strerror(errno));
722   return FALSE;
723   }
724 tctx.u.fd = fd_in;
725
726 /* Now fork a process to handle the output that comes down the pipe. */
727
728 if ((outpid = exim_fork(US"pipe-tpt-output")) < 0)
729   {
730   addr->basic_errno = errno;
731   addr->transport_return = DEFER;
732   addr->message = string_sprintf(
733     "Failed to create process for handling output in %s transport",
734       tblock->name);
735   (void)close(fd_in);
736   (void)close(fd_out);
737   return FALSE;
738   }
739
740 /* This is the code for the output-handling subprocess. Read from the pipe
741 in chunks, and write to the return file if one is provided. Keep track of
742 the number of bytes handled. If the limit is exceeded, try to kill the
743 subprocess group, and in any case close the pipe and exit, which should cause
744 the subprocess to fail. */
745
746 if (outpid == 0)
747   {
748   int count = 0;
749   (void)close(fd_in);
750   set_process_info("reading output from |%s", cmd);
751   while ((rc = read(fd_out, big_buffer, big_buffer_size)) > 0)
752     {
753     if (addr->return_file >= 0)
754       if(write(addr->return_file, big_buffer, rc) != rc)
755         DEBUG(D_transport) debug_printf("Problem writing to return_file\n");
756     count += rc;
757     if (count > ob->max_output)
758       {
759       DEBUG(D_transport) debug_printf("Too much output from pipe - killed\n");
760       if (addr->return_file >= 0)
761         {
762         uschar *message = US"\n\n*** Too much output - remainder discarded ***\n";
763         rc = Ustrlen(message);
764         if(write(addr->return_file, message, rc) != rc)
765           DEBUG(D_transport) debug_printf("Problem writing to return_file\n");
766         }
767       killpg(pid, SIGKILL);
768       break;
769       }
770     }
771   (void)close(fd_out);
772   _exit(0);
773   }
774
775 (void)close(fd_out);  /* Not used in this process */
776
777
778 /* Carrying on now with the main parent process. Attempt to write the message
779 to it down the pipe. It is a fallacy to think that you can detect write errors
780 when the sub-process fails to read the pipe. The parent process may complete
781 writing and close the pipe before the sub-process completes. We could sleep a
782 bit here to let the sub-process get going, but it may still not complete. So we
783 ignore all writing errors. (When in the test harness, we do do a short sleep so
784 any debugging output is likely to be in the same order.) */
785
786 testharness_pause_ms(500);
787
788 DEBUG(D_transport) debug_printf("Writing message to pipe\n");
789
790 /* Arrange to time out writes if there is a timeout set. */
791
792 if (timeout > 0)
793   {
794   sigalrm_seen = FALSE;
795   transport_write_timeout = timeout;
796   }
797
798 /* Reset the counter of bytes written */
799
800 transport_count = 0;
801
802 /* First write any configured prefix information */
803
804 GET_OPTION("message_prefix");
805 if (ob->message_prefix)
806   {
807   uschar * prefix = expand_string(ob->message_prefix);
808   if (!prefix)
809     {
810     addr->transport_return = f.search_find_defer? DEFER : PANIC;
811     addr->message = string_sprintf("Expansion of \"%s\" (prefix for %s "
812       "transport) failed: %s", ob->message_prefix, tblock->name,
813       expand_string_message);
814     return FALSE;
815     }
816   if (!transport_write_block(&tctx, prefix, Ustrlen(prefix), FALSE))
817     goto END_WRITE;
818   }
819
820 /* If the use_bsmtp option is set, we need to write SMTP prefix information.
821 The various different values for batching are handled outside; if there is more
822 than one address available here, all must be included. Force SMTP dot-handling.
823 */
824
825 if (ob->use_bsmtp)
826   {
827   if (!transport_write_string(fd_in, "MAIL FROM:<%s>%s", return_path, eol))
828     goto END_WRITE;
829
830   for (address_item * a = addr; a; a = a->next)
831     if (!transport_write_string(fd_in,
832         "RCPT TO:<%s>%s",
833         transport_rcpt_address(a, tblock->rcpt_include_affixes),
834         eol))
835       goto END_WRITE;
836
837   if (!transport_write_string(fd_in, "DATA%s", eol)) goto END_WRITE;
838   }
839
840 /* Now the actual message */
841
842 if (!transport_write_message(&tctx, 0))
843     goto END_WRITE;
844
845 /* Now any configured suffix */
846
847 GET_OPTION("message_suffix");
848 if (ob->message_suffix)
849   {
850   uschar * suffix = expand_string(ob->message_suffix);
851   if (!suffix)
852     {
853     addr->transport_return = f.search_find_defer? DEFER : PANIC;
854     addr->message = string_sprintf("Expansion of \"%s\" (suffix for %s "
855       "transport) failed: %s", ob->message_suffix, tblock->name,
856       expand_string_message);
857     return FALSE;
858     }
859   if (!transport_write_block(&tctx, suffix, Ustrlen(suffix), FALSE))
860     goto END_WRITE;
861   }
862
863 /* If local_smtp, write the terminating dot. */
864
865 if (ob->use_bsmtp && !transport_write_string(fd_in, ".%s", eol))
866   goto END_WRITE;
867
868 /* Flag all writing completed successfully. */
869
870 written_ok = TRUE;
871
872 /* Come here if there are errors during writing. */
873
874 END_WRITE:
875
876 /* OK, the writing is now all done. Close the pipe. */
877
878 (void) close(fd_in);
879
880 /* Handle errors during writing. For timeouts, set the timeout for waiting for
881 the child process to 1 second. If the process at the far end of the pipe died
882 without reading all of it, we expect an EPIPE error, which should be ignored.
883 We used also to ignore WRITEINCOMPLETE but the writing function is now cleverer
884 at handling OS where the death of a pipe doesn't give EPIPE immediately. See
885 comments therein. */
886
887 if (!written_ok)
888   {
889   if (errno == ETIMEDOUT)
890     {
891     addr->message = string_sprintf("%stimeout while writing to pipe",
892       f.transport_filter_timed_out ? "transport filter " : "");
893     addr->transport_return = ob->timeout_defer? DEFER : FAIL;
894     timeout = 1;
895     }
896   else if (errno == EPIPE)
897     {
898     debug_printf("transport error EPIPE ignored\n");
899     }
900   else
901     {
902     addr->transport_return = PANIC;
903     addr->basic_errno = errno;
904     if (errno == ERRNO_CHHEADER_FAIL)
905       addr->message =
906         string_sprintf("Failed to expand headers_add or headers_remove: %s",
907           expand_string_message);
908     else if (errno == ERRNO_FILTER_FAIL)
909       addr->message = string_sprintf("Transport filter process failed (%d)%s",
910       addr->more_errno,
911       (addr->more_errno == EX_EXECFAILED)? ": unable to execute command" : "");
912     else if (errno == ERRNO_WRITEINCOMPLETE)
913       addr->message = US"Failed repeatedly to write data";
914     else
915       addr->message = string_sprintf("Error %d", errno);
916     return FALSE;
917     }
918   }
919
920 /* Wait for the child process to complete and take action if the returned
921 status is nonzero. The timeout will be just 1 second if any of the writes
922 above timed out. */
923
924 if ((rc = child_close(pid, timeout)) != 0)
925   {
926   uschar * tmsg = addr->message
927     ? string_sprintf(" (preceded by %s)", addr->message) : US"";
928
929   /* The process did not complete in time; kill its process group and fail
930   the delivery. It appears to be necessary to kill the output process too, as
931   otherwise it hangs on for some time if the actual pipe process is sleeping.
932   (At least, that's what I observed on Solaris 2.5.1.) Since we are failing
933   the delivery, that shouldn't cause any problem. */
934
935   if (rc == -256)
936     {
937     killpg(pid, SIGKILL);
938     kill(outpid, SIGKILL);
939     addr->transport_return = ob->timeout_defer? DEFER : FAIL;
940     addr->message = string_sprintf("pipe delivery process timed out%s", tmsg);
941     }
942
943   /* Wait() failed. */
944
945   else if (rc == -257)
946     {
947     addr->transport_return = PANIC;
948     addr->message = string_sprintf("Wait() failed for child process of %s "
949       "transport: %s%s", tblock->name, strerror(errno), tmsg);
950     }
951
952   /* Since the transport_filter timed out we assume it has sent the child process
953   a malformed or incomplete data stream.  Kill off the child process
954   and prevent checking its exit status as it will has probably exited in error.
955   This prevents the transport_filter timeout message from getting overwritten
956   by the exit error which is not the cause of the problem. */
957
958   else if (f.transport_filter_timed_out)
959     {
960     killpg(pid, SIGKILL);
961     kill(outpid, SIGKILL);
962     }
963
964   /* Either the process completed, but yielded a non-zero (necessarily
965   positive) status, or the process was terminated by a signal (rc will contain
966   the negation of the signal number). Treat killing by signal as failure unless
967   status is being ignored. By default, the message is bounced back, unless
968   freeze_signal is set, in which case it is frozen instead. */
969
970   else if (rc < 0)
971     {
972     if (ob->freeze_signal)
973       {
974       addr->transport_return = DEFER;
975       addr->special_action = SPECIAL_FREEZE;
976       addr->message = string_sprintf("Child process of %s transport (running "
977         "command \"%s\") was terminated by signal %d (%s)%s", tblock->name, cmd,
978         -rc, os_strsignal(-rc), tmsg);
979       }
980     else if (!ob->ignore_status)
981       {
982       addr->transport_return = FAIL;
983       addr->message = string_sprintf("Child process of %s transport (running "
984         "command \"%s\") was terminated by signal %d (%s)%s", tblock->name, cmd,
985         -rc, os_strsignal(-rc), tmsg);
986       }
987     }
988
989   /* For positive values (process terminated with non-zero status), we need a
990   status code to request deferral. A number of systems contain the following
991   line in sysexits.h:
992
993       #define EX_TEMPFAIL 75
994
995   with the description
996
997       EX_TEMPFAIL -- temporary failure, indicating something that
998          is not really an error.  In sendmail, this means
999          that a mailer (e.g.) could not create a connection,
1000          and the request should be reattempted later.
1001
1002   Based on this, we use exit code EX_TEMPFAIL as a default to mean "defer" when
1003   not ignoring the returned status. However, there is now an option that
1004   contains a list of temporary codes, with TEMPFAIL and CANTCREAT as defaults.
1005
1006   Another case that needs special treatment is if execve() failed (typically
1007   the command that was given is a non-existent path). By default this is
1008   treated as just another failure, but if freeze_exec_fail is set, the reaction
1009   is to freeze the message rather than bounce the address. Exim used to signal
1010   this failure with EX_UNAVAILABLE, which is defined in many systems as
1011
1012       #define EX_UNAVAILABLE  69
1013
1014   with the description
1015
1016       EX_UNAVAILABLE -- A service is unavailable.  This can occur
1017             if a support program or file does not exist.  This
1018             can also be used as a catchall message when something
1019             you wanted to do doesn't work, but you don't know why.
1020
1021   However, this can be confused with a command that actually returns 69 because
1022   something *it* wanted is unavailable. At release 4.21, Exim was changed to
1023   use return code 127 instead, because this is what the shell returns when it
1024   is unable to exec a command. We define it as EX_EXECFAILED, and use it in
1025   child.c to signal execve() failure and other unexpected failures such as
1026   setuid() not working - though that won't be the case here because we aren't
1027   changing uid. */
1028
1029   else
1030     {
1031     /* Always handle execve() failure specially if requested to */
1032
1033     if (ob->freeze_exec_fail  &&  rc == EX_EXECFAILED)
1034       {
1035       addr->transport_return = DEFER;
1036       addr->special_action = SPECIAL_FREEZE;
1037       addr->message = string_sprintf("pipe process failed to exec \"%s\"%s",
1038         cmd, tmsg);
1039       }
1040
1041     /* Otherwise take action only if not ignoring status */
1042
1043     else if (!ob->ignore_status)
1044       {
1045       uschar *ss;
1046       gstring * g;
1047
1048       /* If temp_errors is "*" all codes are temporary. Initialization checks
1049       that it's either "*" or a list of numbers. If not "*", scan the list of
1050       temporary failure codes; if any match, the result is DEFER. */
1051
1052       if (ob->temp_errors[0] == '*')
1053         addr->transport_return = DEFER;
1054
1055       else
1056         {
1057         const uschar *s = ob->temp_errors;
1058         uschar *p;
1059         int sep = 0;
1060
1061         addr->transport_return = FAIL;
1062         while ((p = string_nextinlist(&s,&sep,NULL,0)))
1063           if (rc == Uatoi(p)) { addr->transport_return = DEFER; break; }
1064         }
1065
1066       /* Ensure the message contains the expanded command and arguments. This
1067       doesn't have to be brilliantly efficient - it is an error situation. */
1068
1069       addr->message = string_sprintf("Child process of %s transport returned "
1070         "%d", tblock->name, rc);
1071       g = string_cat(NULL, addr->message);
1072
1073       /* If the return code is > 128, it often means that a shell command
1074       was terminated by a signal. */
1075
1076       ss = (rc > 128)?
1077         string_sprintf("(could mean shell command ended by signal %d (%s))",
1078           rc-128, os_strsignal(rc-128)) :
1079         US os_strexit(rc);
1080
1081       if (*ss)
1082         {
1083         g = string_catn(g, US" ", 1);
1084         g = string_cat (g, ss);
1085         }
1086
1087       /* Now add the command and arguments */
1088
1089       g = string_catn(g, US" from command:", 14);
1090
1091       for (int i = 0; i < sizeof(argv)/sizeof(int *) && argv[i] != NULL; i++)
1092         {
1093         BOOL quote = FALSE;
1094         g = string_catn(g, US" ", 1);
1095         if (Ustrpbrk(argv[i], " \t") != NULL)
1096           {
1097           quote = TRUE;
1098           g = string_catn(g, US"\"", 1);
1099           }
1100         g = string_cat(g, argv[i]);
1101         if (quote)
1102           g = string_catn(g, US"\"", 1);
1103         }
1104
1105       /* Add previous filter timeout message, if present. */
1106
1107       if (*tmsg)
1108         g = string_cat(g, tmsg);
1109
1110       addr->message = string_from_gstring(g);
1111       }
1112     }
1113   }
1114
1115 /* Ensure all subprocesses (in particular, the output handling process)
1116 are complete before we pass this point. */
1117
1118 while (wait(&rc) >= 0);
1119
1120 DEBUG(D_transport) debug_printf("%s transport yielded %d\n", tblock->name,
1121   addr->transport_return);
1122
1123 /* If there has been a problem, the message in addr->message contains details
1124 of the pipe command. We don't want to expose these to the world, so we set up
1125 something bland to return to the sender. */
1126
1127 if (addr->transport_return != OK)
1128   addr->user_message = US"local delivery failed";
1129
1130 return FALSE;
1131 }
1132
1133 #endif  /*!MACRO_PREDEF*/
1134 /* End of transport/pipe.c */