diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-07-29 13:32:29 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-07-29 13:32:29 +0200 |
commit | 6ab56bdd3f92982fcb9e7d093c3fd1b56c2b306f (patch) | |
tree | 5b2e82f0b7a5f36ae4451e0416fb8fabee626b0e /winsup/cygwin | |
parent | 9753bc33335b08426d6d85c5d833f40c5401c649 (diff) | |
download | cygnal-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/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/cygwin/cygtls.h | 7 | ||||
-rw-r--r-- | winsup/cygwin/cygtls_padsize.h | 14 | ||||
-rw-r--r-- | winsup/cygwin/environ.cc | 11 | ||||
-rw-r--r-- | winsup/cygwin/init.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/release/2.2.0 | 3 |
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 |