sys: FspFsvolQueryFsAttributeInformation: fix buffer overrun error

This commit is contained in:
Bill Zissimopoulos 2016-09-20 20:55:10 -07:00
parent 5798527237
commit 8eebfe811d
3 changed files with 10 additions and 9 deletions

View File

@ -82,6 +82,8 @@ static NTSTATUS FspFsvolQueryFsAttributeInformation(
UNICODE_STRING FileSystemName; UNICODE_STRING FileSystemName;
WCHAR FileSystemNameBuf[16 + FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)]; WCHAR FileSystemNameBuf[16 + FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)];
ASSERT(sizeof FileSystemNameBuf >= sizeof L"" DRIVER_NAME + FSP_FSCTL_VOLUME_FSNAME_SIZE);
Info->FileSystemAttributes = Info->FileSystemAttributes =
(FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch ? FILE_CASE_SENSITIVE_SEARCH : 0) | (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch ? FILE_CASE_SENSITIVE_SEARCH : 0) |
(FsvolDeviceExtension->VolumeParams.CasePreservedNames ? FILE_CASE_PRESERVED_NAMES : 0) | (FsvolDeviceExtension->VolumeParams.CasePreservedNames ? FILE_CASE_PRESERVED_NAMES : 0) |
@ -96,17 +98,15 @@ static NTSTATUS FspFsvolQueryFsAttributeInformation(
RtlInitUnicodeString(&FileSystemName, FsvolDeviceExtension->VolumeParams.FileSystemName); RtlInitUnicodeString(&FileSystemName, FsvolDeviceExtension->VolumeParams.FileSystemName);
ASSERT(sizeof FileSystemNameBuf >= sizeof L"" DRIVER_NAME + FSP_FSCTL_VOLUME_FSNAME_SIZE);
CopyLength = sizeof L"" DRIVER_NAME - sizeof(WCHAR); CopyLength = sizeof L"" DRIVER_NAME - sizeof(WCHAR);
RtlCopyMemory(FileSystemNameBuf, L"" DRIVER_NAME, CopyLength); RtlCopyMemory(FileSystemNameBuf, L"" DRIVER_NAME, CopyLength);
if (0 != FileSystemName.Length) if (0 != FileSystemName.Length)
{ {
FileSystemNameBuf[CopyLength / sizeof(WCHAR)] = L'_'; FileSystemNameBuf[CopyLength / sizeof(WCHAR)] = L'-';
CopyLength += sizeof(WCHAR); CopyLength += sizeof(WCHAR);
RtlCopyMemory(FileSystemNameBuf + CopyLength / sizeof(WCHAR), FileSystemName.Buffer, RtlCopyMemory(FileSystemNameBuf + CopyLength / sizeof(WCHAR), FileSystemName.Buffer,
FileSystemName.Length * sizeof(WCHAR)); FileSystemName.Length);
CopyLength += FileSystemName.Length * sizeof(WCHAR); CopyLength += FileSystemName.Length;
} }
Info->FileSystemNameLength = CopyLength; Info->FileSystemNameLength = CopyLength;

View File

@ -169,6 +169,7 @@ static NTSTATUS FspVolumeCreateNoLock(
if (I == PrefixLength) if (I == PrefixLength)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
VolumeParams.FileSystemName[sizeof VolumeParams.FileSystemName / sizeof(WCHAR) - 1] = L'\0';
/* create volume guid */ /* create volume guid */
Result = FspCreateGuid(&Guid); Result = FspCreateGuid(&Guid);

View File

@ -496,7 +496,7 @@ void getvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
ASSERT(255 == MaxComponentLength); ASSERT(255 == MaxComponentLength);
ASSERT(0 != (FileSystemFlags & ASSERT(0 != (FileSystemFlags &
(FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS))); (FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS)));
ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp_MEMFS")); ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp-MEMFS"));
} }
Success = GetDiskFreeSpaceW(FilePath, &SectorsPerCluster, &BytesPerSector, &FreeClusters, &TotalClusters); Success = GetDiskFreeSpaceW(FilePath, &SectorsPerCluster, &BytesPerSector, &FreeClusters, &TotalClusters);
@ -573,7 +573,7 @@ void setvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
ASSERT(255 == MaxComponentLength); ASSERT(255 == MaxComponentLength);
ASSERT(0 != (FileSystemFlags & ASSERT(0 != (FileSystemFlags &
(FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS))); (FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS)));
ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp_MEMFS")); ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp-MEMFS"));
} }
Success = SetVolumeLabelW(FilePath, L"TestLabel"); Success = SetVolumeLabelW(FilePath, L"TestLabel");
@ -590,7 +590,7 @@ void setvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
ASSERT(255 == MaxComponentLength); ASSERT(255 == MaxComponentLength);
ASSERT(0 != (FileSystemFlags & ASSERT(0 != (FileSystemFlags &
(FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS))); (FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS)));
ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp_MEMFS")); ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp-MEMFS"));
} }
Success = SetVolumeLabelW(FilePath, L"123456789012345678901234567890123"); Success = SetVolumeLabelW(FilePath, L"123456789012345678901234567890123");
@ -607,7 +607,7 @@ void setvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
ASSERT(255 == MaxComponentLength); ASSERT(255 == MaxComponentLength);
ASSERT(0 != (FileSystemFlags & ASSERT(0 != (FileSystemFlags &
(FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS))); (FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK | FILE_PERSISTENT_ACLS)));
ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp_MEMFS")); ASSERT(0 == wcscmp(FileSystemNameBuf, L"WinFsp-MEMFS"));
} }
} }