[FASTFAT]
authorThomas Faber <thomas.faber@reactos.org>
Thu, 11 Aug 2016 13:25:57 +0000 (13:25 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Thu, 11 Aug 2016 13:25:57 +0000 (13:25 +0000)
- Fail invalid opens specifying FILE_DELETE_ON_CLOSE
CORE-6931

svn path=/trunk/; revision=72196

reactos/drivers/filesystems/fastfat/create.c

index bdb58c7..8a21789 100644 (file)
@@ -460,6 +460,23 @@ VfatOpenFile(
         return STATUS_ACCESS_DENIED;
     }
 
+    if ((*Fcb->Attributes & FILE_ATTRIBUTE_READONLY) &&
+        (RequestedOptions & FILE_DELETE_ON_CLOSE))
+    {
+        vfatReleaseFCB(DeviceExt, Fcb);
+        return STATUS_CANNOT_DELETE;
+    }
+
+    if ((vfatFCBIsRoot(Fcb) ||
+         (Fcb->LongNameU.Length == sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.') ||
+         (Fcb->LongNameU.Length == 2 * sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.' && Fcb->LongNameU.Buffer[1] == L'.')) &&
+        (RequestedOptions & FILE_DELETE_ON_CLOSE))
+    {
+        // we cannot delete a '.', '..' or the root directory
+        vfatReleaseFCB(DeviceExt, Fcb);
+        return STATUS_CANNOT_DELETE;
+    }
+
     DPRINT("Attaching FCB to fileObject\n");
     Status = vfatAttachFCBToFileObject(DeviceExt, Fcb, FileObject);
     if (!NT_SUCCESS(Status))
@@ -552,6 +569,11 @@ VfatCreateFile(
             return STATUS_INVALID_PARAMETER;
         }
 
+        if (RequestedOptions & FILE_DELETE_ON_CLOSE)
+        {
+            return STATUS_CANNOT_DELETE;
+        }
+
         pFcb = DeviceExt->VolumeFcb;
 
         if (pFcb->OpenHandleCount == 0)
@@ -870,7 +892,8 @@ VfatCreateFile(
         {
             if (Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA ||
                 RequestedDisposition == FILE_OVERWRITE ||
-                RequestedDisposition == FILE_OVERWRITE_IF)
+                RequestedDisposition == FILE_OVERWRITE_IF ||
+                (RequestedOptions & FILE_DELETE_ON_CLOSE))
             {
                 if (!MmFlushImageSection(&pFcb->SectionObjectPointers, MmFlushForWrite))
                 {
@@ -878,7 +901,8 @@ VfatCreateFile(
                     DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA,
                             RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF);
                     VfatCloseFile (DeviceExt, FileObject);
-                    return STATUS_SHARING_VIOLATION;
+                    return (RequestedOptions & FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE
+                                                                     : STATUS_SHARING_VIOLATION;
                 }
             }
         }