In ac33519ddfa8 (mingw: restrict file handle inheritance only on Windows
7 and later, 2019-11-22), I introduced code to safe-guard the
defense-in-depth handling that restricts handles' inheritance so that it
would work with Windows 7, too.
Let's revert this patch: Git for Windows dropped supporting Windows 7 (and
Windows 8) directly after Git for Windows v2.46.2. For full details, see
https://gitforwindows.org/requirements#windows-version.
Actually, on second thought: revert only the part that makes this handle
inheritance restriction logic optional and that suggests to open a bug
report if it fails, but keep the fall-back to try again without said
logic: There have been a few false positives over the past few years
(where the warning was triggered e.g. because Defender was still
accessing a file that Git wanted to overwrite), and the fall-back logic
seems to have helped occasionally in such situations.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Johannes Schindelin committedAug 3, 2025 at 21:25 UTCce6ccbaf92ec41743d83c386cad4dba77f768f13
2 files changed+4-70
Documentation/config/core.adoc
-6
index 9fde1ab63a..3fbe83eef1 100644--- a/Documentation/config/core.adoc+++ b/Documentation/config/core.adoc@@ -696,12 +696,6 @@ core.unsetenvvars:: Defaults to `PERL5LIB` to account for the fact that Git for Windows insists on using its own Perl interpreter.-core.restrictinheritedhandles::- Windows-only: override whether spawned processes inherit only standard- file handles (`stdin`, `stdout` and `stderr`) or all handles. Can be- `auto`, `true` or `false`. Defaults to `auto`, which means `true` on- Windows 7 and later, and `false` on older Windows versions.- core.createObject:: You can set this to 'link', in which case a hardlink followed by a delete of the source are used to make sure that object creation
compat/mingw.c
+4-64
index 2dd5cbcaee..c331c3ac32 100644--- a/compat/mingw.c+++ b/compat/mingw.c@@ -244,7 +244,6 @@ enum hide_dotfiles_type { HIDE_DOTFILES_DOTGITONLY };-static int core_restrict_inherited_handles = -1; static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY; static char *unset_environment_variables;@@ -268,15 +267,6 @@ int mingw_core_config(const char *var, const char *value, return 0; }- if (!strcmp(var, "core.restrictinheritedhandles")) {- if (value && !strcasecmp(value, "auto"))- core_restrict_inherited_handles = -1;- else- core_restrict_inherited_handles =- git_config_bool(var, value);- return 0;- }- return 0; }@@ -1667,7 +1657,6 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen const char *dir, int prepend_cmd, int fhin, int fhout, int fherr) {- static int restrict_handle_inheritance = -1; STARTUPINFOEXW si; PROCESS_INFORMATION pi; LPPROC_THREAD_ATTRIBUTE_LIST attr_list = NULL;@@ -1687,16 +1676,6 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen /* Make sure to override previous errors, if any */ errno = 0;- if (restrict_handle_inheritance < 0)- restrict_handle_inheritance = core_restrict_inherited_handles;- /*- * The following code to restrict which handles are inherited seems- * to work properly only on Windows 7 and later, so let's disable it- * on Windows Vista and 2008.- */- if (restrict_handle_inheritance < 0)- restrict_handle_inheritance = GetVersion() >> 16 >= 7601;- do_unset_environment_variables(); /* Determine whether or not we are associated to a console */@@ -1798,7 +1777,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen wenvblk = make_environment_block(deltaenv); memset(&pi, 0, sizeof(pi));- if (restrict_handle_inheritance && stdhandles_count &&+ if (stdhandles_count && (InitializeProcThreadAttributeList(NULL, 1, 0, &size) || GetLastError() == ERROR_INSUFFICIENT_BUFFER) && (attr_list = (LPPROC_THREAD_ATTRIBUTE_LIST)@@ -1819,52 +1798,13 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen &si.StartupInfo, &pi); /*- * On Windows 2008 R2, it seems that specifying certain types of handles- * (such as FILE_TYPE_CHAR or FILE_TYPE_PIPE) will always produce an- * error. Rather than playing finicky and fragile games, let's just try- * to detect this situation and simply try again without restricting any- * handle inheritance. This is still better than failing to create- * processes.+ * On the off-chance that something with the file handle restriction+ * went wrong, silently fall back to trying without it. */- if (!ret && restrict_handle_inheritance && stdhandles_count) {+ if (!ret && stdhandles_count) { DWORD err = GetLastError(); struct strbuf buf = STRBUF_INIT;- if (err != ERROR_NO_SYSTEM_RESOURCES &&- /*- * On Windows 7 and earlier, handles on pipes and character- * devices are inherited automatically, and cannot be- * specified in the thread handle list. Rather than trying- * to catch each and every corner case (and running the- * chance of *still* forgetting a few), let's just fall- * back to creating the process without trying to limit the- * handle inheritance.- */- !(err == ERROR_INVALID_PARAMETER &&- GetVersion() >> 16 < 9200) &&- !getenv("SUPPRESS_HANDLE_INHERITANCE_WARNING")) {- DWORD fl = 0;- int i;-- setenv("SUPPRESS_HANDLE_INHERITANCE_WARNING", "1", 1);-- for (i = 0; i < stdhandles_count; i++) {- HANDLE h = stdhandles[i];- strbuf_addf(&buf, "handle #%d: %p (type %lx, "- "handle info (%d) %lx\n", i, h,- GetFileType(h),- GetHandleInformation(h, &fl),- fl);- }- strbuf_addstr(&buf, "\nThis is a bug; please report it "- "at\nhttps://github.com/git-for-windows/"- "git/issues/new\n\n"- "To suppress this warning, please set "- "the environment variable\n\n"- "\tSUPPRESS_HANDLE_INHERITANCE_WARNING=1"- "\n");- }- restrict_handle_inheritance = 0; flags &= ~EXTENDED_STARTUPINFO_PRESENT; ret = CreateProcessW(*wcmd ? wcmd : NULL, wargs, NULL, NULL, TRUE, flags, wenvblk, dir ? wdir : NULL,