Skip to content

Commit 55aa856

Browse files
committed
mingw: restrict file handle inheritance only on Windows 7 and later
Turns out that it don't work so well on Vista, see #1742 for details. According to https://devblogs.microsoft.com/oldnewthing/?p=8873, it *should* work on Windows Vista and later. But apparently there are issues on Windows Vista when pipes are involved. Given that Windows Vista is past its end of life (official support ended on April 11th, 2017), let's not spend *too* much time on this issue and just disable the file handle inheritance restriction on any Windows version earlier than Windows 7. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 93d8e37 commit 55aa856

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Documentation/config/core.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,12 @@ core.unsetenvvars::
559559
Defaults to `PERL5LIB` to account for the fact that Git for
560560
Windows insists on using its own Perl interpreter.
561561

562+
core.restrictinheritedhandles::
563+
Windows-only: override whether spawned processes inherit only standard
564+
file handles (`stdin`, `stdout` and `stderr`) or all handles. Can be
565+
`auto`, `true` or `false`. Defaults to `auto`, which means `true` on
566+
Windows 7 and later, and `false` on older Windows versions.
567+
562568
core.createObject::
563569
You can set this to 'link', in which case a hardlink followed by
564570
a delete of the source are used to make sure that object creation

compat/mingw.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ enum hide_dotfiles_type {
212212
HIDE_DOTFILES_DOTGITONLY
213213
};
214214

215+
static int core_restrict_inherited_handles = -1;
215216
static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
216217
static char *unset_environment_variables;
217218

@@ -231,6 +232,15 @@ int mingw_core_config(const char *var, const char *value, void *cb)
231232
return 0;
232233
}
233234

235+
if (!strcmp(var, "core.restrictinheritedhandles")) {
236+
if (value && !strcasecmp(value, "auto"))
237+
core_restrict_inherited_handles = -1;
238+
else
239+
core_restrict_inherited_handles =
240+
git_config_bool(var, value);
241+
return 0;
242+
}
243+
234244
return 0;
235245
}
236246

@@ -1436,7 +1446,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
14361446
const char *dir,
14371447
int prepend_cmd, int fhin, int fhout, int fherr)
14381448
{
1439-
static int restrict_handle_inheritance = 1;
1449+
static int restrict_handle_inheritance = -1;
14401450
STARTUPINFOEXW si;
14411451
PROCESS_INFORMATION pi;
14421452
LPPROC_THREAD_ATTRIBUTE_LIST attr_list = NULL;
@@ -1452,6 +1462,16 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
14521462
is_msys2_sh(cmd ? cmd : *argv) ?
14531463
quote_arg_msys2 : quote_arg_msvc;
14541464

1465+
if (restrict_handle_inheritance < 0)
1466+
restrict_handle_inheritance = core_restrict_inherited_handles;
1467+
/*
1468+
* The following code to restrict which handles are inherited seems
1469+
* to work properly only on Windows 7 and later, so let's disable it
1470+
* on Windows Vista and 2008.
1471+
*/
1472+
if (restrict_handle_inheritance < 0)
1473+
restrict_handle_inheritance = GetVersion() >> 16 >= 7601;
1474+
14551475
do_unset_environment_variables();
14561476

14571477
/* Determine whether or not we are associated to a console */

0 commit comments

Comments
 (0)