[FASTFAT] On file overwrite, deny it if file as HIDDEN/SYSTEM flag and caller doesn...
authorPierre Schweitzer <pierre@reactos.org>
Mon, 1 Jan 2018 11:12:08 +0000 (12:12 +0100)
committerPierre Schweitzer <pierre@reactos.org>
Mon, 1 Jan 2018 11:13:46 +0000 (12:13 +0100)
CORE-14158

drivers/filesystems/fastfat/create.c

index 20a4bc0..89ac5e0 100644 (file)
@@ -728,6 +728,8 @@ VfatCreateFile(
         return Status;
     }
 
         return Status;
     }
 
+    Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
+
     /* If the file open failed then create the required file */
     if (!NT_SUCCESS (Status))
     {
     /* If the file open failed then create the required file */
     if (!NT_SUCCESS (Status))
     {
@@ -736,7 +738,6 @@ VfatCreateFile(
             RequestedDisposition == FILE_OVERWRITE_IF ||
             RequestedDisposition == FILE_SUPERSEDE)
         {
             RequestedDisposition == FILE_OVERWRITE_IF ||
             RequestedDisposition == FILE_SUPERSEDE)
         {
-            Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
             if (!BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE))
             {
                 if (TrailingBackslash)
             if (!BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE))
             {
                 if (TrailingBackslash)
@@ -908,9 +909,17 @@ VfatCreateFile(
             RequestedDisposition == FILE_OVERWRITE_IF ||
             RequestedDisposition == FILE_SUPERSEDE)
         {
             RequestedDisposition == FILE_OVERWRITE_IF ||
             RequestedDisposition == FILE_SUPERSEDE)
         {
+            if ((BooleanFlagOn(*pFcb->Attributes, FILE_ATTRIBUTE_HIDDEN) && !BooleanFlagOn(Attributes, FILE_ATTRIBUTE_HIDDEN)) ||
+                (BooleanFlagOn(*pFcb->Attributes, FILE_ATTRIBUTE_SYSTEM) && !BooleanFlagOn(Attributes, FILE_ATTRIBUTE_SYSTEM)))
+            {
+                VfatCloseFile(DeviceExt, FileObject);
+                vfatAddToStat(DeviceExt, Fat.FailedCreates, 1);
+                return STATUS_ACCESS_DENIED;
+            }
+
             if (!vfatFCBIsDirectory(pFcb))
             {
             if (!vfatFCBIsDirectory(pFcb))
             {
-                *pFcb->Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
+                *pFcb->Attributes = Attributes & ~FILE_ATTRIBUTE_NORMAL;
                 *pFcb->Attributes |= FILE_ATTRIBUTE_ARCHIVE;
                 VfatUpdateEntry(pFcb, vfatVolumeIsFatX(DeviceExt));
             }
                 *pFcb->Attributes |= FILE_ATTRIBUTE_ARCHIVE;
                 VfatUpdateEntry(pFcb, vfatVolumeIsFatX(DeviceExt));
             }