mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-18 12:29:32 +08:00
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>
|
||||
|
||||
* exceptions.cc (__cont_link_context): x86_64: align stack and reserve
|
||||
|
@ -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*/
|
||||
|
||||
|
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)
|
||||
{
|
||||
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] = ':';
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
||||
* ldd.cc (STATUS_DLL_NOT_FOUND): Drop definition.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* strace.cc
|
||||
|
||||
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>
|
||||
|
||||
@ -26,6 +26,7 @@ details. */
|
||||
#include "../cygwin/include/sys/strace.h"
|
||||
#include "../cygwin/include/sys/cygwin.h"
|
||||
#include "../cygwin/include/cygwin/version.h"
|
||||
#include "../cygwin/cygtls_padsize.h"
|
||||
#include "path.h"
|
||||
#undef cygwin_internal
|
||||
#include "loadlib.h"
|
||||
@ -1025,7 +1026,7 @@ print_version ()
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
main2 (int argc, char **argv)
|
||||
{
|
||||
unsigned mask = 0;
|
||||
FILE *ofile = NULL;
|
||||
@ -1165,6 +1166,19 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr);
|
||||
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
|
||||
|
||||
static BOOL
|
||||
|
Loading…
x
Reference in New Issue
Block a user