Author: jgardou
Date: Fri Oct 31 11:04:12 2014
New Revision: 65140

URL: http://svn.reactos.org/svn/reactos?rev=65140&view=rev
Log:
[FASTFAT]
 - Fix renaming files in case the target file already exists.
 - Plug a few reference count leaks on FCBs.
CORE-8660 #comment fixed in r65140 #resolve
CORE-8633 #comment fixed in r65140 #resolve
CORE-4758 #comment fixed in r65140 #resolve

Modified:
    trunk/reactos/drivers/filesystems/fastfat/cleanup.c
    trunk/reactos/drivers/filesystems/fastfat/create.c
    trunk/reactos/drivers/filesystems/fastfat/finfo.c

Modified: trunk/reactos/drivers/filesystems/fastfat/cleanup.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/cleanup.c?rev=65140&r1=65139&r2=65140&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/cleanup.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/cleanup.c [iso-8859-1] Fri Oct 31 
11:04:12 2014
@@ -92,6 +92,7 @@
                 pFcb->FileObject = NULL;
                 CcUninitializeCacheMap(tmpFileObject, NULL, NULL);
                 ObDereferenceObject(tmpFileObject);
+                vfatReleaseFCB(IrpContext->DeviceExt, pFcb);
             }
 
             CcPurgeCacheSection(FileObject->SectionObjectPointer, NULL, 0, 
FALSE);

Modified: trunk/reactos/drivers/filesystems/fastfat/create.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/create.c?rev=65140&r1=65139&r2=65140&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/create.c  [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/create.c  [iso-8859-1] Fri Oct 31 
11:04:12 2014
@@ -365,7 +365,6 @@
         DPRINT("'%wZ'\n", &FileObject->RelatedFileObject->FileName);
 
         *ParentFcb = FileObject->RelatedFileObject->FsContext;
-        vfatGrabFCB(DeviceExt, *ParentFcb);
     }
     else
     {

Modified: trunk/reactos/drivers/filesystems/fastfat/finfo.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/finfo.c?rev=65140&r1=65139&r2=65140&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/finfo.c   [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/finfo.c   [iso-8859-1] Fri Oct 31 
11:04:12 2014
@@ -396,41 +396,53 @@
     /* If it exists */
     if (NT_SUCCESS(Status))
     {
+        DPRINT("Target file %wZ exists. FCB Flags %08x\n", NewName, 
TargetFcb->Flags);
         /* Check whether we are allowed to replace */
         if (ReplaceIfExists)
         {
             /* If that's a directory or a read-only file, we're not allowed */
-            if (vfatFCBIsDirectory(TargetFcb) || ((*TargetFcb->Attributes & 
FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY));
-            {
+            if (vfatFCBIsDirectory(TargetFcb) || ((*TargetFcb->Attributes & 
FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY))
+            {
+                DPRINT("And this is a readonly file!\n");
                 vfatReleaseFCB(DeviceExt, *ParentFCB);
                 *ParentFCB = NULL;
                 vfatReleaseFCB(DeviceExt, TargetFcb);
                 return STATUS_OBJECT_NAME_COLLISION;
             }
 
-            /* Attempt to flush (might close the file) */
-            if 
(!MmFlushImageSection(TargetFcb->FileObject->SectionObjectPointer, 
MmFlushForDelete))
-            {
+
+            /* If we still have a file object, close it. */
+            if (TargetFcb->FileObject)
+            {
+                if 
(!MmFlushImageSection(TargetFcb->FileObject->SectionObjectPointer, 
MmFlushForDelete))
+                {
+                    DPRINT("MmFlushImageSection failed.\n");
+                    vfatReleaseFCB(DeviceExt, *ParentFCB);
+                    *ParentFCB = NULL;
+                    vfatReleaseFCB(DeviceExt, TargetFcb);
+                    return STATUS_ACCESS_DENIED;
+                }
+
+                TargetFcb->FileObject->DeletePending = TRUE;
+                VfatCloseFile(DeviceExt, TargetFcb->FileObject);
+            }
+
+            /* If we are here, ensure the file isn't open by anyone! */
+            if (TargetFcb->OpenHandleCount != 0)
+            {
+                DPRINT("There are still open handles for this file.\n");
                 vfatReleaseFCB(DeviceExt, *ParentFCB);
                 *ParentFCB = NULL;
                 vfatReleaseFCB(DeviceExt, TargetFcb);
                 return STATUS_ACCESS_DENIED;
             }
 
-            /* If we are, ensure the file isn't open by anyone! */
-            if (TargetFcb->OpenHandleCount != 0)
-            {
-                vfatReleaseFCB(DeviceExt, *ParentFCB);
-                *ParentFCB = NULL;
-                vfatReleaseFCB(DeviceExt, TargetFcb);
-                return STATUS_ACCESS_DENIED;
-            }
-
             /* Effectively delete old file to allow renaming */
+            DPRINT("Effectively deleting the file.\n");
             VfatDelEntry(DeviceExt, TargetFcb, NULL);
-            vfatGrabFCB(DeviceExt, *ParentFCB);
             vfatReleaseFCB(DeviceExt, TargetFcb);
             *Deleted = TRUE;
+            return STATUS_SUCCESS;
         }
         else
         {


Reply via email to