[NTOSKRNL] In CcPurgeCacheSection(), don't assume the file being purged isn't used. Handle that case properly instead of asserting.

This fixes a triggerable ASSERT from umode where you open a file on a CDFS (with MS CDFS) and attempt to lock the volume.
This commit is contained in:
Pierre Schweitzer 2017-11-18 17:53:07 +01:00
parent 4768a371f4
commit 64cb138a67
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B

View file

@ -143,6 +143,7 @@ CcPurgeCacheSection (
PLIST_ENTRY ListEntry;
PROS_VACB Vacb;
LONGLONG ViewEnd;
BOOLEAN Success;
CCTRACE(CC_API_DEBUG, "SectionObjectPointer=%p\n FileOffset=%p Length=%lu UninitializeCacheMaps=%d",
SectionObjectPointer, FileOffset, Length, UninitializeCacheMaps);
@ -169,6 +170,9 @@ CcPurgeCacheSection (
InitializeListHead(&FreeList);
/* Assume success */
Success = TRUE;
KeAcquireGuardedMutex(&ViewLock);
KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
ListEntry = SharedCacheMap->CacheMapVacbListHead.Flink;
@ -189,8 +193,12 @@ CcPurgeCacheSection (
break;
}
ASSERT((Vacb->ReferenceCount == 0) ||
(Vacb->ReferenceCount == 1 && Vacb->Dirty));
/* Still in use, it cannot be purged, fail */
if (Vacb->ReferenceCount != 0 && !Vacb->Dirty)
{
Success = FALSE;
break;
}
/* This VACB is in range, so unlink it and mark for free */
RemoveEntryList(&Vacb->VacbLruListEntry);
@ -213,7 +221,7 @@ CcPurgeCacheSection (
CcRosInternalFreeVacb(Vacb);
}
return TRUE;
return Success;
}