[FASTFAT]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 26 Feb 2017 13:57:17 +0000 (13:57 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 26 Feb 2017 13:57:17 +0000 (13:57 +0000)
Addendum to r73923: merge with Thomas' patch regarding that topic.

ROSTESTS-135

svn path=/trunk/; revision=73924

reactos/drivers/filesystems/fastfat/create.c

index 0e63c36..cc5882f 100644 (file)
@@ -510,8 +510,6 @@ VfatCreateFile(
     c = PathNameU.Buffer + PathNameU.Length / sizeof(WCHAR);
     last = c - 1;
 
-    TrailingBackslash = (*last == L'\\');
-
     Dots = TRUE;
     while (c-- > PathNameU.Buffer)
     {
@@ -553,9 +551,11 @@ VfatCreateFile(
         return STATUS_OBJECT_NAME_INVALID;
     }
 
+    TrailingBackslash = FALSE;
     if (PathNameU.Length > sizeof(WCHAR) && PathNameU.Buffer[PathNameU.Length/sizeof(WCHAR)-1] == L'\\')
     {
         PathNameU.Length -= sizeof(WCHAR);
+        TrailingBackslash = TRUE;
     }
 
     if (PathNameU.Length > sizeof(WCHAR) && PathNameU.Buffer[PathNameU.Length/sizeof(WCHAR)-1] == L'\\')
@@ -700,14 +700,16 @@ VfatCreateFile(
             RequestedDisposition == FILE_OVERWRITE_IF ||
             RequestedDisposition == FILE_SUPERSEDE)
         {
-            if (TrailingBackslash & !BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE))
-            {
-                return STATUS_OBJECT_NAME_INVALID;
-            }
-
             Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
             if (!BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE))
+            {
+                if (TrailingBackslash)
+                {
+                    vfatReleaseFCB(DeviceExt, ParentFcb);
+                    return STATUS_OBJECT_NAME_INVALID;
+                }
                 Attributes |= FILE_ATTRIBUTE_ARCHIVE;
+            }
             vfatSplitPathName(&PathNameU, NULL, &FileNameU);
             Status = VfatAddEntry(DeviceExt, &FileNameU, &pFcb, ParentFcb, RequestedOptions,
                                   (UCHAR)FlagOn(Attributes, FILE_ATTRIBUTE_VALID_FLAGS), NULL);
@@ -756,16 +758,20 @@ VfatCreateFile(
             vfatReleaseFCB(DeviceExt, ParentFcb);
         }
 
+        pFcb = FileObject->FsContext;
+
         /* Otherwise fail if the caller wanted to create a new file  */
         if (RequestedDisposition == FILE_CREATE)
         {
-            Irp->IoStatus.Information = FILE_EXISTS;
             VfatCloseFile(DeviceExt, FileObject);
+            if (TrailingBackslash && !vfatFCBIsDirectory(pFcb))
+            {
+                return STATUS_OBJECT_NAME_INVALID;
+            }
+            Irp->IoStatus.Information = FILE_EXISTS;
             return STATUS_OBJECT_NAME_COLLISION;
         }
 
-        pFcb = FileObject->FsContext;
-
         if (pFcb->OpenHandleCount != 0)
         {
             Status = IoCheckShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess,
@@ -795,7 +801,7 @@ VfatCreateFile(
             VfatCloseFile (DeviceExt, FileObject);
             return STATUS_NOT_A_DIRECTORY;
         }
-        if (!vfatFCBIsDirectory(pFcb) && TrailingBackslash)
+        if (TrailingBackslash && !vfatFCBIsDirectory(pFcb))
         {
             VfatCloseFile (DeviceExt, FileObject);
             return STATUS_OBJECT_NAME_INVALID;