Windows: RDR_Initialize must cleanup threads on failure
authorJeffrey Altman <jaltman@your-file-system.com>
Tue, 7 May 2013 22:36:16 +0000 (18:36 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Wed, 8 May 2013 00:44:08 +0000 (17:44 -0700)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/user/RDRInit.cpp

index 96d37b9..9e50be7 100644 (file)
@@ -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);