summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2016-12-04 11:21:55 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2016-12-29 19:22:58 +0000
commit7b2838902b766105e5086e41c0dbb27d87c523ae (patch)
tree888fcb4d3f4f0a21585fd1273bf139fe687744ca
parenta678496c52fe5cb49f76918598352ab9d457b70d (diff)
Pipe transport: expand the path option
-rw-r--r--doc/doc-docbook/spec.xfpt12
-rw-r--r--doc/doc-txt/ChangeLog2
-rw-r--r--src/src/transports/pipe.c29
-rw-r--r--test/aux-var-src/tls_conf_prefix2
-rw-r--r--test/confs/01732
-rw-r--r--test/confs/01742
-rw-r--r--test/confs/06122
-rw-r--r--test/stdout/05724
8 files changed, 26 insertions, 29 deletions
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 2acd5d38e..00a142a03 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -23255,12 +23255,12 @@ message_suffix =
&`\n`& to &`\r\n`& in &%message_suffix%&.
-.option path pipe string "see below"
-This option specifies the string that is set up in the PATH environment
-variable of the subprocess. The default is:
-.code
-/bin:/usr/bin
-.endd
+.option path pipe string&!! "bin:/usr/bin"
+.new
+This option is expanded and
+.wen
+specifies the string that is set up in the PATH environment
+variable of the subprocess.
If the &%command%& option does not yield an absolute path name, the command is
sought in the PATH directories, in the usual way. &*Warning*&: This does not
apply to a command specified as a transport filter.
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 46ec11e34..5427392b9 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -9,6 +9,8 @@ Exim version 4.89
JH/01 Bug 1922: Support IDNA2008. This has slightly different conversion rules
than -2003 did; needs libidn2 in addition to linidn.
+JH/02 The path option on a pipe transport is now expanded before use.
+
Exim version 4.88
-----------------
diff --git a/src/src/transports/pipe.c b/src/src/transports/pipe.c
index d3841e050..0535b6743 100644
--- a/src/src/transports/pipe.c
+++ b/src/src/transports/pipe.c
@@ -332,16 +332,14 @@ set_up_direct_command(const uschar ***argvptr, uschar *cmd,
{
BOOL permitted = FALSE;
const uschar **argv;
-uschar buffer[64];
/* Set up "transport <name>" to be put in any error messages, and then
call the common function for creating an argument list and expanding
the items if necessary. If it fails, this function fails (error information
is in the addresses). */
-sprintf(CS buffer, "%.50s transport", tname);
if (!transport_set_up_command(argvptr, cmd, expand_arguments, expand_fail,
- addr, buffer, NULL))
+ addr, string_sprintf("%.50s transport", tname), NULL))
return FALSE;
/* Point to the set-up arguments. */
@@ -350,12 +348,11 @@ argv = *argvptr;
/* If allow_commands is set, see if the command is in the permitted list. */
-if (ob->allow_commands != NULL)
+if (ob->allow_commands)
{
int sep = 0;
const uschar *s;
uschar *p;
- uschar buffer[256];
if (!(s = expand_string(ob->allow_commands)))
{
@@ -365,7 +362,7 @@ if (ob->allow_commands != NULL)
return FALSE;
}
- while ((p = string_nextinlist(&s, &sep, buffer, sizeof(buffer))))
+ while ((p = string_nextinlist(&s, &sep, NULL, 0)))
if (Ustrcmp(p, argv[0]) == 0) { permitted = TRUE; break; }
}
@@ -389,7 +386,7 @@ if (!permitted)
}
}
- else if (ob->allow_commands != NULL)
+ else if (ob->allow_commands)
{
addr->transport_return = FAIL;
addr->message = string_sprintf("\"%s\" command not permitted by %s "
@@ -405,10 +402,9 @@ if (argv[0][0] != '/')
{
int sep = 0;
uschar *p;
- const uschar *listptr = ob->path;
- uschar buffer[1024];
+ const uschar *listptr = expand_string(ob->path);
- while ((p = string_nextinlist(&listptr, &sep, buffer, sizeof(buffer))) != NULL)
+ while ((p = string_nextinlist(&listptr, &sep, NULL, 0)))
{
struct stat statbuf;
sprintf(CS big_buffer, "%.256s/%.256s", p, argv[0]);
@@ -418,7 +414,7 @@ if (argv[0][0] != '/')
break;
}
}
- if (p == NULL)
+ if (!p)
{
addr->transport_return = FAIL;
addr->message = string_sprintf("\"%s\" command not found for %s transport",
@@ -618,7 +614,7 @@ if (cmd == NULL || *cmd == '\0')
and numerical the variables in existence. These are passed in
addr->pipe_expandn for use here. */
-if (expand_arguments && addr->pipe_expandn != NULL)
+if (expand_arguments && addr->pipe_expandn)
{
uschar **ss = addr->pipe_expandn;
expand_nmax = -1;
@@ -658,7 +654,7 @@ envp[envcount++] = string_sprintf("LOCAL_PART_SUFFIX=%#s",
envp[envcount++] = string_sprintf("DOMAIN=%s", deliver_domain);
envp[envcount++] = string_sprintf("HOME=%#s", deliver_home);
envp[envcount++] = string_sprintf("MESSAGE_ID=%s", message_id);
-envp[envcount++] = string_sprintf("PATH=%s", ob->path);
+envp[envcount++] = string_sprintf("PATH=%s", expand_string(ob->path));
envp[envcount++] = string_sprintf("RECIPIENT=%#s%#s%#s@%#s",
deliver_localpart_prefix, deliver_localpart, deliver_localpart_suffix,
deliver_domain);
@@ -866,10 +862,10 @@ if (!transport_write_message(fd_in, &tctx, 0))
/* Now any configured suffix */
-if (ob->message_suffix != NULL)
+if (ob->message_suffix)
{
uschar *suffix = expand_string(ob->message_suffix);
- if (suffix == NULL)
+ if (!suffix)
{
addr->transport_return = search_find_defer? DEFER : PANIC;
addr->message = string_sprintf("Expansion of \"%s\" (suffix for %s "
@@ -1077,11 +1073,10 @@ if ((rc = child_close(pid, timeout)) != 0)
{
const uschar *s = ob->temp_errors;
uschar *p;
- uschar buffer[64];
int sep = 0;
addr->transport_return = FAIL;
- while ((p = string_nextinlist(&s,&sep,buffer,sizeof(buffer))))
+ while ((p = string_nextinlist(&s,&sep,NULL,0)))
if (rc == Uatoi(p)) { addr->transport_return = DEFER; break; }
}
diff --git a/test/aux-var-src/tls_conf_prefix b/test/aux-var-src/tls_conf_prefix
index 39dddd98f..20b6fe85f 100644
--- a/test/aux-var-src/tls_conf_prefix
+++ b/test/aux-var-src/tls_conf_prefix
@@ -1,5 +1,5 @@
+keep_environment = PATH
exim_path = EXIM_PATH
-keep_environment =
host_lookup_order = bydns
spool_directory = DIR/spool
diff --git a/test/confs/0173 b/test/confs/0173
index b7f27b936..bfddc71e8 100644
--- a/test/confs/0173
+++ b/test/confs/0173
@@ -36,7 +36,7 @@ pipe:
driver = pipe
return_output
user = CALLER
- path = /bin:/usr/bin:/usr/local/bin
+ path = ${env{PATH}}
# ----- Retry -----
diff --git a/test/confs/0174 b/test/confs/0174
index f366e29f6..32a3bde5d 100644
--- a/test/confs/0174
+++ b/test/confs/0174
@@ -63,7 +63,7 @@ pipe:
message_prefix =
return_output
user = CALLER
- path = /bin:/usr/bin:/usr/local/bin
+ path = ${env{PATH}}
# ----- Retry -----
diff --git a/test/confs/0612 b/test/confs/0612
index 9350a97ae..84260df65 100644
--- a/test/confs/0612
+++ b/test/confs/0612
@@ -28,7 +28,7 @@ pipe:
temp_errors = *
command = perl -e "print 'Hi from pipe'; exit 5;"
log_defer_output = true
- path = /bin:/usr/bin:/usr/local/bin
+ path = ${env{PATH}}
# ----- Retry -----
diff --git a/test/stdout/0572 b/test/stdout/0572
index d50a643b4..96ab5611b 100644
--- a/test/stdout/0572
+++ b/test/stdout/0572
@@ -78,8 +78,8 @@ OPT =
# 1 "TESTSUITE/aux-var/std_conf_prefix"
# 1 "TESTSUITE/aux-var/std_conf_prefix"
# 1 "TESTSUITE/aux-var/tls_conf_prefix"
+keep_environment = PATH
exim_path = TESTSUITE/eximdir/exim
-keep_environment =
host_lookup_order = bydns
spool_directory = TESTSUITE/spool
log_file_path = TESTSUITE/spool/log/%slog
@@ -117,8 +117,8 @@ OPT =
# 1 "TESTSUITE/aux-var/std_conf_prefix"
# 1 "TESTSUITE/aux-var/std_conf_prefix"
# 1 "TESTSUITE/aux-var/tls_conf_prefix"
+keep_environment = PATH
exim_path = TESTSUITE/eximdir/exim
-keep_environment =
host_lookup_order = bydns
spool_directory = TESTSUITE/spool
log_file_path = TESTSUITE/spool/log/%slog