From: Jeffrey Altman Date: Fri, 4 Nov 2011 12:40:03 +0000 (-0400) Subject: Windows: do not leak resource in AFSQueryDirectory X-Git-Tag: upstream/1.8.0_pre1^2~3083 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=3acd9b854e05748578f8291200fad8c6650e9b14;p=packages%2Fo%2Fopenafs.git Windows: do not leak resource in AFSQueryDirectory Track whether or not the pFcb->NPFcb->Resource is held so it can be released in all error paths. Change-Id: I8c8bfb912329e8c11ac7857086412d85aa64fea6 Reviewed-on: http://gerrit.openafs.org/5804 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp index cf7ec7be6..5471bee56 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSDirControl.cpp @@ -141,6 +141,7 @@ AFSQueryDirectory( IN PIRP Irp) ULONG ulBytesConverted; AFSDirectoryCB *pDirEntry = NULL; BOOLEAN bReleaseMain = FALSE; + BOOLEAN bReleaseFcb = FALSE; ULONG ulTargetFileType = AFS_FILE_TYPE_UNKNOWN; AFSFileInfoCB stFileInfo; BOOLEAN bUseFileInfo = TRUE; @@ -221,6 +222,8 @@ AFSQueryDirectory( IN PIRP Irp) AFSAcquireExcl( &pFcb->NPFcb->Resource, TRUE); + bReleaseFcb = TRUE; + // // Tell the service to prime the cache of the directory content // @@ -231,8 +234,6 @@ AFSQueryDirectory( IN PIRP Irp) if( !NT_SUCCESS( ntStatus)) { - AFSReleaseResource( &pFcb->NPFcb->Resource); - AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_ERROR, "AFSQueryDirectory Enumerate directory failure for parent %wZ Mask %wZ Status %08lX\n", @@ -259,6 +260,8 @@ AFSQueryDirectory( IN PIRP Irp) AFSAcquireShared( &pFcb->NPFcb->Resource, TRUE); + + bReleaseFcb = TRUE; } // @@ -336,6 +339,8 @@ AFSQueryDirectory( IN PIRP Irp) AFSReleaseResource( &pFcb->NPFcb->Resource); + bReleaseFcb = FALSE; + // // Start processing the data // @@ -973,6 +978,12 @@ try_exit: AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock); } + if ( bReleaseFcb) + { + + AFSReleaseResource( &pFcb->NPFcb->Resource); + } + if( pFcb != NULL) {