https://git.reactos.org/?p=reactos.git;a=commitdiff;h=fc788cf2fde7551a8e5068f2b061c3cad2004e9a

commit fc788cf2fde7551a8e5068f2b061c3cad2004e9a
Author:     Pierre Schweitzer <pie...@reactos.org>
AuthorDate: Sat May 26 17:12:03 2018 +0200
Commit:     Pierre Schweitzer <pie...@reactos.org>
CommitDate: Sat May 26 17:13:08 2018 +0200

    [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.
---
 drivers/filesystems/fastfat/finfo.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/filesystems/fastfat/finfo.c 
b/drivers/filesystems/fastfat/finfo.c
index d860cd641b..af2e1ce62a 100644
--- a/drivers/filesystems/fastfat/finfo.c
+++ b/drivers/filesystems/fastfat/finfo.c
@@ -1552,6 +1552,7 @@ VfatSetInformation(
     PVFATFCB FCB;
     NTSTATUS Status = STATUS_SUCCESS;
     PVOID SystemBuffer;
+    BOOLEAN LockDir;
 
     /* PRECONDITION */
     ASSERT(IrpContext);
@@ -1593,7 +1594,14 @@ VfatSetInformation(
         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,
                                             BooleanFlagOn(IrpContext->Flags, 
IRPCONTEXT_CANWAIT)))
@@ -1607,7 +1615,7 @@ VfatSetInformation(
         if (!ExAcquireResourceExclusiveLite(&FCB->MainResource,
                                             BooleanFlagOn(IrpContext->Flags, 
IRPCONTEXT_CANWAIT)))
         {
-            if (FileInformationClass == FileRenameInformation)
+            if (LockDir)
             {
                 
ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource);
             }
@@ -1662,7 +1670,7 @@ VfatSetInformation(
         ExReleaseResourceLite(&FCB->MainResource);
     }
 
-    if (FileInformationClass == FileRenameInformation)
+    if (LockDir)
     {
         
ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource);
     }

Reply via email to