Pipe transport: expand the path option
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 4 Dec 2016 11:21:55 +0000 (11:21 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 29 Dec 2016 19:22:58 +0000 (19:22 +0000)
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/transports/pipe.c
test/aux-var-src/tls_conf_prefix
test/confs/0173
test/confs/0174
test/confs/0612
test/stdout/0572

index 2acd5d38e67d78b9a6170552790430dbc5070627..00a142a03b14392204a77fe9309ff7d399ff959a 100644 (file)
@@ -23255,12 +23255,12 @@ message_suffix =
 &`\n`& to &`\r\n`& in &%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.
 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.
index 46ec11e34f8af393da4271681061c96fd2622b07..5427392b97d1693858ace79019f1d114075d0167 100644 (file)
@@ -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/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
 -----------------
 
 Exim version 4.88
 -----------------
index d3841e05021332fcb26a75b2b8d19136bc992dc7..0535b674332103bf573922aabb8ecbb5ad4bc13b 100644 (file)
@@ -332,16 +332,14 @@ set_up_direct_command(const uschar ***argvptr, uschar *cmd,
 {
 BOOL permitted = FALSE;
 const uschar **argv;
 {
 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). */
 
 
 /* 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,
 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. */
   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 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;
   {
   int sep = 0;
   const uschar *s;
   uschar *p;
-  uschar buffer[256];
 
   if (!(s = expand_string(ob->allow_commands)))
     {
 
   if (!(s = expand_string(ob->allow_commands)))
     {
@@ -365,7 +362,7 @@ if (ob->allow_commands != NULL)
     return FALSE;
     }
 
     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; }
   }
 
     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 "
     {
     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;
   {
   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]);
     {
     struct stat statbuf;
     sprintf(CS big_buffer, "%.256s/%.256s", p, argv[0]);
@@ -418,7 +414,7 @@ if (argv[0][0] != '/')
       break;
       }
     }
       break;
       }
     }
-  if (p == NULL)
+  if (!p)
     {
     addr->transport_return = FAIL;
     addr->message = string_sprintf("\"%s\" command not found for %s transport",
     {
     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. */
 
 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;
   {
   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("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);
 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 */
 
 
 /* Now any configured suffix */
 
-if (ob->message_suffix != NULL)
+if (ob->message_suffix)
   {
   uschar *suffix = expand_string(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 "
     {
     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;
         {
         const uschar *s = ob->temp_errors;
         uschar *p;
-        uschar buffer[64];
         int sep = 0;
 
         addr->transport_return = FAIL;
         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; }
         }
 
           if (rc == Uatoi(p)) { addr->transport_return = DEFER; break; }
         }
 
index 39dddd98f7129da3a4598cfd6120d84b6b781671..20b6fe85f44674ce795ab494a3f3836edc5c800a 100644 (file)
@@ -1,5 +1,5 @@
+keep_environment = PATH
 exim_path = EXIM_PATH
 exim_path = EXIM_PATH
-keep_environment =
 host_lookup_order = bydns
 spool_directory = DIR/spool
 
 host_lookup_order = bydns
 spool_directory = DIR/spool
 
index b7f27b936b64f523d5ea1ee7c4de538c69cfa90c..bfddc71e867158ef3218778b9e0f958d836ae354 100644 (file)
@@ -36,7 +36,7 @@ pipe:
   driver = pipe
   return_output
   user = CALLER
   driver = pipe
   return_output
   user = CALLER
-  path = /bin:/usr/bin:/usr/local/bin
+  path = ${env{PATH}}
 
 
 # ----- Retry -----
 
 
 # ----- Retry -----
index f366e29f64dde3e3bc966b815ee3565e4f8cf68b..32a3bde5d988c7378d7bc8b48c4141e9242520ea 100644 (file)
@@ -63,7 +63,7 @@ pipe:
   message_prefix =
   return_output
   user = CALLER
   message_prefix =
   return_output
   user = CALLER
-  path = /bin:/usr/bin:/usr/local/bin
+  path = ${env{PATH}}
 
 
 # ----- Retry -----
 
 
 # ----- Retry -----
index 9350a97aee64543c0b4a6fbcc19b188cb280218c..84260df657d6fa913f7651d29950682a75637de2 100644 (file)
@@ -28,7 +28,7 @@ pipe:
     temp_errors = *
     command     = perl -e "print 'Hi from pipe'; exit 5;"
     log_defer_output = true
     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 -----
 
 
 # ----- Retry -----
 
index d50a643b42e1ac9ab15ecab4d972a62e243f4ee3..96ab5611b10d95bef59ad6c11a2e7089380fccd3 100644 (file)
@@ -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"
 # 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
 exim_path = TESTSUITE/eximdir/exim
-keep_environment =
 host_lookup_order = bydns
 spool_directory = TESTSUITE/spool
 log_file_path = TESTSUITE/spool/log/%slog
 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"
 # 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
 exim_path = TESTSUITE/eximdir/exim
-keep_environment =
 host_lookup_order = bydns
 spool_directory = TESTSUITE/spool
 log_file_path = TESTSUITE/spool/log/%slog
 host_lookup_order = bydns
 spool_directory = TESTSUITE/spool
 log_file_path = TESTSUITE/spool/log/%slog