From 52c3bace5ac4c93883d4913933a58573abded3e9 Mon Sep 17 00:00:00 2001 From: Peter Scott Date: Thu, 29 Dec 2011 17:30:45 -0700 Subject: [PATCH] Windows: Handle invalid node types In the case where the direntry data is invalid, construct an Fcb of type INVALID so that the direntry can be displayed and the objected deleted even if it cannot be evaluated. Change-Id: I37da154b7429929fe833874c7cd048a3a804a96f Reviewed-on: http://gerrit.openafs.org/6445 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp | 1 + src/WINNT/afsrdr/kernel/lib/AFSClose.cpp | 1 + src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp | 6 ++++-- src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp | 3 +-- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 21 ++++++++++++++++++++- src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp | 9 +++++++++ src/WINNT/afsrdr/kernel/lib/AFSVolumeInfo.cpp | 9 +++++++++ 7 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index e51ca8c..69096ec 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -883,6 +883,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, case AFS_SYMBOLIC_LINK_FCB: case AFS_MOUNT_POINT_FCB: case AFS_DFS_LINK_FCB: + case AFS_INVALID_FCB: { // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp b/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp index a757bb2..938288f 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp @@ -285,6 +285,7 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject, case AFS_SYMBOLIC_LINK_FCB: case AFS_MOUNT_POINT_FCB: case AFS_DFS_LINK_FCB: + case AFS_INVALID_FCB: { pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2; diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index 1b9c5f7..7c3c2d4 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -1977,7 +1977,8 @@ AFSProcessCreate( IN PIRP Irp, } else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB || (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB || - (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB) + (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB || + (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB) { // @@ -2690,7 +2691,8 @@ AFSProcessOpen( IN PIRP Irp, } else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB || pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB || - pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB) + pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB || + pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB) { } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp index bfdbbe8..8fdc8b6 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp @@ -276,8 +276,7 @@ AFSInitFcb( IN AFSDirectoryCB *DirEntry, } else { - ASSERT( FALSE); - try_return( ntStatus = STATUS_INVALID_PARAMETER); + pFcb->Header.NodeTypeCode = AFS_INVALID_FCB; } // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 98811ac..36fe3ac 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -139,6 +139,15 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject, try_return( ntStatus); } + else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB) + { + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSQueryFileInfo request against Invalid Fcb\n"); + + try_return( ntStatus = STATUS_ACCESS_DENIED); + } + // // Process the request // @@ -559,6 +568,16 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject, try_return( ntStatus = STATUS_ACCESS_DENIED); } + if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB && + FileInformationClass != FileDispositionInformation) + { + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSSetFileInfo request against Invalid Fcb\n"); + + try_return( ntStatus = STATUS_ACCESS_DENIED); + } + // // Ensure rename operations are synchronous // @@ -1976,7 +1995,7 @@ AFSSetDispositionInfo( IN PIRP Irp, try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY); } } - else + else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB) { // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp index c6e6b7d..0d14d81 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp @@ -108,6 +108,15 @@ AFSLockControl( IN PDEVICE_OBJECT LibDeviceObject, try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST); } + else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB) + { + + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSLockControl Failing request against Invalid Fcb\n"); + + try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST); + } // // Post the request to the service for checks diff --git a/src/WINNT/afsrdr/kernel/lib/AFSVolumeInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSVolumeInfo.cpp index c481e38..72c1e4c 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSVolumeInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSVolumeInfo.cpp @@ -106,6 +106,15 @@ AFSQueryVolumeInfo( IN PDEVICE_OBJECT LibDeviceObject, try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST); } + else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB) + { + + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSQueryVolumeInfo Failing request against SpecialShare Fcb\n"); + + try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST); + } // // Process the request -- 1.9.4