Windows: do not leak resource in AFSQueryDirectory
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSDirControl.cpp
index cf7ec7b..5471bee 100644 (file)
@@ -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)
         {