From 9b6f79108725dc5b6d4cbea4697199e5e745dc99 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 27 Nov 2013 12:26:44 -0500 Subject: [PATCH] Windows: RDR capture Cc/Mm exceptions do not break All of the Cc and Mm functions are wrapped in try/except blocks. The purpose is to ensure that Cc and Mm do not return an error as an exception which could result in the afs redirector failing to release a resource. Instead of calling the AFS exception handler just handle the exception with EXCEPTION_EXECUTE_HANDLER. This permits the __except block to capture the exception code. The AFS exception handler will throw its own exception if the AFSDebugFlags AFS_DBG_BUGCHECK_EXCEPTION bit is set. This is helpful when debugging exceptions thrown by errors in the afs redirector code. It is not helpful when a Cc function throws an exception. For example, CcReadCopy() will throw STATUS_DELETE_FILE as an exception if an attempt to read from a deleted file is initiated. This should simply fail the read operation not BSOD the system. Change-Id: I2fd1d4db530600441272e59353fbf28b831e2691 Reviewed-on: http://gerrit.openafs.org/10524 Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp | 2 +- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 2 +- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 253 ++++++++++++++++++---------- src/WINNT/afsrdr/kernel/lib/AFSRead.cpp | 8 +- src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp | 10 +- 5 files changed, 172 insertions(+), 103 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index 27e301f..5fa79a3 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -328,7 +328,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, NULL, NULL); } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index b0f8f53..71b7d00 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -2272,7 +2272,7 @@ AFSSetDispositionInfo( IN PIRP Irp, } } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { bMmFlushed = FALSE; diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index c889513..7151a28 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -1941,7 +1941,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo, } } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -3160,7 +3160,7 @@ AFSVerifyEntry( IN GUID *AuthGroup, } } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -4371,7 +4371,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry, } } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -7051,7 +7051,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb, } } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -7247,7 +7247,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb, } } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -9335,7 +9335,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA); } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -9483,7 +9483,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, bCleanExtents = TRUE; } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -9564,28 +9564,46 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart; - if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL && - !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, - &ByteRangeList[ulIndex].FileOffset, - ulSize, - FALSE)) - { - - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_WARNING, - "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", - ObjectInfo->FileId.Cell, - ObjectInfo->FileId.Volume, - ObjectInfo->FileId.Vnode, - ObjectInfo->FileId.Unique)); - - bPurgeOnClose = TRUE; - } - else - { - - bCleanExtents = TRUE; - } + __try + { + + if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL && + !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + &ByteRangeList[ulIndex].FileOffset, + ulSize, + FALSE)) + { + + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_WARNING, + "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique)); + + bPurgeOnClose = TRUE; + } + else + { + + bCleanExtents = TRUE; + } + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (1) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique, + ntStatus)); + } ByteRangeList[ulIndex].Length.QuadPart -= ulSize; @@ -9623,27 +9641,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY)) { - if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, - &pEntry->FileOffset, - pEntry->Size, - FALSE)) - { - - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_WARNING, - "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", - ObjectInfo->FileId.Cell, - ObjectInfo->FileId.Volume, - ObjectInfo->FileId.Vnode, - ObjectInfo->FileId.Unique)); - - bPurgeOnClose = TRUE; - } - else - { - - bCleanExtents = TRUE; - } + __try + { + if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + &pEntry->FileOffset, + pEntry->Size, + FALSE)) + { + + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_WARNING, + "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique)); + + bPurgeOnClose = TRUE; + } + else + { + + bCleanExtents = TRUE; + } + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (2) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique, + ntStatus)); + } } if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart) @@ -9663,27 +9698,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, ulFlushLength = liFlushLength.LowPart; } - if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, - &liCurrentOffset, - ulFlushLength, - FALSE)) - { - - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_WARNING, - "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", - ObjectInfo->FileId.Cell, - ObjectInfo->FileId.Volume, - ObjectInfo->FileId.Vnode, - ObjectInfo->FileId.Unique)); - - bPurgeOnClose = TRUE; - } - else - { - - bCleanExtents = TRUE; - } + __try + { + if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + &liCurrentOffset, + ulFlushLength, + FALSE)) + { + + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_WARNING, + "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique)); + + bPurgeOnClose = TRUE; + } + else + { + + bCleanExtents = TRUE; + } + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (3) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique, + ntStatus)); + } liFlushLength.QuadPart -= ulFlushLength; } @@ -9697,27 +9749,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, } else { - if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, - NULL, - 0, - FALSE)) - { - - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_WARNING, - "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", - ObjectInfo->FileId.Cell, - ObjectInfo->FileId.Volume, - ObjectInfo->FileId.Vnode, - ObjectInfo->FileId.Unique)); - - bPurgeOnClose = TRUE; - } - else - { - - bCleanExtents = TRUE; - } + __try + { + if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + NULL, + 0, + FALSE)) + { + + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_WARNING, + "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique)); + + bPurgeOnClose = TRUE; + } + else + { + + bCleanExtents = TRUE; + } + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (4) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n", + ObjectInfo->FileId.Cell, + ObjectInfo->FileId.Volume, + ObjectInfo->FileId.Vnode, + ObjectInfo->FileId.Unique, + ntStatus)); + } } if ( bPurgeOnClose) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp b/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp index 723429d..32575af 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp @@ -128,7 +128,7 @@ AFSCachedRead( IN PDEVICE_OBJECT DeviceObject, try_return( ntStatus = Irp->IoStatus.Status); } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -1155,7 +1155,7 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject, try_return( ntStatus = STATUS_SUCCESS ); } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -1339,7 +1339,7 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject, CcSetDirtyPageThreshold( pFileObject, AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096); } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -1376,7 +1376,7 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject, &Irp->IoStatus); ntStatus = Irp->IoStatus.Status; } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp index 05a715d..141fccd 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp @@ -386,7 +386,7 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject, CcSetDirtyPageThreshold( pFileObject, AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096); } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -829,7 +829,7 @@ try_exit: SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { DWORD ntStatus2 = GetExceptionCode(); @@ -1848,7 +1848,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject, ntStatus = Irp->IoStatus.Status; } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -1946,7 +1946,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject, try_return( ntStatus = STATUS_UNSUCCESSFUL); } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); @@ -1998,7 +1998,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject, try_return( ntStatus = iosbFlush.Status); } } - __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation())) + __except( EXCEPTION_EXECUTE_HANDLER) { ntStatus = GetExceptionCode(); -- 1.9.4