From 13fbba6847713cc1a8d43051f998323fee9865af Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 8 Jul 2008 20:54:40 +0200 Subject: [PATCH] ntdll: Always restore the %gs register from the saved value in thread data. --- dlls/ntdll/signal_i386.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 4351844328e..4e0c5fad467 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -582,10 +582,10 @@ typedef void (WINAPI *raise_func)( EXCEPTION_RECORD *rec, CONTEXT *context ); * init_handler * * 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 SIGCONTEXT *sigcontext, WORD *fs, WORD *gs ) { - void *stack = (void *)(ESP_sig(sigcontext) & ~3); TEB *teb = get_current_teb(); struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SystemReserved2; @@ -602,8 +602,8 @@ static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD * #endif wine_set_fs( thread_data->fs ); + wine_set_gs( thread_data->gs ); - /* now restore a proper %gs for the fault handler */ if (!wine_ldt_is_system(CS_sig(sigcontext)) || !wine_ldt_is_system(SS_sig(sigcontext))) /* 16-bit mode */ { @@ -614,24 +614,9 @@ static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD * * SS is still non-system segment. This is why both CS and SS * are checked. */ - wine_set_gs( thread_data->gs ); - stack = teb->WOW32Reserved; + return teb->WOW32Reserved; } -#ifdef __HAVE_VM86 - else if ((void *)EIP_sig(sigcontext) == vm86_return) /* vm86 mode */ - { - unsigned int *int_stack = stack; - /* fetch the saved %gs from the stack */ - wine_set_gs( int_stack[0] ); - } -#endif - else /* 32-bit mode */ - { -#ifdef GS_sig - wine_set_gs( GS_sig(sigcontext) ); -#endif - } - return stack; + return (void *)(ESP_sig(sigcontext) & ~3); } @@ -1553,6 +1538,8 @@ void signal_init_thread(void) ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == -1) perror( "sigaltstack" ); #endif /* HAVE_SIGALTSTACK */ + + ntdll_get_thread_data()->gs = wine_get_gs(); } /**********************************************************************