https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0eacb0b1ef379df265cd9…
commit 0eacb0b1ef379df265cd96ef1df4302a459dc5c5
Author: Pierre Schweitzer <pierre(a)reactos.org>
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));