[NTOSKRNL] When mapping data in CcMapData(), don't truncate offset to ULONG.

This would affect reads/writes on large volumes where offset is higher than what a ULONG can hold.

This really nasty bug was hitting CcMapData() but also CcPinRead() (due to the nature of its implementation)
and both were returning garbage data under certain circumstances with Ext2Fsd.

This should (I hope!) help some other FSDs to work better in ROS.

CORE-12456
This commit is contained in:
Pierre Schweitzer 2018-01-13 21:27:29 +01:00
parent e5f9029826
commit 371aba1abe
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B

View file

@ -33,19 +33,19 @@ CcMapData (
OUT PVOID *pBcb, OUT PVOID *pBcb,
OUT PVOID *pBuffer) OUT PVOID *pBuffer)
{ {
ULONG ReadOffset; LONGLONG ReadOffset;
BOOLEAN Valid; BOOLEAN Valid;
PROS_SHARED_CACHE_MAP SharedCacheMap; PROS_SHARED_CACHE_MAP SharedCacheMap;
PROS_VACB Vacb; PROS_VACB Vacb;
NTSTATUS Status; NTSTATUS Status;
PINTERNAL_BCB iBcb; PINTERNAL_BCB iBcb;
ULONG ROffset; LONGLONG ROffset;
DPRINT("CcMapData(FileObject 0x%p, FileOffset %I64x, Length %lu, Flags 0x%lx," DPRINT("CcMapData(FileObject 0x%p, FileOffset %I64x, Length %lu, Flags 0x%lx,"
" pBcb 0x%p, pBuffer 0x%p)\n", FileObject, FileOffset->QuadPart, " pBcb 0x%p, pBuffer 0x%p)\n", FileObject, FileOffset->QuadPart,
Length, Flags, pBcb, pBuffer); Length, Flags, pBcb, pBuffer);
ReadOffset = (ULONG)FileOffset->QuadPart; ReadOffset = FileOffset->QuadPart;
ASSERT(FileObject); ASSERT(FileObject);
ASSERT(FileObject->SectionObjectPointer); ASSERT(FileObject->SectionObjectPointer);
@ -101,7 +101,7 @@ CcMapData (
} }
} }
*pBuffer = (PVOID)((ULONG_PTR)(*pBuffer) + ReadOffset % VACB_MAPPING_GRANULARITY); *pBuffer = (PUCHAR)*pBuffer + ReadOffset % VACB_MAPPING_GRANULARITY;
iBcb = ExAllocateFromNPagedLookasideList(&iBcbLookasideList); iBcb = ExAllocateFromNPagedLookasideList(&iBcbLookasideList);
if (iBcb == NULL) if (iBcb == NULL)
{ {