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