[NTOS:CC] Raise status, when CcMapData fails (#3348)
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 9 Feb 2021 08:29:48 +0000 (09:29 +0100)
committerGitHub <noreply@github.com>
Tue, 9 Feb 2021 08:29:48 +0000 (09:29 +0100)
Also add a check in fastfat, that asserts, when CcMapData returns FALSE.

drivers/filesystems/fastfat/fat.c
ntoskrnl/cc/pin.c

index 591e60b..b6e62c6 100644 (file)
@@ -36,7 +36,7 @@ FAT32GetNextCluster(
     PVOID BaseAddress;
     ULONG FATOffset;
     ULONG ChunkSize;
-    PVOID Context;
+    PVOID Context = NULL;
     LARGE_INTEGER Offset;
 
     ChunkSize = CACHEPAGESIZE(DeviceExt);
@@ -44,7 +44,11 @@ FAT32GetNextCluster(
     Offset.QuadPart = ROUND_DOWN(FATOffset, ChunkSize);
     _SEH2_TRY
     {
-        CcMapData(DeviceExt->FATFileObject, &Offset, ChunkSize, MAP_WAIT, &Context, &BaseAddress);
+        if (!CcMapData(DeviceExt->FATFileObject, &Offset, ChunkSize, MAP_WAIT, &Context, &BaseAddress))
+        {
+            NT_ASSERT(FALSE);
+            return STATUS_UNSUCCESSFUL;
+        }
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
index c48f106..3d80bef 100644 (file)
@@ -376,7 +376,6 @@ CcMapData (
             CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
                 SharedCacheMap->FileObject, FileOffset, Length, Flags);
             ExRaiseStatus(Status);
-            return FALSE;
         }
 
         iBcb = CcpGetAppropriateBcb(SharedCacheMap, Vacb, FileOffset, Length, 0, FALSE);
@@ -385,7 +384,8 @@ CcMapData (
             CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE);
             CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
                 SharedCacheMap->FileObject, FileOffset, Length, Flags);
-            return FALSE;
+            *pBcb = NULL; // If you ever remove this for compat, make sure to review all callers for using an unititialized value
+            ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);
         }
     }
     else