From b9809e6704817762a1bb4aff89684e84d705de5c Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 27 Feb 2015 21:30:09 +0000 Subject: [PATCH] [CDFS] - Handle errors from CcInitializeCacheMap and CcCopyRead CORE-6501 svn path=/trunk/; revision=66478 --- .../drivers/filesystems/cdfs/CMakeLists.txt | 1 + reactos/drivers/filesystems/cdfs/cdfs.h | 1 + reactos/drivers/filesystems/cdfs/fcb.c | 42 ++++++++++++++----- reactos/drivers/filesystems/cdfs/fsctl.c | 19 ++++++--- reactos/drivers/filesystems/cdfs/rw.c | 39 ++++++++++++----- 5 files changed, 76 insertions(+), 26 deletions(-) diff --git a/reactos/drivers/filesystems/cdfs/CMakeLists.txt b/reactos/drivers/filesystems/cdfs/CMakeLists.txt index d8aaaaeb9c0..4c8bf3ceee6 100644 --- a/reactos/drivers/filesystems/cdfs/CMakeLists.txt +++ b/reactos/drivers/filesystems/cdfs/CMakeLists.txt @@ -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) diff --git a/reactos/drivers/filesystems/cdfs/cdfs.h b/reactos/drivers/filesystems/cdfs/cdfs.h index dd281f027f7..e11b6388f77 100644 --- a/reactos/drivers/filesystems/cdfs/cdfs.h +++ b/reactos/drivers/filesystems/cdfs/cdfs.h @@ -3,6 +3,7 @@ #include #include +#include #define CDFS_BASIC_SECTOR 2048 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16 diff --git a/reactos/drivers/filesystems/cdfs/fcb.c b/reactos/drivers/filesystems/cdfs/fcb.c index 28e0e8ebcf4..ad3a18739e6 100644 --- a/reactos/drivers/filesystems/cdfs/fcb.c +++ b/reactos/drivers/filesystems/cdfs/fcb.c @@ -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; } diff --git a/reactos/drivers/filesystems/cdfs/fsctl.c b/reactos/drivers/filesystems/cdfs/fsctl.c index 702f1ade7a9..a6319ceab5c 100644 --- a/reactos/drivers/filesystems/cdfs/fsctl.c +++ b/reactos/drivers/filesystems/cdfs/fsctl.c @@ -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); diff --git a/reactos/drivers/filesystems/cdfs/rw.c b/reactos/drivers/filesystems/cdfs/rw.c index fbf8050106a..65bf7a3486a 100644 --- a/reactos/drivers/filesystems/cdfs/rw.c +++ b/reactos/drivers/filesystems/cdfs/rw.c @@ -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;