From b82e2bf9722665169fc50edac2d5b08301c02bf4 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 24 Aug 2014 03:28:01 +0000 Subject: [PATCH] [FASTFAT] - Properly handle errors in CcInitializeCacheMap, CcCopyRead and CcCopyWrite CORE-8410 svn path=/trunk/; revision=63928 --- .../filesystems/fastfat/CMakeLists.txt | 1 + reactos/drivers/filesystems/fastfat/fcb.c | 25 ++++-- reactos/drivers/filesystems/fastfat/fsctl.c | 19 +++-- reactos/drivers/filesystems/fastfat/rw.c | 83 ++++++++++++------- reactos/drivers/filesystems/fastfat/vfat.h | 1 + 5 files changed, 90 insertions(+), 39 deletions(-) diff --git a/reactos/drivers/filesystems/fastfat/CMakeLists.txt b/reactos/drivers/filesystems/fastfat/CMakeLists.txt index fdc90bebc66..40f0988ac27 100644 --- a/reactos/drivers/filesystems/fastfat/CMakeLists.txt +++ b/reactos/drivers/filesystems/fastfat/CMakeLists.txt @@ -26,6 +26,7 @@ list(APPEND SOURCE add_library(fastfat SHARED ${SOURCE} vfatfs.rc) set_module_type(fastfat kernelmodedriver) +target_link_libraries(fastfat ${PSEH_LIB}) add_importlibs(fastfat ntoskrnl hal) add_pch(fastfat vfat.h SOURCE) diff --git a/reactos/drivers/filesystems/fastfat/fcb.c b/reactos/drivers/filesystems/fastfat/fcb.c index a4eef71a64a..fad85a26c10 100644 --- a/reactos/drivers/filesystems/fastfat/fcb.c +++ b/reactos/drivers/filesystems/fastfat/fcb.c @@ -340,12 +340,14 @@ vfatFCBInitializeCacheFromVolume( { PFILE_OBJECT fileObject; PVFATCCB newCCB; + NTSTATUS status; fileObject = IoCreateStreamFileObject (NULL, vcb->StorageDevice); newCCB = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList); if (newCCB == NULL) { + ObDereferenceObject(fileObject); return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory(newCCB, sizeof (VFATCCB)); @@ -356,11 +358,24 @@ vfatFCBInitializeCacheFromVolume( fcb->FileObject = fileObject; fcb->RefCount++; - CcInitializeCacheMap(fileObject, - (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize), - TRUE, - &VfatGlobalData->CacheMgrCallbacks, - fcb); + _SEH2_TRY + { + CcInitializeCacheMap(fileObject, + (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize), + TRUE, + &VfatGlobalData->CacheMgrCallbacks, + fcb); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + status = _SEH2_GetExceptionCode(); + fcb->RefCount--; + fcb->FileObject = NULL; + ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, newCCB); + ObDereferenceObject(fileObject); + return status; + } + _SEH2_END; fcb->Flags |= FCB_CACHE_INITIALIZED; return STATUS_SUCCESS; diff --git a/reactos/drivers/filesystems/fastfat/fsctl.c b/reactos/drivers/filesystems/fastfat/fsctl.c index e196282d2a6..52d485724ef 100644 --- a/reactos/drivers/filesystems/fastfat/fsctl.c +++ b/reactos/drivers/filesystems/fastfat/fsctl.c @@ -550,11 +550,20 @@ VfatMount( Fcb->RFCB.ValidDataLength = Fcb->RFCB.FileSize; Fcb->RFCB.AllocationSize = Fcb->RFCB.FileSize; - CcInitializeCacheMap(DeviceExt->FATFileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - TRUE, - &VfatGlobalData->CacheMgrCallbacks, - Fcb); + _SEH2_TRY + { + CcInitializeCacheMap(DeviceExt->FATFileObject, + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), + TRUE, + &VfatGlobalData->CacheMgrCallbacks, + Fcb); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + goto ByeBye; + } + _SEH2_END; DeviceExt->LastAvailableCluster = 2; ExInitializeResourceLite(&DeviceExt->FatResource); diff --git a/reactos/drivers/filesystems/fastfat/rw.c b/reactos/drivers/filesystems/fastfat/rw.c index 7474c5ba348..72784816ce0 100644 --- a/reactos/drivers/filesystems/fastfat/rw.c +++ b/reactos/drivers/filesystems/fastfat/rw.c @@ -673,22 +673,35 @@ VfatRead( Status = /*STATUS_END_OF_FILE*/STATUS_SUCCESS; } - if (IrpContext->FileObject->PrivateCacheMap == NULL) + _SEH2_TRY { - CcInitializeCacheMap(IrpContext->FileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - FALSE, - &(VfatGlobalData->CacheMgrCallbacks), - Fcb); - } + if (IrpContext->FileObject->PrivateCacheMap == NULL) + { + CcInitializeCacheMap(IrpContext->FileObject, + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), + FALSE, + &(VfatGlobalData->CacheMgrCallbacks), + Fcb); + } - if (!CcCopyRead(IrpContext->FileObject, &ByteOffset, Length, - (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT), Buffer, - &IrpContext->Irp->IoStatus)) + if (!CcCopyRead(IrpContext->FileObject, + &ByteOffset, + Length, + (IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0, + Buffer, + &IrpContext->Irp->IoStatus)) + { + ASSERT((IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0); + Status = STATUS_PENDING; + goto ByeBye; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = STATUS_PENDING; + Status = _SEH2_GetExceptionCode(); goto ByeBye; } + _SEH2_END; if (!NT_SUCCESS(IrpContext->Irp->IoStatus.Status)) { @@ -947,30 +960,42 @@ VfatWrite( { // cached write - if (IrpContext->FileObject->PrivateCacheMap == NULL) + _SEH2_TRY { - CcInitializeCacheMap(IrpContext->FileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - FALSE, - &VfatGlobalData->CacheMgrCallbacks, - Fcb); - } + if (IrpContext->FileObject->PrivateCacheMap == NULL) + { + CcInitializeCacheMap(IrpContext->FileObject, + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), + FALSE, + &VfatGlobalData->CacheMgrCallbacks, + Fcb); + } - if (ByteOffset.QuadPart > OldFileSize.QuadPart) - { - CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE); - } + if (ByteOffset.QuadPart > OldFileSize.QuadPart) + { + CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE); + } - if (CcCopyWrite(IrpContext->FileObject, &ByteOffset, Length, - 1 /*IrpContext->Flags & IRPCONTEXT_CANWAIT*/, Buffer)) - { - IrpContext->Irp->IoStatus.Information = Length; - Status = STATUS_SUCCESS; + if (CcCopyWrite(IrpContext->FileObject, + &ByteOffset, + Length, + TRUE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0*/, + Buffer)) + { + IrpContext->Irp->IoStatus.Information = Length; + Status = STATUS_SUCCESS; + } + else + { + ASSERT(FALSE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0*/); + Status = STATUS_UNSUCCESSFUL; + } } - else + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = STATUS_UNSUCCESSFUL; + Status = _SEH2_GetExceptionCode(); } + _SEH2_END; } else { diff --git a/reactos/drivers/filesystems/fastfat/vfat.h b/reactos/drivers/filesystems/fastfat/vfat.h index 28a047a5b1e..4faab7e0340 100644 --- a/reactos/drivers/filesystems/fastfat/vfat.h +++ b/reactos/drivers/filesystems/fastfat/vfat.h @@ -4,6 +4,7 @@ #include #include #include +#include #define USE_ROS_CC_AND_FS