From 8eebfe811d903f69457bf6d990c6a1514f0b9562 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 20 Sep 2016 20:55:10 -0700 Subject: [PATCH] sys: FspFsvolQueryFsAttributeInformation: fix buffer overrun error --- src/sys/volinfo.c | 10 +++++----- src/sys/volume.c | 1 + tst/winfsp-tests/info-test.c | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/sys/volinfo.c b/src/sys/volinfo.c index 2f999d96..ae8c08ef 100644 --- a/src/sys/volinfo.c +++ b/src/sys/volinfo.c @@ -82,6 +82,8 @@ static NTSTATUS FspFsvolQueryFsAttributeInformation( UNICODE_STRING FileSystemName; WCHAR FileSystemNameBuf[16 + FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)]; + ASSERT(sizeof FileSystemNameBuf >= sizeof L"" DRIVER_NAME + FSP_FSCTL_VOLUME_FSNAME_SIZE); + Info->FileSystemAttributes = (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch ? FILE_CASE_SENSITIVE_SEARCH : 0) | (FsvolDeviceExtension->VolumeParams.CasePreservedNames ? FILE_CASE_PRESERVED_NAMES : 0) | @@ -96,17 +98,15 @@ static NTSTATUS FspFsvolQueryFsAttributeInformation( RtlInitUnicodeString(&FileSystemName, FsvolDeviceExtension->VolumeParams.FileSystemName); - ASSERT(sizeof FileSystemNameBuf >= sizeof L"" DRIVER_NAME + FSP_FSCTL_VOLUME_FSNAME_SIZE); - CopyLength = sizeof L"" DRIVER_NAME - sizeof(WCHAR); RtlCopyMemory(FileSystemNameBuf, L"" DRIVER_NAME, CopyLength); if (0 != FileSystemName.Length) { - FileSystemNameBuf[CopyLength / sizeof(WCHAR)] = L'_'; + FileSystemNameBuf[CopyLength / sizeof(WCHAR)] = L'-'; CopyLength += sizeof(WCHAR); RtlCopyMemory(FileSystemNameBuf + CopyLength / sizeof(WCHAR), FileSystemName.Buffer, - FileSystemName.Length * sizeof(WCHAR)); - CopyLength += FileSystemName.Length * sizeof(WCHAR); + FileSystemName.Length); + CopyLength += FileSystemName.Length; } Info->FileSystemNameLength = CopyLength; diff --git a/src/sys/volume.c b/src/sys/volume.c index 766c6025..be1b6e29 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -169,6 +169,7 @@ static NTSTATUS FspVolumeCreateNoLock( if (I == PrefixLength) return STATUS_INVALID_PARAMETER; } + VolumeParams.FileSystemName[sizeof VolumeParams.FileSystemName / sizeof(WCHAR) - 1] = L'\0'; /* create volume guid */ Result = FspCreateGuid(&Guid); diff --git a/tst/winfsp-tests/info-test.c b/tst/winfsp-tests/info-test.c index 81297391..d4d4edef 100644 --- a/tst/winfsp-tests/info-test.c +++ b/tst/winfsp-tests/info-test.c @@ -496,7 +496,7 @@ void getvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) ASSERT(255 == MaxComponentLength); ASSERT(0 != (FileSystemFlags & (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); @@ -573,7 +573,7 @@ void setvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) ASSERT(255 == MaxComponentLength); ASSERT(0 != (FileSystemFlags & (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"); @@ -590,7 +590,7 @@ void setvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) ASSERT(255 == MaxComponentLength); ASSERT(0 != (FileSystemFlags & (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"); @@ -607,7 +607,7 @@ void setvolinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) ASSERT(255 == MaxComponentLength); ASSERT(0 != (FileSystemFlags & (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")); } }