From 7b2838902b766105e5086e41c0dbb27d87c523ae Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sun, 4 Dec 2016 11:21:55 +0000 Subject: [PATCH] Pipe transport: expand the path option --- doc/doc-docbook/spec.xfpt | 12 ++++++------ doc/doc-txt/ChangeLog | 2 ++ src/src/transports/pipe.c | 29 ++++++++++++----------------- test/aux-var-src/tls_conf_prefix | 2 +- test/confs/0173 | 2 +- test/confs/0174 | 2 +- test/confs/0612 | 2 +- test/stdout/0572 | 4 ++-- 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 " 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 -- 2.30.2