diff --git a/drivers/filesystems/fastfat/create.c b/drivers/filesystems/fastfat/create.c index aadc990e37..bef178cad6 100644 --- a/drivers/filesystems/fastfat/create.c +++ b/drivers/filesystems/fastfat/create.c @@ -791,6 +791,11 @@ VfatCreateFile( Attributes |= FILE_ATTRIBUTE_ARCHIVE; } vfatSplitPathName(&PathNameU, NULL, &FileNameU); + + if ((FileNameU.Length == sizeof(WCHAR) && FileNameU.Buffer[0] == L'.') || + (FileNameU.Length == 2 * sizeof(WCHAR) && FileNameU.Buffer[0] == L'.' && FileNameU.Buffer[1] == L'.')) + return STATUS_OBJECT_NAME_INVALID; + Status = VfatAddEntry(DeviceExt, &FileNameU, &pFcb, ParentFcb, RequestedOptions, Attributes, NULL); vfatReleaseFCB(DeviceExt, ParentFcb); diff --git a/drivers/filesystems/fastfat/finfo.c b/drivers/filesystems/fastfat/finfo.c index 755ba6a991..2e805c3150 100644 --- a/drivers/filesystems/fastfat/finfo.c +++ b/drivers/filesystems/fastfat/finfo.c @@ -66,6 +66,12 @@ const char* FileInformationClassNames[] = "FileMaximumInformation" }; +BOOLEAN IsDots(UNICODE_STRING File) +{ + return ((File.Length == sizeof(WCHAR) && File.Buffer[0] == L'.') || + (File.Length == 2 * sizeof(WCHAR) && File.Buffer[0] == L'.' && File.Buffer[1] == L'.')); +} + /* FUNCTIONS ****************************************************************/ /* @@ -380,9 +386,7 @@ VfatSetDispositionInformation( return STATUS_CANNOT_DELETE; } - if (vfatFCBIsRoot(FCB) || - (FCB->LongNameU.Length == sizeof(WCHAR) && FCB->LongNameU.Buffer[0] == L'.') || - (FCB->LongNameU.Length == 2 * sizeof(WCHAR) && FCB->LongNameU.Buffer[0] == L'.' && FCB->LongNameU.Buffer[1] == L'.')) + if (vfatFCBIsRoot(FCB) || IsDots(FCB->LongNameU)) { /* we cannot delete a '.', '..' or the root directory */ return STATUS_ACCESS_DENIED; @@ -831,6 +835,10 @@ VfatSetRenameInformation( (vfatFCBIsDirectory(FCB) ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_ACTION_RENAMED_OLD_NAME); + + if (IsDots(NewFile)) + return STATUS_OBJECT_NAME_INVALID; + Status = vfatRenameEntry(DeviceExt, FCB, &NewFile, TRUE); if (NT_SUCCESS(Status)) { @@ -864,6 +872,10 @@ VfatSetRenameInformation( (vfatFCBIsDirectory(FCB) ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), (DeletedTarget ? FILE_ACTION_REMOVED : FILE_ACTION_RENAMED_OLD_NAME)); + + if (IsDots(NewFile)) + return STATUS_OBJECT_NAME_INVALID; + Status = vfatRenameEntry(DeviceExt, FCB, &NewFile, FALSE); if (NT_SUCCESS(Status)) { @@ -920,6 +932,10 @@ VfatSetRenameInformation( (vfatFCBIsDirectory(FCB) ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_ACTION_REMOVED); + + if (IsDots(NewFile)) + return STATUS_OBJECT_NAME_INVALID; + Status = VfatMoveEntry(DeviceExt, FCB, &NewFile, ParentFCB); if (NT_SUCCESS(Status)) {