summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-07-29 13:32:29 +0200
committerCorinna Vinschen <corinna@vinschen.de>2015-07-29 13:32:29 +0200
commit6ab56bdd3f92982fcb9e7d093c3fd1b56c2b306f (patch)
tree5b2e82f0b7a5f36ae4451e0416fb8fabee626b0e /winsup/cygwin
parent9753bc33335b08426d6d85c5d833f40c5401c649 (diff)
downloadcygnal-6ab56bdd3f92982fcb9e7d093c3fd1b56c2b306f.tar.gz
cygnal-6ab56bdd3f92982fcb9e7d093c3fd1b56c2b306f.tar.bz2
cygnal-6ab56bdd3f92982fcb9e7d093c3fd1b56c2b306f.zip
cygwin: Fix crashes under AllocationPreference=0x100000 condition
* cygtls.h: Include cygtls_padsize.h and define CYGTLS_PADSIZE there. * cygtls_padsize.h: New file. Define CYGTLS_PADSIZE. * environ.cc (parse_options): Fix NULL pointer access. * init.cc (threadfunc_fe): Do not force stack align on x86_64. * strace.cc (main2): Rename from main. (main): Make room for _cygtls area on stack and just call main2. Add comment to explain why. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/cygtls.h7
-rw-r--r--winsup/cygwin/cygtls_padsize.h14
-rw-r--r--winsup/cygwin/environ.cc11
-rw-r--r--winsup/cygwin/init.cc2
-rw-r--r--winsup/cygwin/release/2.2.03
6 files changed, 33 insertions, 11 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index a8f654348..1fb4c79cd 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2015-07-29 Corinna Vinschen <corinna@vinschen.de>
+
+ * cygtls.h: Include cygtls_padsize.h and define CYGTLS_PADSIZE there.
+ * cygtls_padsize.h: New file. Define CYGTLS_PADSIZE.
+ * environ.cc (parse_options): Fix NULL pointer access.
+ * init.cc (threadfunc_fe): Do not force stack align on x86_64.
+
2015-07-23 Corinna Vinschen <corinna@vinschen.de>
* exceptions.cc (__cont_link_context): x86_64: align stack and reserve
diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h
index 91ed4d42f..c8615af70 100644
--- a/winsup/cygwin/cygtls.h
+++ b/winsup/cygwin/cygtls.h
@@ -271,12 +271,7 @@ private:
};
#pragma pack(pop)
-/* FIXME: Find some way to autogenerate this value */
-#ifdef __x86_64__
-const int CYGTLS_PADSIZE = 12800; /* Must be 16-byte aligned */
-#else
-const int CYGTLS_PADSIZE = 12700;
-#endif
+#include "cygtls_padsize.h"
/*gentls_offsets*/
diff --git a/winsup/cygwin/cygtls_padsize.h b/winsup/cygwin/cygtls_padsize.h
new file mode 100644
index 000000000..c1782c586
--- /dev/null
+++ b/winsup/cygwin/cygtls_padsize.h
@@ -0,0 +1,14 @@
+/* cygtls_padsize.h: Extra file to be included from utils.
+
+ Copyright 2015 Red Hat, Inc.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+/* FIXME: Find some way to autogenerate this value */
+#ifdef __x86_64__
+const int CYGTLS_PADSIZE = 12800; /* Must be 16-byte aligned */
+#else
+const int CYGTLS_PADSIZE = 12700;
+#endif
diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc
index d210504a2..8f25fb19e 100644
--- a/winsup/cygwin/environ.cc
+++ b/winsup/cygwin/environ.cc
@@ -232,8 +232,7 @@ parse_options (const char *inbuf)
switch (k->disposition)
{
case isfunc:
- k->setting.func ((!eq || !istrue) ?
- k->values[istrue].s : eq);
+ k->setting.func ((!eq || !istrue) ? k->values[istrue].s : eq);
debug_printf ("%s (called func)", k->name);
break;
case setdword:
@@ -258,10 +257,12 @@ parse_options (const char *inbuf)
break;
}
+ int n = 0;
if (eq)
- *--eq = ch;
-
- int n = eq - p;
+ {
+ *--eq = ch;
+ n = eq - p;
+ }
p = strdup (keyword_here);
if (n > 0)
p[n] = ':';
diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc
index 78e88b94b..0e8b1bae3 100644
--- a/winsup/cygwin/init.cc
+++ b/winsup/cygwin/init.cc
@@ -25,8 +25,10 @@ static bool dll_finished_loading;
static void WINAPI
threadfunc_fe (VOID *arg)
{
+#ifndef __x86_64__
(void)__builtin_return_address(1);
asm volatile ("andl $-16,%%esp" ::: "%esp");
+#endif
_cygtls::call ((DWORD (*) (void *, void *)) TlsGetValue (_my_oldfunc), arg);
}
diff --git a/winsup/cygwin/release/2.2.0 b/winsup/cygwin/release/2.2.0
index c34888f95..5d8cdd0b2 100644
--- a/winsup/cygwin/release/2.2.0
+++ b/winsup/cygwin/release/2.2.0
@@ -21,3 +21,6 @@ Bug Fixes
- Fix potential hang running ldd(1).
Addresses: https://cygwin.com/ml/cygwin/2015-07/msg00292.html
+
+- Fix crashes under AllocationPreference=0x100000 condition
+ Addresses: https://cygwin.com/ml/cygwin/2015-02/msg00765.html