The shell spawned in run-command.c:prepare_shell_cmd was hard coded to "sh." This was breaking "t7006-pager:command-specific pager" when the "sh" found in the PATH happened to be a broken one such as Solaris' /usr/bin/sh. (The breakage in this case was due to ^ being interpreted the same as | which was seeing two processes forked instead of a single sed process.) To allow the build system to supply a value that is deemed sane, thus removing variation injected by the local user environment, define a macro named SHELL_PATH (to match the variable of the same name in the build system). Use this macro instead of the literal "sh" when preparing a set of arguments to be forked. Set "sh" as the default value of this macro if none is set through other means to preserve the original behaviour. The Makefile now sets EXTRA_CPPFLAGS to a value that includes a definition of SHELL_PATH when building run_command.c. This sees the sane shell passed to run_command.c and used when forking external commands. Leveraging SANE_TOOL_PATH was considered here but had downsides that may have made it an incomplete solution. For example, some builds may use bash as the shell and not want sh used at all. Signed-off-by: Ben Walton <bwalton@xxxxxxxxxxxxxxxxxx> --- Makefile | 2 ++ run-command.c | 6 +++++- 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Makefile b/Makefile index be1957a..344e2e0 100644 --- a/Makefile +++ b/Makefile @@ -1913,6 +1913,8 @@ builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \ '-DGIT_MAN_PATH="$(mandir_SQ)"' \ '-DGIT_INFO_PATH="$(infodir_SQ)"' +run-command.o: EXTRA_CPPFLAGS = -DSHELL_PATH='"$(SHELL_PATH)"' + $(BUILT_INS): git$X $(QUIET_BUILT_IN)$(RM) $@ && \ ln git$X $@ 2>/dev/null || \ diff --git a/run-command.c b/run-command.c index 1db8abf..f005a31 100644 --- a/run-command.c +++ b/run-command.c @@ -4,6 +4,10 @@ #include "sigchain.h" #include "argv-array.h" +#ifndef SHELL_PATH +# define SHELL_PATH "sh" +#endif + struct child_to_clean { pid_t pid; struct child_to_clean *next; @@ -90,7 +94,7 @@ static const char **prepare_shell_cmd(const char **argv) die("BUG: shell command is empty"); if (strcspn(argv[0], "|&;<>()$`\\\"' \t\n*?[#~=%") != strlen(argv[0])) { - nargv[nargc++] = "sh"; + nargv[nargc++] = SHELL_PATH; nargv[nargc++] = "-c"; if (argc < 2) -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html