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>
This commit is contained in:
parent
9753bc3333
commit
6ab56bdd3f
@ -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>
|
2015-07-23 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* exceptions.cc (__cont_link_context): x86_64: align stack and reserve
|
* exceptions.cc (__cont_link_context): x86_64: align stack and reserve
|
||||||
|
@ -271,12 +271,7 @@ private:
|
|||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
/* FIXME: Find some way to autogenerate this value */
|
#include "cygtls_padsize.h"
|
||||||
#ifdef __x86_64__
|
|
||||||
const int CYGTLS_PADSIZE = 12800; /* Must be 16-byte aligned */
|
|
||||||
#else
|
|
||||||
const int CYGTLS_PADSIZE = 12700;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*gentls_offsets*/
|
/*gentls_offsets*/
|
||||||
|
|
||||||
|
14
winsup/cygwin/cygtls_padsize.h
Normal file
14
winsup/cygwin/cygtls_padsize.h
Normal file
@ -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
|
@ -232,8 +232,7 @@ parse_options (const char *inbuf)
|
|||||||
switch (k->disposition)
|
switch (k->disposition)
|
||||||
{
|
{
|
||||||
case isfunc:
|
case isfunc:
|
||||||
k->setting.func ((!eq || !istrue) ?
|
k->setting.func ((!eq || !istrue) ? k->values[istrue].s : eq);
|
||||||
k->values[istrue].s : eq);
|
|
||||||
debug_printf ("%s (called func)", k->name);
|
debug_printf ("%s (called func)", k->name);
|
||||||
break;
|
break;
|
||||||
case setdword:
|
case setdword:
|
||||||
@ -258,10 +257,12 @@ parse_options (const char *inbuf)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int n = 0;
|
||||||
if (eq)
|
if (eq)
|
||||||
*--eq = ch;
|
{
|
||||||
|
*--eq = ch;
|
||||||
int n = eq - p;
|
n = eq - p;
|
||||||
|
}
|
||||||
p = strdup (keyword_here);
|
p = strdup (keyword_here);
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
p[n] = ':';
|
p[n] = ':';
|
||||||
|
@ -25,8 +25,10 @@ static bool dll_finished_loading;
|
|||||||
static void WINAPI
|
static void WINAPI
|
||||||
threadfunc_fe (VOID *arg)
|
threadfunc_fe (VOID *arg)
|
||||||
{
|
{
|
||||||
|
#ifndef __x86_64__
|
||||||
(void)__builtin_return_address(1);
|
(void)__builtin_return_address(1);
|
||||||
asm volatile ("andl $-16,%%esp" ::: "%esp");
|
asm volatile ("andl $-16,%%esp" ::: "%esp");
|
||||||
|
#endif
|
||||||
_cygtls::call ((DWORD (*) (void *, void *)) TlsGetValue (_my_oldfunc), arg);
|
_cygtls::call ((DWORD (*) (void *, void *)) TlsGetValue (_my_oldfunc), arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,3 +21,6 @@ Bug Fixes
|
|||||||
|
|
||||||
- Fix potential hang running ldd(1).
|
- Fix potential hang running ldd(1).
|
||||||
Addresses: https://cygwin.com/ml/cygwin/2015-07/msg00292.html
|
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
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2015-07-29 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* strace.cc (main2): Rename from main.
|
||||||
|
(main): Make room for _cygtls area on stack and just call main2. Add
|
||||||
|
comment to explain why.
|
||||||
|
|
||||||
2015-07-20 Corinna Vinschen <corinna@vinschen.de>
|
2015-07-20 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* ldd.cc (STATUS_DLL_NOT_FOUND): Drop definition.
|
* ldd.cc (STATUS_DLL_NOT_FOUND): Drop definition.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* strace.cc
|
/* strace.cc
|
||||||
|
|
||||||
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
||||||
2009, 2010, 2011, 2012, 2013 Red Hat Inc.
|
2009, 2010, 2011, 2012, 2013, 2015 Red Hat Inc.
|
||||||
|
|
||||||
Written by Chris Faylor <cgf@redhat.com>
|
Written by Chris Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
@ -26,6 +26,7 @@ details. */
|
|||||||
#include "../cygwin/include/sys/strace.h"
|
#include "../cygwin/include/sys/strace.h"
|
||||||
#include "../cygwin/include/sys/cygwin.h"
|
#include "../cygwin/include/sys/cygwin.h"
|
||||||
#include "../cygwin/include/cygwin/version.h"
|
#include "../cygwin/include/cygwin/version.h"
|
||||||
|
#include "../cygwin/cygtls_padsize.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#undef cygwin_internal
|
#undef cygwin_internal
|
||||||
#include "loadlib.h"
|
#include "loadlib.h"
|
||||||
@ -1025,7 +1026,7 @@ print_version ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main2 (int argc, char **argv)
|
||||||
{
|
{
|
||||||
unsigned mask = 0;
|
unsigned mask = 0;
|
||||||
FILE *ofile = NULL;
|
FILE *ofile = NULL;
|
||||||
@ -1165,6 +1166,19 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr);
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
/* Make sure to have room for the _cygtls area *and* to initialize it.
|
||||||
|
This is required to make sure cygwin_internal calls into Cygwin work
|
||||||
|
reliably. This problem has been noticed under AllocationPreference
|
||||||
|
registry setting to 0x100000 (TOP_DOWN). */
|
||||||
|
char buf[CYGTLS_PADSIZE];
|
||||||
|
|
||||||
|
memset (buf, 0, sizeof (buf));
|
||||||
|
exit (main2 (argc, argv));
|
||||||
|
}
|
||||||
|
|
||||||
#undef CloseHandle
|
#undef CloseHandle
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
|
Loading…
x
Reference in New Issue
Block a user