[FASTFAT]
authorThomas Faber <thomas.faber@reactos.org>
Wed, 5 Nov 2014 19:06:19 +0000 (19:06 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Wed, 5 Nov 2014 19:06:19 +0000 (19:06 +0000)
- Assert that we never reference or dereference an FCB with RefCount 0
CORE-8733

svn path=/trunk/; revision=65270

reactos/drivers/filesystems/fastfat/fcb.c

index d443be3..f2a04e7 100644 (file)
@@ -295,6 +295,7 @@ vfatGrabFCB(
     ASSERT(ExIsResourceAcquiredExclusive(&pVCB->DirResource));
 
     ASSERT(pFCB != pVCB->VolumeFcb);
+    ASSERT(pFCB->RefCount > 0);
     ++pFCB->RefCount;
 }
 
@@ -313,6 +314,7 @@ vfatReleaseFCB(
     while (pFCB)
     {
         ASSERT(pFCB != pVCB->VolumeFcb);
+        ASSERT(pFCB->RefCount > 0);
         pFCB->RefCount--;
         if (pFCB->RefCount == 0)
         {
@@ -497,7 +499,6 @@ vfatFCBInitializeCacheFromVolume(
     fileObject->FsContext = fcb;
     fileObject->FsContext2 = newCCB;
     fcb->FileObject = fileObject;
-    vfatGrabFCB(vcb, fcb);
 
     _SEH2_TRY
     {
@@ -510,7 +511,6 @@ vfatFCBInitializeCacheFromVolume(
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
         status = _SEH2_GetExceptionCode();
-        fcb->RefCount--;
         fcb->FileObject = NULL;
         ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, newCCB);
         ObDereferenceObject(fileObject);
@@ -518,6 +518,7 @@ vfatFCBInitializeCacheFromVolume(
     }
     _SEH2_END;
 
+    vfatGrabFCB(vcb, fcb);
     fcb->Flags |= FCB_CACHE_INITIALIZED;
     return STATUS_SUCCESS;
 }
@@ -663,7 +664,7 @@ vfatMakeFCBFromDirEntry(
     rcFCB->RFCB.FileSize.QuadPart = Size;
     rcFCB->RFCB.ValidDataLength.QuadPart = Size;
     rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, vcb->FatInfo.BytesPerCluster);
-    vfatGrabFCB(vcb, rcFCB);
+    rcFCB->RefCount = 1;
     if (vfatFCBIsDirectory(rcFCB))
     {
         vfatFCBInitializeCacheFromVolume(vcb, rcFCB);