From: Jeffrey Altman Date: Tue, 7 May 2013 22:36:16 +0000 (-0400) Subject: Windows: RDR_Initialize must cleanup threads on failure X-Git-Tag: upstream/1.8.0_pre1^2~1177 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=5ea6e66433826c9745e4a211bd2801995e35fa5e;p=packages%2Fo%2Fopenafs.git 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 --- diff --git a/src/WINNT/afsrdr/user/RDRInit.cpp b/src/WINNT/afsrdr/user/RDRInit.cpp index 96d37b921..9e50be7ce 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);