mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-09-13 09:17:20 -07:00
Rebase against f5bd0be6a44c1c7d69afb8b8eb6311923e7762a1.
This commit is contained in:
parent
08912e4896
commit
e3cca687be
@ -1,4 +1,4 @@
|
||||
From 39109644ddeb39a7a42c2f10657b35c515dfee46 Mon Sep 17 00:00:00 2001
|
||||
From 52c6ab47d908e75409bb3b7f2faac66da16ea23a Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <zfigura@codeweavers.com>
|
||||
Date: Mon, 6 Jul 2020 17:17:31 -0500
|
||||
Subject: [PATCH] ntdll, server: Implement alertable waits.
|
||||
@ -164,22 +164,22 @@ index d1a282c65e9..2a7c3865617 100644
|
||||
|
||||
/* We need to let the server know when we are doing a message wait, and when we
|
||||
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
|
||||
index a5bade02b8a..76eef4220c5 100644
|
||||
index f6934ae9e91..c3ad33e282b 100644
|
||||
--- a/dlls/ntdll/unix/unix_private.h
|
||||
+++ b/dlls/ntdll/unix/unix_private.h
|
||||
@@ -53,6 +53,7 @@ struct ntdll_thread_data
|
||||
@@ -61,6 +61,7 @@ struct ntdll_thread_data
|
||||
void *cpu_data[16]; /* reserved for CPU-specific data */
|
||||
struct debug_info *debug_info; /* info for debugstr functions */
|
||||
void *start_stack; /* stack for thread startup */
|
||||
void *kernel_stack; /* stack for thread startup and kernel syscalls */
|
||||
+ int esync_apc_fd; /* fd to wait on for user APCs */
|
||||
int request_fd; /* fd for sending server requests */
|
||||
int reply_fd; /* fd for receiving server replies */
|
||||
int wait_fd[2]; /* fd for sleeping server requests */
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index f3e6b612b93..04c31a473af 100644
|
||||
index 422be6d8a73..1ff97ed5129 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -2876,6 +2876,7 @@ static TEB *init_teb( void *ptr, PEB *peb )
|
||||
@@ -2888,6 +2888,7 @@ static TEB *init_teb( void *ptr, PEB *peb, BOOL is_wow )
|
||||
teb->StaticUnicodeString.Buffer = teb->StaticUnicodeBuffer;
|
||||
teb->StaticUnicodeString.MaximumLength = sizeof(teb->StaticUnicodeBuffer);
|
||||
thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
|
||||
@ -244,10 +244,10 @@ index aeb58c5469c..cea025d9308 100644
|
||||
void esync_clear( int fd );
|
||||
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index 00c89cce793..bb45c509685 100644
|
||||
index 14558f2d842..fad731bdc74 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -3738,3 +3738,7 @@ enum esync_type
|
||||
@@ -3794,3 +3794,7 @@ enum esync_type
|
||||
@REQ(esync_msgwait)
|
||||
int in_msgwait; /* are we in a message wait? */
|
||||
@END
|
||||
@ -256,10 +256,10 @@ index 00c89cce793..bb45c509685 100644
|
||||
+@REQ(get_esync_apc_fd)
|
||||
+@END
|
||||
diff --git a/server/thread.c b/server/thread.c
|
||||
index 409a28129b3..e4781e57c8c 100644
|
||||
index 10da1e3d4c7..258c3f28815 100644
|
||||
--- a/server/thread.c
|
||||
+++ b/server/thread.c
|
||||
@@ -227,6 +227,7 @@ static inline void init_thread_structure( struct thread *thread )
|
||||
@@ -228,6 +228,7 @@ static inline void init_thread_structure( struct thread *thread )
|
||||
thread->teb = 0;
|
||||
thread->entry_point = 0;
|
||||
thread->esync_fd = -1;
|
||||
@ -267,7 +267,7 @@ index 409a28129b3..e4781e57c8c 100644
|
||||
thread->system_regs = 0;
|
||||
thread->queue = NULL;
|
||||
thread->wait = NULL;
|
||||
@@ -374,7 +375,10 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
|
||||
@@ -375,7 +376,10 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
|
||||
}
|
||||
|
||||
if (do_esync())
|
||||
@ -278,7 +278,7 @@ index 409a28129b3..e4781e57c8c 100644
|
||||
|
||||
set_fd_events( thread->request_fd, POLLIN ); /* start listening to events */
|
||||
add_process_thread( thread->process, thread );
|
||||
@@ -1156,8 +1160,13 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
|
||||
@@ -1164,8 +1168,13 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
|
||||
grab_object( apc );
|
||||
list_add_tail( queue, &apc->entry );
|
||||
if (!list_prev( queue, &apc->entry )) /* first one */
|
||||
@ -292,7 +292,7 @@ index 409a28129b3..e4781e57c8c 100644
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1203,6 +1212,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
|
||||
@@ -1211,6 +1220,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
|
||||
apc = LIST_ENTRY( ptr, struct thread_apc, entry );
|
||||
list_remove( ptr );
|
||||
}
|
||||
@ -304,7 +304,7 @@ index 409a28129b3..e4781e57c8c 100644
|
||||
}
|
||||
|
||||
diff --git a/server/thread.h b/server/thread.h
|
||||
index 1eb501cbd52..13e4628d89a 100644
|
||||
index 8a5a8501d9c..e5145f9eb07 100644
|
||||
--- a/server/thread.h
|
||||
+++ b/server/thread.h
|
||||
@@ -55,6 +55,7 @@ struct thread
|
||||
|
@ -1,114 +0,0 @@
|
||||
From 99640ba7474a35f086d85bdb0b416e1e00d31c2f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Fri, 10 Apr 2015 07:51:16 +0200
|
||||
Subject: [PATCH] msvcrt: Calculate sinh/cosh/exp/pow with higher precision.
|
||||
(v2)
|
||||
|
||||
Based on a patch by Zheng Chen.
|
||||
---
|
||||
dlls/msvcrt/unixlib.c | 63 ++++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 59 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/msvcrt/unixlib.c b/dlls/msvcrt/unixlib.c
|
||||
index 6d3a3bd5a79..e0581f713cd 100644
|
||||
--- a/dlls/msvcrt/unixlib.c
|
||||
+++ b/dlls/msvcrt/unixlib.c
|
||||
@@ -42,12 +42,67 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
|
||||
|
||||
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
||||
+
|
||||
+static inline double precise_cosh( double x )
|
||||
+{
|
||||
+ WORD precise_cw = 0x37f, pre_cw;
|
||||
+ double z;
|
||||
+ __asm__ __volatile__( "fnstcw %0" : "=m" (pre_cw) );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (precise_cw) );
|
||||
+ z = cosh( x );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (pre_cw) );
|
||||
+ return z;
|
||||
+}
|
||||
+
|
||||
+static inline double precise_exp( double x )
|
||||
+{
|
||||
+ WORD precise_cw = 0x37f, pre_cw;
|
||||
+ double z;
|
||||
+ __asm__ __volatile__( "fnstcw %0" : "=m" (pre_cw) );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (precise_cw) );
|
||||
+ z = exp( x );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (pre_cw) );
|
||||
+ return z;
|
||||
+}
|
||||
+
|
||||
+static inline double precise_pow( double x, double y )
|
||||
+{
|
||||
+ WORD precise_cw = 0x37f, pre_cw;
|
||||
+ double z;
|
||||
+ __asm__ __volatile__( "fnstcw %0" : "=m" (pre_cw) );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (precise_cw) );
|
||||
+ z = pow( x, y );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (pre_cw) );
|
||||
+ return z;
|
||||
+}
|
||||
+
|
||||
+static inline double precise_sinh( double x )
|
||||
+{
|
||||
+ WORD precise_cw = 0x37f, pre_cw;
|
||||
+ double z;
|
||||
+ __asm__ __volatile__( "fnstcw %0" : "=m" (pre_cw) );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (precise_cw) );
|
||||
+ z = sinh( x );
|
||||
+ __asm__ __volatile__( "fldcw %0" : : "m" (pre_cw) );
|
||||
+ return z;
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+#define precise_cosh cosh
|
||||
+#define precise_exp exp
|
||||
+#define precise_pow pow
|
||||
+#define precise_sinh sinh
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
/*********************************************************************
|
||||
* cosh
|
||||
*/
|
||||
static double CDECL unix_cosh( double x )
|
||||
{
|
||||
- return cosh( x );
|
||||
+ return precise_cosh( x );
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
@@ -63,7 +118,7 @@ static float CDECL unix_coshf( float x )
|
||||
*/
|
||||
static double CDECL unix_exp( double x )
|
||||
{
|
||||
- return exp( x );
|
||||
+ return precise_exp( x );
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
@@ -297,7 +352,7 @@ static float CDECL unix_log2f(float x)
|
||||
*/
|
||||
static double CDECL unix_pow( double x, double y )
|
||||
{
|
||||
- return pow( x, y );
|
||||
+ return precise_pow( x, y );
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
@@ -313,7 +368,7 @@ static float CDECL unix_powf( float x, float y )
|
||||
*/
|
||||
static double CDECL unix_sinh( double x )
|
||||
{
|
||||
- return sinh( x );
|
||||
+ return precise_sinh( x );
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
--
|
||||
2.30.2
|
||||
|
@ -1,3 +0,0 @@
|
||||
Fixes: [37149] Calculate msvcrt exponential math operations with higher precision
|
||||
# Needs retesting when exp() and pow() are moved as well.
|
||||
Disabled: true
|
@ -1,56 +0,0 @@
|
||||
From 1d56beba1aeb7acb135db5333c2f61f40988b23f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Fri, 21 Aug 2015 06:39:47 +0800
|
||||
Subject: [PATCH] ntdll: Do not allow to deallocate thread stack for current
|
||||
thread.
|
||||
|
||||
---
|
||||
dlls/ntdll/unix/unix_private.h | 1 +
|
||||
dlls/ntdll/unix/virtual.c | 12 ++++++++++++
|
||||
2 files changed, 13 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
|
||||
index 0714d9ff898..5ea9664edcf 100644
|
||||
--- a/dlls/ntdll/unix/unix_private.h
|
||||
+++ b/dlls/ntdll/unix/unix_private.h
|
||||
@@ -58,6 +58,7 @@ struct ntdll_thread_data
|
||||
int reply_fd; /* fd for receiving server replies */
|
||||
int wait_fd[2]; /* fd for sleeping server requests */
|
||||
pthread_t pthread_id; /* pthread thread id */
|
||||
+ void *pthread_stack; /* pthread stack */
|
||||
struct list entry; /* entry in TEB list */
|
||||
PRTL_THREAD_START_ROUTINE start; /* thread entry point */
|
||||
void *param; /* thread entry point parameter */
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index 9b1ca761e9b..cb5db2891c6 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -2804,6 +2804,8 @@ NTSTATUS virtual_alloc_thread_stack( INITIAL_TEB *stack, SIZE_T reserve_size, SI
|
||||
stack->DeallocationStack = view->base;
|
||||
stack->StackBase = (char *)view->base + view->size;
|
||||
stack->StackLimit = (char *)view->base + 2 * page_size;
|
||||
+ ((struct ntdll_thread_data *)&NtCurrentTeb()->GdiTebBatch)->pthread_stack = view->base;
|
||||
+
|
||||
done:
|
||||
server_leave_uninterrupted_section( &virtual_mutex, &sigset );
|
||||
return status;
|
||||
@@ -3594,6 +3596,16 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si
|
||||
/* Free the pages */
|
||||
|
||||
if (size || (base != view->base)) status = STATUS_INVALID_PARAMETER;
|
||||
+ else if (view->base == (void *)((ULONG_PTR)ntdll_get_thread_data()->pthread_stack & ~1))
|
||||
+ {
|
||||
+ ULONG_PTR stack = (ULONG_PTR)ntdll_get_thread_data()->pthread_stack;
|
||||
+ if (stack & 1) status = STATUS_INVALID_PARAMETER;
|
||||
+ else
|
||||
+ {
|
||||
+ WARN( "Application tried to deallocate current pthread stack %p, deferring\n", view->base);
|
||||
+ ntdll_get_thread_data()->pthread_stack = (void *)(stack | 1);
|
||||
+ }
|
||||
+ }
|
||||
else
|
||||
{
|
||||
delete_view( view );
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1 +0,0 @@
|
||||
Fixes: Do not allow to deallocate thread stack for current thread
|
@ -1,4 +1,4 @@
|
||||
From 8d1cfce5ceee03b91f9843e7b5123fed823687e7 Mon Sep 17 00:00:00 2001
|
||||
From 7744cca9f58990ee47b74f4fa967eb99f3dee862 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Tue, 14 Jul 2020 15:00:34 +0300
|
||||
Subject: [PATCH] ntdll: Support x86_64 syscall emulation.
|
||||
@ -10,10 +10,10 @@ Subject: [PATCH] ntdll: Support x86_64 syscall emulation.
|
||||
3 files changed, 120 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index caff5d1fe52..d30b437320a 100644
|
||||
index 8c74532dabc..36d2295c1ca 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -467,6 +467,7 @@ AC_CHECK_HEADERS(\
|
||||
@@ -477,6 +477,7 @@ AC_CHECK_HEADERS(\
|
||||
linux/joystick.h \
|
||||
linux/major.h \
|
||||
linux/param.h \
|
||||
@ -22,7 +22,7 @@ index caff5d1fe52..d30b437320a 100644
|
||||
linux/types.h \
|
||||
linux/ucdrom.h \
|
||||
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
|
||||
index 8d3353e959d..a8a142c2ab1 100644
|
||||
index 4845d3dd5f4..9a80cafeadd 100644
|
||||
--- a/dlls/ntdll/unix/signal_x86_64.c
|
||||
+++ b/dlls/ntdll/unix/signal_x86_64.c
|
||||
@@ -28,6 +28,7 @@
|
||||
@ -47,7 +47,7 @@ index 8d3353e959d..a8a142c2ab1 100644
|
||||
#define NONAMELESSUNION
|
||||
#define NONAMELESSSTRUCT
|
||||
#include "ntstatus.h"
|
||||
@@ -2292,6 +2300,114 @@ static inline DWORD is_privileged_instr( CONTEXT *context )
|
||||
@@ -2075,6 +2083,114 @@ static inline DWORD is_privileged_instr( CONTEXT *context )
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -162,7 +162,7 @@ index 8d3353e959d..a8a142c2ab1 100644
|
||||
|
||||
/***********************************************************************
|
||||
* handle_interrupt
|
||||
@@ -2751,6 +2867,7 @@ void signal_init_process(void)
|
||||
@@ -2560,6 +2676,7 @@ void signal_init_process(void)
|
||||
if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error;
|
||||
if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error;
|
||||
if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error;
|
||||
@ -171,18 +171,18 @@ index 8d3353e959d..a8a142c2ab1 100644
|
||||
|
||||
error:
|
||||
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
|
||||
index 0fddbaf6134..901423cc028 100644
|
||||
index f92c1b89c9c..13e1a3bb929 100644
|
||||
--- a/tools/winebuild/import.c
|
||||
+++ b/tools/winebuild/import.c
|
||||
@@ -1510,6 +1510,7 @@ static void output_syscall_dispatcher( int count, const char *variant )
|
||||
/* Legends of Runeterra hooks the first system call return instruction, and
|
||||
* depends on us returning to it. Adjust the return address accordingly. */
|
||||
output( "\tsubq $0xb,0x8(%%rbp)\n" );
|
||||
@@ -1551,6 +1551,7 @@ static void output_syscall_dispatcher(void)
|
||||
output( "\tjmp 5b\n" );
|
||||
break;
|
||||
case CPU_x86_64:
|
||||
+ output( "\tsubq $0xf000,%%rax\n" );
|
||||
output( "\tmovq 0x8(%%rbp),%%rbx\n" );
|
||||
output( "\tmovq %%rbx,-0x28(%%rbp)\n" );
|
||||
output( "\tleaq 0x10(%%rbp),%%rbx\n" );
|
||||
@@ -1779,7 +1780,7 @@ void output_syscalls( DLLSPEC *spec )
|
||||
output( "\tmovq %%gs:0x30,%%rcx\n" );
|
||||
output( "\tmovq 0x328(%%rcx),%%rcx\n" ); /* amd64_thread_data()->syscall_frame */
|
||||
output( "\tmovq %%rax,0x00(%%rcx)\n" );
|
||||
@@ -1940,7 +1941,7 @@ void output_syscalls( DLLSPEC *spec )
|
||||
* validate that instruction, we can just put a jmp there instead. */
|
||||
output( "\t.byte 0x4c,0x8b,0xd1\n" ); /* movq %rcx,%r10 */
|
||||
output( "\t.byte 0xb8\n" ); /* movl $i,%eax */
|
||||
@ -192,5 +192,5 @@ index 0fddbaf6134..901423cc028 100644
|
||||
output( "\t.byte 0x75,0x03\n" ); /* jne 1f */
|
||||
output( "\t.byte 0x0f,0x05\n" ); /* syscall */
|
||||
--
|
||||
2.20.1
|
||||
2.30.2
|
||||
|
||||
|
@ -1,81 +0,0 @@
|
||||
From ef57b2c7cadda78730cb57e117507c7a8a0ff6cb Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Wed, 13 Apr 2016 03:11:03 +0200
|
||||
Subject: ntdll: Use a separate stack when starting new threads.
|
||||
|
||||
---
|
||||
dlls/ntdll/thread.c | 33 +++++++++++++++++++++++----------
|
||||
1 file changed, 23 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index 07dc285..db27447 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
+#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_MMAN_H
|
||||
#include <sys/mman.h>
|
||||
@@ -452,15 +453,8 @@ void exit_thread( int status )
|
||||
static void start_thread( struct startup_info *info )
|
||||
{
|
||||
TEB *teb = info->teb;
|
||||
- struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1;
|
||||
PRTL_THREAD_START_ROUTINE func = info->entry_point;
|
||||
void *arg = info->entry_arg;
|
||||
- struct debug_info debug_info;
|
||||
-
|
||||
- debug_info.str_pos = debug_info.strings;
|
||||
- debug_info.out_pos = debug_info.output;
|
||||
- thread_data->debug_info = &debug_info;
|
||||
- thread_data->pthread_id = pthread_self();
|
||||
|
||||
signal_init_thread( teb );
|
||||
server_init_thread( func );
|
||||
@@ -476,6 +470,26 @@ static void start_thread( struct startup_info *info )
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
+ * call_start_thread
|
||||
+ *
|
||||
+ * Setup debug_info struct and call start_thread on target stack.
|
||||
+ */
|
||||
+static void call_start_thread( struct startup_info *info )
|
||||
+{
|
||||
+ TEB *teb = info->teb;
|
||||
+ struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1;
|
||||
+ struct debug_info debug_info;
|
||||
+
|
||||
+ debug_info.str_pos = debug_info.strings;
|
||||
+ debug_info.out_pos = debug_info.output;
|
||||
+ thread_data->debug_info = &debug_info;
|
||||
+ thread_data->pthread_id = pthread_self();
|
||||
+
|
||||
+ wine_switch_to_stack( (void (*)(void *))start_thread, info, teb->Tib.StackBase );
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/***********************************************************************
|
||||
* RtlCreateUserThread (NTDLL.@)
|
||||
*/
|
||||
NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *descr,
|
||||
@@ -581,11 +595,10 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
|
||||
if ((status = virtual_alloc_thread_stack( teb, stack_reserve, stack_commit ))) goto error;
|
||||
|
||||
pthread_attr_init( &attr );
|
||||
- pthread_attr_setstack( &attr, teb->DeallocationStack,
|
||||
- (char *)teb->Tib.StackBase - (char *)teb->DeallocationStack );
|
||||
+ pthread_attr_setstacksize( &attr, PTHREAD_STACK_MIN );
|
||||
pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM ); /* force creating a kernel thread */
|
||||
interlocked_xchg_add( &nb_threads, 1 );
|
||||
- if (pthread_create( &pthread_id, &attr, (void * (*)(void *))start_thread, info ))
|
||||
+ if (pthread_create( &pthread_id, &attr, (void * (*)(void *))call_start_thread, info ))
|
||||
{
|
||||
interlocked_xchg_add( &nb_threads, -1 );
|
||||
pthread_attr_destroy( &attr );
|
||||
--
|
||||
2.7.1
|
||||
|
@ -1,81 +0,0 @@
|
||||
From 15ef836edec8fa90f4d02d15d6b071439a65b855 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Wed, 13 Apr 2016 06:49:03 +0200
|
||||
Subject: ntdll: Ignore invalid exit_frame when exiting thread.
|
||||
|
||||
---
|
||||
dlls/ntdll/signal_i386.c | 16 ++++++++++++++++
|
||||
dlls/ntdll/signal_x86_64.c | 16 ++++++++++++++++
|
||||
2 files changed, 32 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
|
||||
index 9834c9f..8c09758 100644
|
||||
--- a/dlls/ntdll/signal_i386.c
|
||||
+++ b/dlls/ntdll/signal_i386.c
|
||||
@@ -2832,6 +2832,14 @@ void call_thread_func( LPTHREAD_START_ROUTINE entry, void *arg, void *frame )
|
||||
void WINAPI RtlExitUserThread( ULONG status )
|
||||
{
|
||||
if (!ntdll_get_thread_data()->exit_frame) exit_thread( status );
|
||||
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
|
||||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
|
||||
+ {
|
||||
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
|
||||
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
|
||||
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
+ exit_thread( status );
|
||||
+ }
|
||||
call_thread_exit_func( status, exit_thread, ntdll_get_thread_data()->exit_frame );
|
||||
}
|
||||
|
||||
@@ -2841,6 +2849,14 @@ void WINAPI RtlExitUserThread( ULONG status )
|
||||
void abort_thread( int status )
|
||||
{
|
||||
if (!ntdll_get_thread_data()->exit_frame) terminate_thread( status );
|
||||
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
|
||||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
|
||||
+ {
|
||||
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
|
||||
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
|
||||
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
+ terminate_thread( status );
|
||||
+ }
|
||||
call_thread_exit_func( status, terminate_thread, ntdll_get_thread_data()->exit_frame );
|
||||
}
|
||||
|
||||
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
|
||||
index 93475d54..ffbb0f0 100644
|
||||
--- a/dlls/ntdll/signal_x86_64.c
|
||||
+++ b/dlls/ntdll/signal_x86_64.c
|
||||
@@ -3831,6 +3831,14 @@ __ASM_GLOBAL_FUNC( call_thread_exit_func,
|
||||
void WINAPI RtlExitUserThread( ULONG status )
|
||||
{
|
||||
if (!ntdll_get_thread_data()->exit_frame) exit_thread( status );
|
||||
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
|
||||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
|
||||
+ {
|
||||
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
|
||||
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
|
||||
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
+ exit_thread( status );
|
||||
+ }
|
||||
call_thread_exit_func( status, exit_thread, ntdll_get_thread_data()->exit_frame );
|
||||
}
|
||||
|
||||
@@ -3840,6 +3848,14 @@ void WINAPI RtlExitUserThread( ULONG status )
|
||||
void abort_thread( int status )
|
||||
{
|
||||
if (!ntdll_get_thread_data()->exit_frame) terminate_thread( status );
|
||||
+ if (ntdll_get_thread_data()->exit_frame <= NtCurrentTeb()->DeallocationStack ||
|
||||
+ ntdll_get_thread_data()->exit_frame > NtCurrentTeb()->Tib.StackBase)
|
||||
+ {
|
||||
+ WARN( "exit frame outside of stack limits in thread %04x frame %p stack %p-%p\n",
|
||||
+ GetCurrentThreadId(), ntdll_get_thread_data()->exit_frame,
|
||||
+ NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
|
||||
+ terminate_thread( status );
|
||||
+ }
|
||||
call_thread_exit_func( status, terminate_thread, ntdll_get_thread_data()->exit_frame );
|
||||
}
|
||||
|
||||
--
|
||||
2.7.1
|
||||
|
@ -1,3 +0,0 @@
|
||||
Fixes: Use a separate stack when starting new threads
|
||||
Fixes: Ignore invalid exit_frame when exiting thread
|
||||
Disabled: true
|
@ -51,7 +51,7 @@ usage()
|
||||
# Get the upstream commit sha
|
||||
upstream_commit()
|
||||
{
|
||||
echo "2a505efb1ca14f33503657eb070de6edd484b4f3"
|
||||
echo "f5bd0be6a44c1c7d69afb8b8eb6311923e7762a1"
|
||||
}
|
||||
|
||||
# Show version information
|
||||
@ -150,7 +150,6 @@ patch_enable_all ()
|
||||
enable_ntdll_Builtin_Prot="$1"
|
||||
enable_ntdll_CriticalSection="$1"
|
||||
enable_ntdll_DOS_Attributes="$1"
|
||||
enable_ntdll_Dealloc_Thread_Stack="$1"
|
||||
enable_ntdll_Exception="$1"
|
||||
enable_ntdll_FileDispositionInformation="$1"
|
||||
enable_ntdll_FileFsFullSizeInformation="$1"
|
||||
@ -497,9 +496,6 @@ patch_enable ()
|
||||
ntdll-DOS_Attributes)
|
||||
enable_ntdll_DOS_Attributes="$2"
|
||||
;;
|
||||
ntdll-Dealloc_Thread_Stack)
|
||||
enable_ntdll_Dealloc_Thread_Stack="$2"
|
||||
;;
|
||||
ntdll-Exception)
|
||||
enable_ntdll_Exception="$2"
|
||||
;;
|
||||
@ -2628,15 +2624,6 @@ if test "$enable_ntdll_CriticalSection" -eq 1; then
|
||||
patch_apply ntdll-CriticalSection/0004-ntdll-Use-fast-CS-functions-for-threadpool-locking.patch
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Dealloc_Thread_Stack
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/unix/unix_private.h, dlls/ntdll/unix/virtual.c
|
||||
# |
|
||||
if test "$enable_ntdll_Dealloc_Thread_Stack" -eq 1; then
|
||||
patch_apply ntdll-Dealloc_Thread_Stack/0001-ntdll-Do-not-allow-to-allocate-thread-stack-for-curr.patch
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Exception
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
|
@ -1 +1 @@
|
||||
2a505efb1ca14f33503657eb070de6edd484b4f3
|
||||
f5bd0be6a44c1c7d69afb8b8eb6311923e7762a1
|
||||
|
Loading…
Reference in New Issue
Block a user