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... ============================================================================== --- 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... ============================================================================== --- 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... ============================================================================== --- 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 {