Skip to content

Commit f5f594c

Browse files
committed
amend! Avoid sharing cygheaps across Cygwin versions
Avoid sharing cygheaps across Cygwin versions It frequently leads to problems when trying, say, to call from Git for Windows' Bash into Cygwin's or MSYS2's, merely because sharing that data is pretty finicky. For example, using the Git for Windows that is current at time of writing, trying to call MSYS2's Bash from Git for Windows' Bash fails somewhere in `_cmalloc()`, without any error message, and with the rather misleading exit code 127 (a code which is reserved to indicate that a command was not found). Let's just treat these as completely incompatible with one another, by virtue of using a different `CHILD_INFO_MAGIC` constant. Let's take the msys2-runtime commit as the tell-tale whether two MSYS2 runtime versions are compatible with each other. To support building in the MSYS2-packages repository (where we do not check out the `msys2-runtime` but instead check out Cygwin and apply patches on top), let's accept a hard-coded commit hash as `./configure` option. One consequence is that spawned MSYS processes using a different MSYS2 runtime will not be visible as such to the parent process, i.e. they cannot share any resources such as pseudo terminals. But that's okay, they are simply treated as if they were regular Win32 programs. This should also help the scenario where interactions between two different versions of Git for Windows lead to those infamous `cygheap base mismatch detected` problems mentioned e.g. in git-for-windows/git#4255 Note: We have to use a very rare form of encoding the brackets in the `expr` calls: quadrigraphs (for a thorough explanation, see https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.70/html_node/Quadrigraphs.html#Quadrigraphs). This is necessary because it is apparently impossible in `configure.ac` files to encode brackets otherwise. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent 8a2855c commit f5f594c

File tree

4 files changed

+33
-2
lines changed

4 files changed

+33
-2
lines changed

winsup/configure.ac

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,34 @@ AC_CHECK_TOOL(RANLIB, ranlib, ranlib)
5757
AC_CHECK_TOOL(STRIP, strip, strip)
5858
AC_CHECK_TOOL(WINDRES, windres, windres)
5959

60+
# Record msys2-runtime commit
61+
AC_ARG_WITH([msys2-runtime-commit],
62+
[AS_HELP_STRING([--with-msys2-runtime-commit=COMMIT],
63+
[indicate the msys2-runtime commit corresponding to this build])],
64+
[MSYS2_RUNTIME_COMMIT=$withval], [MSYS2_RUNTIME_COMMIT=yes])
65+
case "$MSYS2_RUNTIME_COMMIT" in
66+
no)
67+
MSYS2_RUNTIME_COMMIT=
68+
MSYS2_RUNTIME_COMMIT_HEX=0
69+
;;
70+
yes|auto)
71+
if MSYS2_RUNTIME_COMMIT="$(git --git-dir="$srcdir/../.git" rev-parse HEAD)"
72+
then
73+
MSYS2_RUNTIME_COMMIT_HEX="0x$(expr "$MSYS2_RUNTIME_COMMIT" : '\(.\{,8\}\)')ull"
74+
else
75+
AC_MSG_WARN([Could not determine msys2-runtime commit"])
76+
MSYS2_RUNTIME_COMMIT=
77+
MSYS2_RUNTIME_COMMIT_HEX=0
78+
fi
79+
;;
80+
*)
81+
expr "$MSYS2_RUNTIME_COMMIT" : '@<:@0-9a-f@:>@\{6,64\}$' ||
82+
AC_MSG_ERROR([Invalid commit name: "$MSYS2_RUNTIME_COMMIT"])
83+
MSYS2_RUNTIME_COMMIT_HEX="0x$(expr "$MSYS2_RUNTIME_COMMIT" : '\(.\{,8\}\)')ull"
84+
;;
85+
esac
86+
AC_SUBST(MSYS2_RUNTIME_COMMIT_HEX)
87+
6088
AC_ARG_ENABLE(debugging,
6189
[ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging],
6290
[case "${enableval}" in

winsup/cygwin/Makefile.am

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ if TARGET_X86_64
1717
COMMON_CFLAGS+=-mcmodel=small
1818
endif
1919

20+
VERSION_CFLAGS = -DMSYS2_RUNTIME_COMMIT_HEX="@MSYS2_RUNTIME_COMMIT_HEX@"
21+
COMMON_CFLAGS += $(VERSION_CFLAGS)
22+
2023
AM_CFLAGS=$(cflags_common) $(COMMON_CFLAGS)
2124
AM_CXXFLAGS=$(cxxflags_common) $(COMMON_CFLAGS) -fno-threadsafe-statics
2225

winsup/cygwin/dcrt0.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ get_cygwin_startup_info ()
545545
child_info *res = (child_info *) si.lpReserved2;
546546

547547
if (si.cbReserved2 < EXEC_MAGIC_SIZE || !res
548-
|| res->intro != PROC_MAGIC_GENERIC || res->magic != (CHILD_INFO_MAGIC ^ CYGWIN_VERSION_DLL_COMBINED))
548+
|| res->intro != PROC_MAGIC_GENERIC || res->magic != (CHILD_INFO_MAGIC ^ MSYS2_RUNTIME_COMMIT_HEX))
549549
{
550550
strace.activate (false);
551551
res = NULL;

winsup/cygwin/sigproc.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ int child_info::retry_count = 0;
817817
by fork/spawn/exec. */
818818
child_info::child_info (unsigned in_cb, child_info_types chtype,
819819
bool need_subproc_ready):
820-
cb (in_cb), intro (PROC_MAGIC_GENERIC), magic (CHILD_INFO_MAGIC ^ CYGWIN_VERSION_DLL_COMBINED),
820+
cb (in_cb), intro (PROC_MAGIC_GENERIC), magic (CHILD_INFO_MAGIC ^ MSYS2_RUNTIME_COMMIT_HEX),
821821
type (chtype), cygheap (::cygheap), cygheap_max (::cygheap_max),
822822
flag (0), retry (child_info::retry_count), rd_proc_pipe (NULL),
823823
wr_proc_pipe (NULL), sigmask (_my_tls.sigmask)

0 commit comments

Comments
 (0)