Alexandre Julliard : ntdll: Use server_enter_uninterrupted_section() for LDT locking.
Alexandre Julliard
julliard at winehq.org
Wed Apr 29 16:11:13 CDT 2020
Module: wine
Branch: master
Commit: 53b305c35e6cfb489e2e9f4996d36ae82cac5e6c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=53b305c35e6cfb489e2e9f4996d36ae82cac5e6c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 29 19:53:57 2020 +0200
ntdll: Use server_enter_uninterrupted_section() for LDT locking.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/signal_i386.c | 37 ++++++++++---------------------------
1 file changed, 10 insertions(+), 27 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 4743f095f0..2f2a36a579 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2328,30 +2328,9 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
0, 0, { (DWORD_PTR)(__FILE__ ": ldt_section") }
};
static RTL_CRITICAL_SECTION ldt_section = { &critsect_debug, -1, 0, 0, 0, 0 };
-static sigset_t ldt_sigset;
static const LDT_ENTRY null_entry;
-static void ldt_lock(void)
-{
- sigset_t sigset;
-
- pthread_sigmask( SIG_BLOCK, &server_block_set, &sigset );
- RtlEnterCriticalSection( &ldt_section );
- if (ldt_section.RecursionCount == 1) ldt_sigset = sigset;
-}
-
-static void ldt_unlock(void)
-{
- if (ldt_section.RecursionCount == 1)
- {
- sigset_t sigset = ldt_sigset;
- RtlLeaveCriticalSection( &ldt_section );
- pthread_sigmask( SIG_SETMASK, &sigset, NULL );
- }
- else RtlLeaveCriticalSection( &ldt_section );
-}
-
static inline void *ldt_get_base( LDT_ENTRY ent )
{
return (void *)(ent.BaseLow |
@@ -2510,14 +2489,16 @@ NTSTATUS get_thread_ldt_entry( HANDLE handle, void *data, ULONG len, ULONG *ret_
*/
NTSTATUS WINAPI NtSetLdtEntries( ULONG sel1, LDT_ENTRY entry1, ULONG sel2, LDT_ENTRY entry2 )
{
+ sigset_t sigset;
+
if (sel1 >> 16 || sel2 >> 16) return STATUS_INVALID_LDT_DESCRIPTOR;
if (sel1 && (sel1 >> 3) < first_ldt_entry) return STATUS_INVALID_LDT_DESCRIPTOR;
if (sel2 && (sel2 >> 3) < first_ldt_entry) return STATUS_INVALID_LDT_DESCRIPTOR;
- ldt_lock();
+ server_enter_uninterrupted_section( &ldt_section, &sigset );
if (sel1) ldt_set_entry( sel1, entry1 );
if (sel2) ldt_set_entry( sel2, entry2 );
- ldt_unlock();
+ server_leave_uninterrupted_section( &ldt_section, &sigset );
return STATUS_SUCCESS;
}
@@ -2555,6 +2536,7 @@ NTSTATUS signal_alloc_thread( TEB *teb )
if (!gdt_fs_sel)
{
static int first_thread = 1;
+ sigset_t sigset;
int idx;
LDT_ENTRY entry = ldt_make_entry( teb, teb_size - 1, LDT_FLAGS_DATA | LDT_FLAGS_32BIT );
@@ -2568,14 +2550,14 @@ NTSTATUS signal_alloc_thread( TEB *teb )
}
else
{
- ldt_lock();
+ server_enter_uninterrupted_section( &ldt_section, &sigset );
for (idx = first_ldt_entry; idx < LDT_SIZE; idx++)
{
if (__wine_ldt_copy.flags[idx]) continue;
ldt_set_entry( (idx << 3) | 7, entry );
break;
}
- ldt_unlock();
+ server_leave_uninterrupted_section( &ldt_section, &sigset );
if (idx == LDT_SIZE) return STATUS_TOO_MANY_THREADS;
}
thread_data->fs = (idx << 3) | 7;
@@ -2592,12 +2574,13 @@ NTSTATUS signal_alloc_thread( TEB *teb )
void signal_free_thread( TEB *teb )
{
struct x86_thread_data *thread_data = (struct x86_thread_data *)teb->SystemReserved2;
+ sigset_t sigset;
if (gdt_fs_sel) return;
- ldt_lock();
+ server_enter_uninterrupted_section( &ldt_section, &sigset );
__wine_ldt_copy.flags[thread_data->fs >> 3] = 0;
- ldt_unlock();
+ server_leave_uninterrupted_section( &ldt_section, &sigset );
}
More information about the wine-cvs
mailing list