diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-10-28 14:15:03 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-10-28 14:15:03 -0400 |
commit | f88544904e4b57b1a8e969a5d594288554417c88 (patch) | |
tree | 5503dafca6829885f5b84a6bbbf95660bf7c8b91 /src | |
parent | bd1ef5799b04168d8a869197dd9b85935d5d5da9 (diff) | |
download | postgresql-f88544904e4b57b1a8e969a5d594288554417c88.tar.gz postgresql-f88544904e4b57b1a8e969a5d594288554417c88.zip |
On Windows, use COMSPEC to find the location of cmd.exe.
Historically, psql consulted COMSPEC to spawn a shell in its \! command,
but we just invoked "cmd" when spawning shells in pg_ctl and pg_regress.
It seems better to rely on the environment variable, if it's set,
in all cases.
It's debatable whether this is a bug fix or just a behavioral change,
so no back-patch.
Juan José SantamarÃa Flecha
Discussion: https://postgr.es/m/16080-5d7f03222469f717@postgresql.org
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_ctl/pg_ctl.c | 14 | ||||
-rw-r--r-- | src/test/regress/pg_regress.c | 8 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index a3fd002ac47..95e5fafe1f4 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -513,13 +513,19 @@ start_postmaster(void) * "exec", so we don't get to find out the postmaster's PID immediately. */ PROCESS_INFORMATION pi; + const char *comspec; + + /* Find CMD.EXE location using COMSPEC, if it's set */ + comspec = getenv("COMSPEC"); + if (comspec == NULL) + comspec = "CMD"; if (log_file != NULL) - snprintf(cmd, MAXPGPATH, "CMD /C \"\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1\"", - exec_path, pgdata_opt, post_opts, DEVNULL, log_file); + snprintf(cmd, MAXPGPATH, "\"%s\" /C \"\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1\"", + comspec, exec_path, pgdata_opt, post_opts, DEVNULL, log_file); else - snprintf(cmd, MAXPGPATH, "CMD /C \"\"%s\" %s%s < \"%s\" 2>&1\"", - exec_path, pgdata_opt, post_opts, DEVNULL); + snprintf(cmd, MAXPGPATH, "\"%s\" /C \"\"%s\" %s%s < \"%s\" 2>&1\"", + comspec, exec_path, pgdata_opt, post_opts, DEVNULL); if (!CreateRestrictedProcess(cmd, &pi, false)) { diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 6554ce214bc..297b8fbd6f9 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -1193,9 +1193,15 @@ spawn_process(const char *cmdline) PROCESS_INFORMATION pi; char *cmdline2; HANDLE restrictedToken; + const char *comspec; + + /* Find CMD.EXE location using COMSPEC, if it's set */ + comspec = getenv("COMSPEC"); + if (comspec == NULL) + comspec = "CMD"; memset(&pi, 0, sizeof(pi)); - cmdline2 = psprintf("cmd /c \"%s\"", cmdline); + cmdline2 = psprintf("\"%s\" /c \"%s\"", comspec, cmdline); if ((restrictedToken = CreateRestrictedProcess(cmdline2, &pi)) == 0) |