You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Added patch to avoid stack protector frame in signal handler functions.
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
From b27c92f6d5f212307e291eac1b2abd376399366c Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 20 Aug 2017 17:22:20 +0200
|
||||
Subject: ntdll: Avoid stack protector frame in signal handler functions.
|
||||
|
||||
---
|
||||
dlls/ntdll/signal_i386.c | 31 +++++++++++++++++++------------
|
||||
1 file changed, 19 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
|
||||
index c46d50eb271..8a637f23825 100644
|
||||
--- a/dlls/ntdll/signal_i386.c
|
||||
+++ b/dlls/ntdll/signal_i386.c
|
||||
@@ -96,6 +96,13 @@ typedef struct
|
||||
BYTE Reserved4[96];
|
||||
} XMM_SAVE_AREA32;
|
||||
|
||||
+#ifdef __GNUC__
|
||||
+/* It is not valid to access %gs before init_handler has been called. */
|
||||
+#define SIGNALFUNC __attribute__((__optimize__("-fno-stack-protector")))
|
||||
+#else
|
||||
+#define SIGNALFUNC
|
||||
+#endif
|
||||
+
|
||||
/***********************************************************************
|
||||
* signal context platform-specific definitions
|
||||
*/
|
||||
@@ -663,7 +670,7 @@ static inline void *get_signal_stack(void)
|
||||
*
|
||||
* Get the current teb based on the stack pointer.
|
||||
*/
|
||||
-static inline TEB *get_current_teb(void)
|
||||
+static inline TEB * SIGNALFUNC get_current_teb(void)
|
||||
{
|
||||
unsigned long esp;
|
||||
__asm__("movl %%esp,%0" : "=g" (esp) );
|
||||
@@ -1023,7 +1030,7 @@ __ASM_GLOBAL_FUNC( clear_alignment_flag,
|
||||
* Handler initialization when the full context is not needed.
|
||||
* Return the stack pointer to use for pushing the exception data.
|
||||
*/
|
||||
-static inline void *init_handler( const ucontext_t *sigcontext, WORD *fs, WORD *gs )
|
||||
+static inline void * SIGNALFUNC init_handler( const ucontext_t *sigcontext, WORD *fs, WORD *gs )
|
||||
{
|
||||
TEB *teb = get_current_teb();
|
||||
|
||||
@@ -2032,7 +2039,7 @@ static EXCEPTION_RECORD *setup_exception_record( ucontext_t *sigcontext, void *s
|
||||
* sigcontext so that the return from the signal handler will call
|
||||
* the raise function.
|
||||
*/
|
||||
-static EXCEPTION_RECORD *setup_exception( ucontext_t *sigcontext, raise_func func )
|
||||
+static EXCEPTION_RECORD * SIGNALFUNC setup_exception( ucontext_t *sigcontext, raise_func func )
|
||||
{
|
||||
WORD fs, gs;
|
||||
void *stack = init_handler( sigcontext, &fs, &gs );
|
||||
@@ -2231,7 +2238,7 @@ done:
|
||||
* immediately set VIP_FLAG, causing pending events to be handled
|
||||
* as early as possible.
|
||||
*/
|
||||
-static void usr2_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC usr2_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
EXCEPTION_RECORD *rec = setup_exception( sigcontext, raise_vm86_sti_exception );
|
||||
rec->ExceptionCode = EXCEPTION_VM86_STI;
|
||||
@@ -2245,7 +2252,7 @@ static void usr2_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
* Handler for SIGSEGV and related errors. Used only during the initialization
|
||||
* of the process to handle virtual faults.
|
||||
*/
|
||||
-static void segv_handler_early( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC segv_handler_early( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
WORD fs, gs;
|
||||
ucontext_t *context = sigcontext;
|
||||
@@ -2269,7 +2276,7 @@ static void segv_handler_early( int signal, siginfo_t *siginfo, void *sigcontext
|
||||
*
|
||||
* Handler for SIGSEGV and related errors.
|
||||
*/
|
||||
-static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
WORD fs, gs;
|
||||
EXCEPTION_RECORD *rec;
|
||||
@@ -2363,7 +2370,7 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
*
|
||||
* Handler for SIGTRAP.
|
||||
*/
|
||||
-static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
ucontext_t *context = sigcontext;
|
||||
EXCEPTION_RECORD *rec = setup_exception( context, raise_trap_exception );
|
||||
@@ -2392,7 +2399,7 @@ static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
*
|
||||
* Handler for SIGFPE.
|
||||
*/
|
||||
-static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
CONTEXT *win_context;
|
||||
ucontext_t *context = sigcontext;
|
||||
@@ -2441,7 +2448,7 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
*
|
||||
* FIXME: should not be calling external functions on the signal stack.
|
||||
*/
|
||||
-static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
WORD fs, gs;
|
||||
init_handler( sigcontext, &fs, &gs );
|
||||
@@ -2457,7 +2464,7 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
*
|
||||
* Handler for SIGABRT.
|
||||
*/
|
||||
-static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
EXCEPTION_RECORD *rec = setup_exception( sigcontext, raise_generic_exception );
|
||||
rec->ExceptionCode = EXCEPTION_WINE_ASSERTION;
|
||||
@@ -2470,7 +2477,7 @@ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
*
|
||||
* Handler for SIGQUIT.
|
||||
*/
|
||||
-static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC quit_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
WORD fs, gs;
|
||||
init_handler( sigcontext, &fs, &gs );
|
||||
@@ -2483,7 +2490,7 @@ static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
*
|
||||
* Handler for SIGUSR1, used to signal a thread that it got suspended.
|
||||
*/
|
||||
-static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
+static void SIGNALFUNC usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||
{
|
||||
CONTEXT context;
|
||||
WORD fs, gs;
|
||||
--
|
||||
2.14.1
|
||||
|
1
patches/ntdll-Signal_Handler/definition
Normal file
1
patches/ntdll-Signal_Handler/definition
Normal file
@@ -0,0 +1 @@
|
||||
Depends: ntdll-WRITECOPY
|
Reference in New Issue
Block a user