From 0eacb0b1ef379df265cd96ef1df4302a459dc5c5 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 6 Jan 2018 22:02:10 +0100 Subject: [PATCH] [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 49c54207cd9..f1b9b373256 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));