Skip to content

Commit 0ef0f0e

Browse files
committed
mingw: support spawning programs containing spaces in their names
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. This fixes https://github.com/git-for-windows/git/issue/692 Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 9dfad9e commit 0ef0f0e

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

compat/mingw.c

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

14411441
/* executables and the current directory don't support long paths */
1442-
if (xutftowcs_path(wcmd, cmd) < 0)
1442+
if (*argv && !strcmp(cmd, *argv))
1443+
wcmd[0] = L'\0';
1444+
else if (xutftowcs_path(wcmd, cmd) < 0)
14431445
return -1;
14441446
if (dir && xutftowcs_path(wdir, dir) < 0)
14451447
return -1;
@@ -1478,8 +1480,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
14781480
wenvblk = make_environment_block(deltaenv);
14791481

14801482
memset(&pi, 0, sizeof(pi));
1481-
ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,
1482-
wenvblk, dir ? wdir : NULL, &si, &pi);
1483+
ret = CreateProcessW(*wcmd ? wcmd : NULL, wargs, NULL, NULL, TRUE,
1484+
flags, wenvblk, dir ? wdir : NULL, &si, &pi);
14831485

14841486
free(wenvblk);
14851487
free(wargs);

0 commit comments

Comments
 (0)