Skip to content

Commit e5c5804

Browse files
dschoGit for Windows Build Agent
authored and
Git for Windows Build Agent
committed
mingw: support spawning programs containing spaces in their names
On some older Windows versions (e.g. Windows 7), the CreateProcessW() function does not really support spaces in its first argument, lpApplicationName. But it supports passing NULL as lpApplicationName, which makes it figure out the application from the (possibly quoted) first argument of lpCommandLine. Let's use that trick (if we are certain that the first argument matches the executable's path) to support launching programs whose path contains spaces. We will abuse the test-fake-ssh.exe helper to verify that this works and does not regress. This fixes #692 Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 04418e2 commit e5c5804

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

compat/mingw.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,7 +1472,9 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
14721472
si.hStdError = winansi_get_osfhandle(fherr);
14731473

14741474
/* executables and the current directory don't support long paths */
1475-
if (xutftowcs_path(wcmd, cmd) < 0)
1475+
if (*argv && !strcmp(cmd, *argv))
1476+
wcmd[0] = L'\0';
1477+
else if (xutftowcs_path(wcmd, cmd) < 0)
14761478
return -1;
14771479
if (dir && xutftowcs_path(wdir, dir) < 0)
14781480
return -1;
@@ -1501,8 +1503,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
15011503
wenvblk = make_environment_block(deltaenv);
15021504

15031505
memset(&pi, 0, sizeof(pi));
1504-
ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,
1505-
wenvblk, dir ? wdir : NULL, &si, &pi);
1506+
ret = CreateProcessW(*wcmd ? wcmd : NULL, wargs, NULL, NULL, TRUE,
1507+
flags, wenvblk, dir ? wdir : NULL, &si, &pi);
15061508

15071509
free(wenvblk);
15081510
free(wargs);

t/t0061-run-command.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,4 +210,10 @@ test_expect_success MINGW 'verify curlies are quoted properly' '
210210
test_cmp expect actual
211211
'
212212

213+
test_expect_success MINGW 'can spawn with argv[0] containing spaces' '
214+
cp "$GIT_BUILD_DIR/t/helper/test-fake-ssh$X" ./ &&
215+
test_must_fail "$PWD/test-fake-ssh$X" 2>err &&
216+
grep TRASH_DIRECTORY err
217+
'
218+
213219
test_done

0 commit comments

Comments
 (0)