Paul Gofman : ntdll: Introduce RtlProcessFlsData() and use it for FLS data destruction.
Alexandre Julliard
julliard at winehq.org
Thu Oct 8 15:20:05 CDT 2020
Module: wine
Branch: master
Commit: 36981ad03356caf01eb7e446765e1e9c023c0195
URL: https://source.winehq.org/git/wine.git/?a=commit;h=36981ad03356caf01eb7e446765e1e9c023c0195
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Tue Oct 6 13:04:46 2020 +0300
ntdll: Introduce RtlProcessFlsData() and use it for FLS data destruction.
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/thread.c | 2 +-
dlls/ntdll/loader.c | 3 ++-
dlls/ntdll/ntdll.spec | 1 +
dlls/ntdll/thread.c | 10 ++++++++++
include/winternl.h | 1 +
5 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/thread.c b/dlls/kernelbase/thread.c
index 0bfef62a7d..f2b746856e 100644
--- a/dlls/kernelbase/thread.c
+++ b/dlls/kernelbase/thread.c
@@ -1022,7 +1022,7 @@ void WINAPI DECLSPEC_HOTPATCH DeleteFiber( LPVOID fiber_ptr )
RtlExitUserThread( 1 );
}
RtlFreeUserStack( fiber->stack_allocation );
- HeapFree( GetProcessHeap(), 0, fiber->fls_slots );
+ RtlProcessFlsData( fiber->fls_slots, 3 );
HeapFree( GetProcessHeap(), 0, fiber );
}
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 20bc3f977d..cd27ce5658 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -3255,7 +3255,8 @@ void WINAPI LdrShutdownThread(void)
for (i = 0; i < tls_module_count; i++) RtlFreeHeap( GetProcessHeap(), 0, pointers[i] );
RtlFreeHeap( GetProcessHeap(), 0, pointers );
}
- RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->FlsSlots );
+ RtlProcessFlsData( NtCurrentTeb()->FlsSlots, 3 );
+ NtCurrentTeb()->FlsSlots = NULL;
RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->TlsExpansionSlots );
NtCurrentTeb()->TlsExpansionSlots = NULL;
RtlReleasePebLock();
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index ce9f6281d5..6f44f49982 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -874,6 +874,7 @@
@ stdcall RtlPopFrame(ptr)
@ stdcall RtlPrefixString(ptr ptr long)
@ stdcall RtlPrefixUnicodeString(ptr ptr long)
+@ stdcall RtlProcessFlsData(ptr long)
@ stub RtlPropertySetNameToGuid
@ stub RtlProtectHeap
@ stdcall RtlPushFrame(ptr)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 716ef3b61d..5729204358 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -343,3 +343,13 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsGetValue( ULONG index, void **data )
return STATUS_SUCCESS;
}
+
+
+/***********************************************************************
+ * RtlProcessFlsData (NTDLL.@)
+ */
+void WINAPI DECLSPEC_HOTPATCH RtlProcessFlsData( void *teb_fls_data, ULONG flags )
+{
+ if (flags & 2)
+ RtlFreeHeap( GetProcessHeap(), 0, teb_fls_data );
+}
diff --git a/include/winternl.h b/include/winternl.h
index 82328167c9..75324635ed 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -3480,6 +3480,7 @@ NTSYSAPI NTSTATUS WINAPI RtlPinAtomInAtomTable(RTL_ATOM_TABLE,RTL_ATOM);
NTSYSAPI void WINAPI RtlPopFrame(TEB_ACTIVE_FRAME*);
NTSYSAPI BOOLEAN WINAPI RtlPrefixString(const STRING*,const STRING*,BOOLEAN);
NTSYSAPI BOOLEAN WINAPI RtlPrefixUnicodeString(const UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN);
+NTSYSAPI void WINAPI RtlProcessFlsData(void*,ULONG);
NTSYSAPI void WINAPI RtlPushFrame(TEB_ACTIVE_FRAME*);
NTSYSAPI NTSTATUS WINAPI RtlQueryActivationContextApplicationSettings(DWORD,HANDLE,const WCHAR*,const WCHAR*,WCHAR*,SIZE_T,SIZE_T*);
NTSYSAPI NTSTATUS WINAPI RtlQueryAtomInAtomTable(RTL_ATOM_TABLE,RTL_ATOM,ULONG*,ULONG*,WCHAR*,ULONG*);
More information about the wine-cvs
mailing list