THRIFT-4283: fix TNamedPipeServer race condition in interrupt
Client: C++
Patch: jn.goor@evs.com
This closes #1368
diff --git a/lib/cpp/src/thrift/transport/TPipeServer.cpp b/lib/cpp/src/thrift/transport/TPipeServer.cpp
index 3bceadf..5923a62 100644
--- a/lib/cpp/src/thrift/transport/TPipeServer.cpp
+++ b/lib/cpp/src/thrift/transport/TPipeServer.cpp
@@ -296,6 +296,10 @@
// if we got here, then we are in an error / shutdown case
DWORD gle = GetLastError(); // save error before doing cleanup
GlobalOutput.perror("TPipeServer ConnectNamedPipe GLE=", gle);
+ if(gle == ERROR_OPERATION_ABORTED) {
+ TAutoCrit lock(pipe_protect_); // Needed to insure concurrent thread to be out of interrupt.
+ throw TTransportException(TTransportException::INTERRUPTED, "TPipeServer: server interupted");
+ }
throw TTransportException(TTransportException::NOT_OPEN, "TPipeServer: client connection failed");
}