From 5ea6e66433826c9745e4a211bd2801995e35fa5e Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 7 May 2013 18:36:16 -0400 Subject: [PATCH] Windows: RDR_Initialize must cleanup threads on failure If RDR_Initialize() fails after instantiating the worker thread pool it must call RDR_ShutdownFinal() to destroy the pool before exiting. Otherwise, the threads will spin endlessly as each DeviceIoControl call to the redirector fails. Change-Id: I347a509703a44c6b8ca25a084ea10dc0df801eb9 Reviewed-on: http://gerrit.openafs.org/9860 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/user/RDRInit.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/WINNT/afsrdr/user/RDRInit.cpp b/src/WINNT/afsrdr/user/RDRInit.cpp index 96d37b9..9e50be7 100644 --- a/src/WINNT/afsrdr/user/RDRInit.cpp +++ b/src/WINNT/afsrdr/user/RDRInit.cpp @@ -321,8 +321,11 @@ RDR_ProcessWorkerThreads(DWORD numThreads) if( glDevHandle == INVALID_HANDLE_VALUE) { + dwErr = GetLastError(); + free(redirInitInfo); - return GetLastError(); + + return dwErr; } // @@ -338,13 +341,15 @@ RDR_ProcessWorkerThreads(DWORD numThreads) &bytesReturned )) { + dwErr = GetLastError(); + CloseHandle( glDevHandle); glDevHandle = NULL; free(redirInitInfo); - return GetLastError(); + return dwErr; } // @@ -423,13 +428,21 @@ RDR_ProcessWorkerThreads(DWORD numThreads) &bytesReturned )) { + // + // Must kill off the worker threads we spawned. + // + + RDR_ShutdownFinal(); + + dwErr = GetLastError(); + CloseHandle( glDevHandle); glDevHandle = NULL; free(redirInitInfo); - return GetLastError(); + return dwErr; } free(redirInitInfo); -- 1.9.4