From c295d6b229fc679a38eaea2f0797b7ffb139478d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 2 Dec 2020 12:28:38 +0100 Subject: [PATCH] [NTOS:CC] Fix releasing VACB when an exception is raised in CcZeroData & CcCopyWrite --- ntoskrnl/cc/copy.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ntoskrnl/cc/copy.c b/ntoskrnl/cc/copy.c index ced4271fc9b..17b7a366d17 100644 --- a/ntoskrnl/cc/copy.c +++ b/ntoskrnl/cc/copy.c @@ -557,8 +557,9 @@ CcCopyWrite ( return FALSE; /* FIXME: Honor FileObject FO_WRITE_THROUGH flag */ + ASSERT((FileOffset->QuadPart + Length) <= SharedCacheMap->SectionSize.QuadPart); - ASSERT((FileOffset->QuadPart + Length) <= SharedCacheMap->FileSize.QuadPart); + ASSERT((FileObject->Flags & FO_WRITE_THROUGH) == 0); CurrentOffset = FileOffset->QuadPart; while(CurrentOffset < WriteEnd) @@ -577,7 +578,6 @@ CcCopyWrite ( { if (!CcRosEnsureVacbResident(Vacb, Wait, FALSE, VacbOffset, VacbLength)) { - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE); return FALSE; } @@ -589,7 +589,8 @@ CcCopyWrite ( } _SEH2_FINALLY { - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, TRUE, FALSE); + /* Do not mark the VACB as dirty if an exception was raised */ + CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, !_SEH2_AbnormalTermination(), FALSE); } _SEH2_END; } @@ -821,7 +822,6 @@ CcZeroData ( { if (!CcRosEnsureVacbResident(Vacb, Wait, FALSE, VacbOffset, VacbLength)) { - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE); return FALSE; } @@ -832,7 +832,8 @@ CcZeroData ( } _SEH2_FINALLY { - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, TRUE, FALSE); + /* Do not mark the VACB as dirty if an exception was raised */ + CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, !_SEH2_AbnormalTermination(), FALSE); } _SEH2_END; }