[FASTFAT] Lock DirResource when modifying an entry on disk.

Likely not optimal, but fixes some races conditions where
the directory is uninit in the middle of the write.
This commit is contained in:
Pierre Schweitzer 2018-05-26 17:12:03 +02:00
parent cca1a3f47f
commit fc788cf2fd
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B

View file

@ -1552,6 +1552,7 @@ VfatSetInformation(
PVFATFCB FCB; PVFATFCB FCB;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PVOID SystemBuffer; PVOID SystemBuffer;
BOOLEAN LockDir;
/* PRECONDITION */ /* PRECONDITION */
ASSERT(IrpContext); ASSERT(IrpContext);
@ -1593,7 +1594,14 @@ VfatSetInformation(
DPRINT("Can set file size\n"); DPRINT("Can set file size\n");
} }
if (FileInformationClass == FileRenameInformation) LockDir = FALSE;
if (FileInformationClass == FileRenameInformation || FileInformationClass == FileAllocationInformation ||
FileInformationClass == FileEndOfFileInformation || FileInformationClass == FileBasicInformation)
{
LockDir = TRUE;
}
if (LockDir)
{ {
if (!ExAcquireResourceExclusiveLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource, if (!ExAcquireResourceExclusiveLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource,
BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))) BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
@ -1607,7 +1615,7 @@ VfatSetInformation(
if (!ExAcquireResourceExclusiveLite(&FCB->MainResource, if (!ExAcquireResourceExclusiveLite(&FCB->MainResource,
BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))) BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{ {
if (FileInformationClass == FileRenameInformation) if (LockDir)
{ {
ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource); ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource);
} }
@ -1662,7 +1670,7 @@ VfatSetInformation(
ExReleaseResourceLite(&FCB->MainResource); ExReleaseResourceLite(&FCB->MainResource);
} }
if (FileInformationClass == FileRenameInformation) if (LockDir)
{ {
ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource); ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource);
} }