[CDFS]
authorThomas Faber <thomas.faber@reactos.org>
Fri, 27 Feb 2015 21:30:09 +0000 (21:30 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Fri, 27 Feb 2015 21:30:09 +0000 (21:30 +0000)
- Handle errors from CcInitializeCacheMap and CcCopyRead
CORE-6501

svn path=/trunk/; revision=66478

reactos/drivers/filesystems/cdfs/CMakeLists.txt
reactos/drivers/filesystems/cdfs/cdfs.h
reactos/drivers/filesystems/cdfs/fcb.c
reactos/drivers/filesystems/cdfs/fsctl.c
reactos/drivers/filesystems/cdfs/rw.c

index d8aaaae..4c8bf3c 100644 (file)
@@ -19,6 +19,7 @@ list(APPEND SOURCE
 
 add_library(cdfs SHARED ${SOURCE} cdfs.rc)
 set_module_type(cdfs kernelmodedriver)
+target_link_libraries(cdfs ${PSEH_LIB})
 add_importlibs(cdfs ntoskrnl hal)
 add_pch(cdfs cdfs.h SOURCE)
 add_cd_file(TARGET cdfs DESTINATION reactos/system32/drivers NO_CAB FOR all)
index dd281f0..e11b638 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <ntifs.h>
 #include <ntddcdrm.h>
+#include <pseh/pseh2.h>
 
 #define CDFS_BASIC_SECTOR 2048
 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
index 28e0e8e..ad3a187 100644 (file)
@@ -255,11 +255,23 @@ CdfsFCBInitializeCache(PVCB Vcb,
     Fcb->FileObject = FileObject;
     Fcb->DevExt = Vcb;
 
-    CcInitializeCacheMap(FileObject,
-        (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
-        FALSE,
-        &(CdfsGlobalData->CacheMgrCallbacks),
-        Fcb);
+    _SEH2_TRY
+    {
+        CcInitializeCacheMap(FileObject,
+            (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+            FALSE,
+            &(CdfsGlobalData->CacheMgrCallbacks),
+            Fcb);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        FileObject->FsContext2 = NULL;
+        ExFreePoolWithTag(newCCB, TAG_CCB);
+        ObDereferenceObject(FileObject);
+        Fcb->FileObject = NULL;
+        return _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
 
     ObDereferenceObject(FileObject);
     Fcb->Flags |= FCB_CACHE_INITIALIZED;
@@ -444,11 +456,21 @@ CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
 
     if (CdfsFCBIsDirectory(Fcb))
     {
-        CcInitializeCacheMap(FileObject,
-            (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
-            FALSE,
-            &(CdfsGlobalData->CacheMgrCallbacks),
-            Fcb);
+        _SEH2_TRY
+        {
+            CcInitializeCacheMap(FileObject,
+                (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+                FALSE,
+                &(CdfsGlobalData->CacheMgrCallbacks),
+                Fcb);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            FileObject->FsContext2 = NULL;
+            ExFreePoolWithTag(newCCB, TAG_CCB);
+            return _SEH2_GetExceptionCode();
+        }
+        _SEH2_END;
         Fcb->Flags |= FCB_CACHE_INITIALIZED;
     }
 
index 702f1ad..a6319ce 100644 (file)
@@ -414,11 +414,20 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject,
     Fcb->Entry.ExtentLocationL = 0;
     Fcb->Entry.DataLengthL = (DeviceExt->CdInfo.VolumeSpaceSize + DeviceExt->CdInfo.VolumeOffset) * BLOCKSIZE;
 
-    CcInitializeCacheMap(DeviceExt->StreamFileObject,
-        (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
-        TRUE,
-        &(CdfsGlobalData->CacheMgrCallbacks),
-        Fcb);
+    _SEH2_TRY
+    {
+        CcInitializeCacheMap(DeviceExt->StreamFileObject,
+            (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+            TRUE,
+            &(CdfsGlobalData->CacheMgrCallbacks),
+            Fcb);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+        goto ByeBye;
+    }
+    _SEH2_END;
 
     ExInitializeResourceLite(&DeviceExt->VcbResource);
 
index fbf8050..65bf7a3 100644 (file)
@@ -91,20 +91,37 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt,
                 Fcb->RFCB.ValidDataLength.HighPart,
                 Fcb->RFCB.ValidDataLength.LowPart);
 
-            CcInitializeCacheMap(FileObject,
-                &FileSizes,
-                FALSE,
-                &(CdfsGlobalData->CacheMgrCallbacks),
-                Fcb);
+            _SEH2_TRY
+            {
+                CcInitializeCacheMap(FileObject,
+                    &FileSizes,
+                    FALSE,
+                    &(CdfsGlobalData->CacheMgrCallbacks),
+                    Fcb);
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                return _SEH2_GetExceptionCode();
+            }
+            _SEH2_END;
         }
 
         FileOffset.QuadPart = (LONGLONG)ReadOffset;
-        CcCopyRead(FileObject,
-            &FileOffset,
-            ToRead,
-            TRUE,
-            Buffer,
-            &IoStatus);
+        _SEH2_TRY
+        {
+            CcCopyRead(FileObject,
+                &FileOffset,
+                ToRead,
+                TRUE,
+                Buffer,
+                &IoStatus);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            IoStatus.Information = 0;
+            IoStatus.Status = _SEH2_GetExceptionCode();
+        }
+        _SEH2_END;
         *LengthRead = IoStatus.Information;
 
         Status = IoStatus.Status;