sys: silo: ensure FspSiloListMutex in critical region

This commit is contained in:
Bill Zissimopoulos 2022-10-01 14:44:17 +01:00
parent 0eb6912296
commit 4d1594b1cf

View File

@ -207,6 +207,7 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
goto exit; goto exit;
Inserted = TRUE; Inserted = TRUE;
FsRtlEnterFileSystem();
ExAcquireFastMutexUnsafe(&FspSiloListMutex); ExAcquireFastMutexUnsafe(&FspSiloListMutex);
if (0 != FspSiloInitCallback) if (0 != FspSiloInitCallback)
@ -220,6 +221,7 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
InsertTailList(&FspSiloList, &Globals->ListEntry); InsertTailList(&FspSiloList, &Globals->ListEntry);
ExReleaseFastMutexUnsafe(&FspSiloListMutex); ExReleaseFastMutexUnsafe(&FspSiloListMutex);
FsRtlExitFileSystem();
exit: exit:
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
@ -256,6 +258,7 @@ static VOID NTAPI FspSiloMonitorTerminateCallback(FSP_PESILO Silo)
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return; return;
FsRtlEnterFileSystem();
ExAcquireFastMutexUnsafe(&FspSiloListMutex); ExAcquireFastMutexUnsafe(&FspSiloListMutex);
RemoveEntryList(&Globals->ListEntry); RemoveEntryList(&Globals->ListEntry);
@ -270,6 +273,7 @@ static VOID NTAPI FspSiloMonitorTerminateCallback(FSP_PESILO Silo)
} }
ExReleaseFastMutexUnsafe(&FspSiloListMutex); ExReleaseFastMutexUnsafe(&FspSiloListMutex);
FsRtlExitFileSystem();
/* PsRemoveSiloContext removes reference to Globals (possibly freeing it) */ /* PsRemoveSiloContext removes reference to Globals (possibly freeing it) */
CALL(PsRemoveSiloContext)(Silo, ContextSlot, 0); CALL(PsRemoveSiloContext)(Silo, ContextSlot, 0);
@ -355,9 +359,11 @@ VOID FspSiloFinalize(VOID)
CALL(PsUnregisterSiloMonitor)(FspSiloMonitor); CALL(PsUnregisterSiloMonitor)(FspSiloMonitor);
#if DBG #if DBG
FsRtlEnterFileSystem();
ExAcquireFastMutexUnsafe(&FspSiloListMutex); ExAcquireFastMutexUnsafe(&FspSiloListMutex);
ASSERT(IsListEmpty(&FspSiloList)); ASSERT(IsListEmpty(&FspSiloList));
ExReleaseFastMutexUnsafe(&FspSiloListMutex); ExReleaseFastMutexUnsafe(&FspSiloListMutex);
FsRtlExitFileSystem();
#endif #endif
FspSiloMonitor = 0; FspSiloMonitor = 0;
@ -372,6 +378,7 @@ VOID FspSiloEnumerate(FSP_SILO_ENUM_CALLBACK EnumFn)
PLIST_ENTRY ListEntry; PLIST_ENTRY ListEntry;
FSP_SILO_GLOBALS *Globals; FSP_SILO_GLOBALS *Globals;
FsRtlEnterFileSystem();
ExAcquireFastMutexUnsafe(&FspSiloListMutex); ExAcquireFastMutexUnsafe(&FspSiloListMutex);
if (!IsListEmpty(&FspSiloList)) if (!IsListEmpty(&FspSiloList))
@ -393,4 +400,5 @@ VOID FspSiloEnumerate(FSP_SILO_ENUM_CALLBACK EnumFn)
} }
ExReleaseFastMutexUnsafe(&FspSiloListMutex); ExReleaseFastMutexUnsafe(&FspSiloListMutex);
FsRtlExitFileSystem();
} }