sys: IRP_MJ_READ: trim ReadLength when necessary for cache manager

This commit is contained in:
Bill Zissimopoulos 2016-03-09 14:42:59 -08:00
parent d9f4382225
commit 7e9accf68e

View File

@ -112,11 +112,20 @@ static NTSTATUS FspFsvolReadCached(
if (!Success)
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadCached, 0);
/* trim ReadLength; the cache manager does not tolerate reads beyond file size */
ASSERT(FspTimeoutInfinity32 == FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
FspFileNodeGetFileInfo(FileNode, &FileInfo);
if ((UINT64)ReadOffset.QuadPart >= FileInfo.FileSize)
{
FspFileNodeRelease(FileNode, Main);
return STATUS_END_OF_FILE;
}
if (ReadLength > (ULONG)(FileInfo.FileSize - ReadOffset.QuadPart))
ReadLength = (ULONG)(FileInfo.FileSize - ReadOffset.QuadPart);
/* initialize cache if not already initialized! */
if (0 == FileObject->PrivateCacheMap)
{
ASSERT(FspTimeoutInfinity32 == FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
FspFileNodeGetFileInfo(FileNode, &FileInfo);
FileSizes.AllocationSize.QuadPart = FileInfo.AllocationSize;
FileSizes.FileSize.QuadPart = FileInfo.FileSize;
FileSizes.ValidDataLength.QuadPart = MAXLONGLONG;