From 7e9accf68e71529844dd8ea918b65efd9b6a7855 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 9 Mar 2016 14:42:59 -0800 Subject: [PATCH] sys: IRP_MJ_READ: trim ReadLength when necessary for cache manager --- src/sys/read.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/sys/read.c b/src/sys/read.c index 7285167b..7a457782 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -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;