From a94bdef382a12b5677b6d6f5eb6e686bfc8cf665 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/confs/0173 | 1 + 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt index f9a80558e..8c7d17b71 100644 --- a/doc/doc-docbook/spec.xfpt +++ b/doc/doc-docbook/spec.xfpt @@ -23290,12 +23290,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 b783303a1..0127dd65a 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -6,6 +6,8 @@ Exim version 4.next 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/confs/0173 b/test/confs/0173 index 1b423e152..bfddc71e8 100644 --- a/test/confs/0173 +++ b/test/confs/0173 @@ -36,6 +36,7 @@ pipe: driver = pipe return_output user = CALLER + path = ${env{PATH}} # ----- Retry ----- -- 2.30.2