X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/46d2a5e6f6e7709d172903b13945d23fc0a2c888..1d28cc061677bd07d9bed48dd84bd5c590247043:/src/src/transports/pipe.c diff --git a/src/src/transports/pipe.c b/src/src/transports/pipe.c index 6a7f150ac..c3547eefe 100644 --- a/src/src/transports/pipe.c +++ b/src/src/transports/pipe.c @@ -2,9 +2,10 @@ * Exim - an Internet mail transport agent * *************************************************/ +/* Copyright (c) The Exim maintainers 2020 - 2022 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ -/* Copyright (c) The Exim maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ #include "../exim.h" @@ -88,31 +89,13 @@ BOOL pipe_transport_entry(transport_instance *tblock, address_item *addr) {retur /* Default private options block for the pipe transport. */ pipe_transport_options_block pipe_transport_option_defaults = { - NULL, /* cmd */ - NULL, /* allow_commands */ - NULL, /* environment */ - US"/bin:/usr/bin", /* path */ - NULL, /* message_prefix (reset in init if not bsmtp) */ - NULL, /* message_suffix (ditto) */ - US mac_expanded_string(EX_TEMPFAIL) ":" /* temp_errors */ - mac_expanded_string(EX_CANTCREAT), - NULL, /* check_string */ - NULL, /* escape_string */ - 022, /* umask */ - 20480, /* max_output */ - 60*60, /* timeout */ - 0, /* options */ - FALSE, /* force_command */ - FALSE, /* freeze_exec_fail */ - FALSE, /* freeze_signal */ - FALSE, /* ignore_status */ - FALSE, /* permit_coredump */ - FALSE, /* restrict_to_path */ - FALSE, /* timeout_defer */ - FALSE, /* use_shell */ - FALSE, /* use_bsmtp */ - FALSE, /* use_classresources */ - FALSE /* use_crlf */ + .path = US"/bin:/usr/bin", + .temp_errors = US mac_expanded_string(EX_TEMPFAIL) ":" + mac_expanded_string(EX_CANTCREAT), + .umask = 022, + .max_output = 20480, + .timeout = 60*60, + /* all others null/zero/false */ }; @@ -144,13 +127,6 @@ pipe_transport_setup(transport_instance *tblock, address_item *addrlist, pipe_transport_options_block *ob = (pipe_transport_options_block *)(tblock->options_block); -addrlist = addrlist; /* Keep compiler happy */ -dummy = dummy; -uid = uid; -gid = gid; -errmsg = errmsg; -ob = ob; - #ifdef HAVE_SETCLASSRESOURCES if (ob->use_classresources) { @@ -285,12 +261,12 @@ if (ob->allow_commands && ob->use_shell) driver options. Only one of body_only and headers_only can be set. */ ob->options |= - (tblock->body_only? topt_no_headers : 0) | - (tblock->headers_only? topt_no_body : 0) | - (tblock->return_path_add? topt_add_return_path : 0) | - (tblock->delivery_date_add? topt_add_delivery_date : 0) | - (tblock->envelope_to_add? topt_add_envelope_to : 0) | - (ob->use_crlf? topt_use_crlf : 0); + (tblock->body_only ? topt_no_headers : 0) + | (tblock->headers_only ? topt_no_body : 0) + | (tblock->return_path_add ? topt_add_return_path : 0) + | (tblock->delivery_date_add ? topt_add_delivery_date : 0) + | (tblock->envelope_to_add ? topt_add_envelope_to : 0) + | (ob->use_crlf ? topt_use_crlf : 0); } @@ -329,7 +305,7 @@ the items if necessary. If it fails, this function fails (error information is in the addresses). */ if (!transport_set_up_command(argvptr, cmd, expand_arguments, expand_fail, - addr, string_sprintf("%.50s transport", tname), NULL)) + addr, FALSE, string_sprintf("%.50s transport", tname), NULL)) return FALSE; /* Point to the set-up arguments. */ @@ -442,7 +418,7 @@ set_up_shell_command(const uschar ***argvptr, uschar *cmd, { const uschar **argv; -*argvptr = argv = store_get((4)*sizeof(uschar *), FALSE); +*argvptr = argv = store_get((4)*sizeof(uschar *), GET_UNTAINTED); argv[0] = US"/bin/sh"; argv[1] = US"-c"; @@ -476,6 +452,9 @@ if (expand_arguments) for (address_item * ad = addr; ad; ad = ad->next) { + DEBUG(D_transport) if (is_tainted(ad->address)) + debug_printf("tainted element '%s' from $pipe_addresses\n", ad->address); + /*XXX string_append_listele() ? */ if (ad != addr) g = string_catn(g, US" ", 1); g = string_cat(g, ad->address); @@ -588,9 +567,8 @@ else } /* If no command has been supplied, we are in trouble. - * We also check for an empty string since it may be - * coming from addr->local_part[0] == '|' - */ +We also check for an empty string since it may be +coming from addr->local_part[0] == '|' */ if (!cmd || !*cmd) { @@ -601,6 +579,7 @@ if (!cmd || !*cmd) } if (is_tainted(cmd)) { + DEBUG(D_transport) debug_printf("cmd '%s' is tainted\n", cmd); addr->message = string_sprintf("Tainted '%s' (command " "for %s transport) not permitted", cmd, tblock->name); addr->transport_return = PANIC; @@ -659,11 +638,12 @@ envp[envcount++] = string_sprintf("QUALIFY_DOMAIN=%s", qualify_domain_sender); envp[envcount++] = string_sprintf("SENDER=%s", sender_address); envp[envcount++] = US"SHELL=/bin/sh"; -if (addr->host_list != NULL) +if (addr->host_list) envp[envcount++] = string_sprintf("HOST=%s", addr->host_list->name); -if (f.timestamps_utc) envp[envcount++] = US"TZ=UTC"; -else if (timezone_string != NULL && timezone_string[0] != 0) +if (f.timestamps_utc) + envp[envcount++] = US"TZ=UTC"; +else if (timezone_string && timezone_string[0]) envp[envcount++] = string_sprintf("TZ=%s", timezone_string); /* Add any requested items */ @@ -678,7 +658,7 @@ if (envlist) return FALSE; } -while ((ss = string_nextinlist(&envlist, &envsep, big_buffer, big_buffer_size))) +while ((ss = string_nextinlist(&envlist, &envsep, NULL, 0))) { if (envcount > nelem(envp) - 2) {