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