Warm thanks for debugging this issue Jérôme. I do value your help.
This should unlock many autoupdating apps in ReactOS.
Thanks again.
On 31/10/2014 12:04, jgar...@svn.reactos.org wrote:
Author: jgardou
Date: Fri Oct 31 11:04:12 2014
New Revision: 65140
URL: http://svn.reactos.org/svn/reactos?rev=65140view=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=65140r1=65139r2=65140view=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=65140r1=65139r2=65140view=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=65140r1=65139r2=65140view=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