[ros-dev] [ros-diffs] [jgardou] 65140: [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 fi...

Pierre Schweitzer pierre at reactos.org
Fri Oct 31 11:07:50 UTC 2014


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, jgardou at 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=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
>          {
> 
> 


-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3968 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20141031/7c271496/attachment-0001.bin>


More information about the Ros-dev mailing list