https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0eacb0b1ef379df265cd96ef1df4302a459dc5c5

commit 0eacb0b1ef379df265cd96ef1df4302a459dc5c5
Author: Pierre Schweitzer <[email protected]>
AuthorDate: Sat Jan 6 22:02:10 2018 +0100

    [FASTFAT] When dealing with attributes on IRP_MJ_CREATE, filter user input 
to ensure we have only attributes we can handle.
    This applies to files newly created, or for files overwritten where 
attributes are reset/modified.
---
 drivers/filesystems/fastfat/create.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/filesystems/fastfat/create.c 
b/drivers/filesystems/fastfat/create.c
index 49c54207cd..f1b9b37325 100644
--- a/drivers/filesystems/fastfat/create.c
+++ b/drivers/filesystems/fastfat/create.c
@@ -728,7 +728,11 @@ VfatCreateFile(
         return Status;
     }
 
-    Attributes = Stack->Parameters.Create.FileAttributes & 
~FILE_ATTRIBUTE_NORMAL;
+    Attributes = (Stack->Parameters.Create.FileAttributes & 
(FILE_ATTRIBUTE_ARCHIVE |
+                                                             
FILE_ATTRIBUTE_SYSTEM |
+                                                             
FILE_ATTRIBUTE_HIDDEN |
+                                                             
FILE_ATTRIBUTE_DIRECTORY |
+                                                             
FILE_ATTRIBUTE_READONLY));
 
     /* If the file open failed then create the required file */
     if (!NT_SUCCESS (Status))
@@ -750,7 +754,7 @@ VfatCreateFile(
             }
             vfatSplitPathName(&PathNameU, NULL, &FileNameU);
             Status = VfatAddEntry(DeviceExt, &FileNameU, &pFcb, ParentFcb, 
RequestedOptions,
-                                  (UCHAR)FlagOn(Attributes, 
FILE_ATTRIBUTE_VALID_FLAGS), NULL);
+                                  Attributes, NULL);
             vfatReleaseFCB(DeviceExt, ParentFcb);
             if (NT_SUCCESS(Status))
             {
@@ -921,11 +925,11 @@ VfatCreateFile(
             {
                 if (RequestedDisposition == FILE_SUPERSEDE)
                 {
-                    *pFcb->Attributes = Attributes & ~FILE_ATTRIBUTE_NORMAL;
+                    *pFcb->Attributes = Attributes;
                 }
                 else
                 {
-                    *pFcb->Attributes |= Attributes & ~FILE_ATTRIBUTE_NORMAL;
+                    *pFcb->Attributes |= Attributes;
                 }
                 *pFcb->Attributes |= FILE_ATTRIBUTE_ARCHIVE;
                 VfatUpdateEntry(pFcb, vfatVolumeIsFatX(DeviceExt));

Reply via email to