[NTDLL] Acquire LdrpLoaderLock in LdrpInitializeThread

This is required to protect against a race with LdrShutdownThread, which can lead to all kinds of problems, including deadlocks.
This commit is contained in:
Timo Kreuzer 2024-06-03 10:06:57 +03:00
parent 72951421e6
commit e302bacd7e

View file

@ -517,6 +517,9 @@ LdrpInitializeThread(IN PCONTEXT Context)
NtCurrentTeb()->RealClientId.UniqueProcess,
NtCurrentTeb()->RealClientId.UniqueThread);
/* Acquire the loader Lock */
RtlEnterCriticalSection(&LdrpLoaderLock);
/* Allocate an Activation Context Stack */
DPRINT("ActivationContextStack %p\n", NtCurrentTeb()->ActivationContextStackPointer);
Status = RtlAllocateActivationContextStack(&NtCurrentTeb()->ActivationContextStackPointer);
@ -526,7 +529,7 @@ LdrpInitializeThread(IN PCONTEXT Context)
}
/* Make sure we are not shutting down */
if (LdrpShutdownInProgress) return;
if (LdrpShutdownInProgress) goto Exit;
/* Allocate TLS */
LdrpAllocateTls();
@ -633,6 +636,11 @@ LdrpInitializeThread(IN PCONTEXT Context)
RtlDeactivateActivationContextUnsafeFast(&ActCtx);
}
Exit:
/* Release the loader lock */
RtlLeaveCriticalSection(&LdrpLoaderLock);
DPRINT("LdrpInitializeThread() done\n");
}