Repository: thrift Updated Branches: refs/heads/master 7726b03ac -> 8f27189df
THRIFT-3069 fix socket leak if fcntl fails This closes #419 commit 467f67d13248c433fc3a9b50882e39837dc62376 Author: Jim King <[email protected]> Date: 2015-04-03T01:01:00Z Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/afc3777f Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/afc3777f Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/afc3777f Branch: refs/heads/master Commit: afc3777f9b0904120369e67585e60e703f20ced8 Parents: 7726b03 Author: Roger Meier <[email protected]> Authored: Tue Apr 14 21:50:31 2015 +0200 Committer: Roger Meier <[email protected]> Committed: Tue Apr 14 21:50:31 2015 +0200 ---------------------------------------------------------------------- lib/cpp/src/thrift/transport/TServerSocket.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/afc3777f/lib/cpp/src/thrift/transport/TServerSocket.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index cb4d1fc..8c8fd73 100644 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -344,13 +344,17 @@ void TServerSocket::listen() { if (flags == -1) { int errno_copy = THRIFT_GET_SOCKET_ERROR; GlobalOutput.perror("TServerSocket::listen() THRIFT_FCNTL() THRIFT_F_GETFL ", errno_copy); - throw TTransportException(TTransportException::NOT_OPEN, "THRIFT_FCNTL() failed", errno_copy); + close(); + throw TTransportException(TTransportException::NOT_OPEN, + "THRIFT_FCNTL() THRIFT_F_GETFL failed", errno_copy); } if (-1 == THRIFT_FCNTL(serverSocket_, THRIFT_F_SETFL, flags | THRIFT_O_NONBLOCK)) { int errno_copy = THRIFT_GET_SOCKET_ERROR; GlobalOutput.perror("TServerSocket::listen() THRIFT_FCNTL() THRIFT_O_NONBLOCK ", errno_copy); - throw TTransportException(TTransportException::NOT_OPEN, "THRIFT_FCNTL() failed", errno_copy); + close(); + throw TTransportException(TTransportException::NOT_OPEN, + "THRIFT_FCNTL() THRIFT_F_SETFL THRIFT_O_NONBLOCK failed", errno_copy); } // prepare the port information @@ -367,7 +371,8 @@ void TServerSocket::listen() { if (len > sizeof(((sockaddr_un*)NULL)->sun_path)) { int errno_copy = THRIFT_GET_SOCKET_ERROR; GlobalOutput.perror("TSocket::listen() Unix Domain socket path too long", errno_copy); - throw TTransportException(TTransportException::NOT_OPEN, " Unix Domain socket path too long"); + throw TTransportException(TTransportException::NOT_OPEN, "Unix Domain socket path too long", + errno_copy); } struct sockaddr_un address; @@ -520,6 +525,7 @@ shared_ptr<TTransport> TServerSocket::acceptImpl() { int flags = THRIFT_FCNTL(clientSocket, THRIFT_F_GETFL, 0); if (flags == -1) { int errno_copy = THRIFT_GET_SOCKET_ERROR; + ::THRIFT_CLOSESOCKET(clientSocket); GlobalOutput.perror("TServerSocket::acceptImpl() THRIFT_FCNTL() THRIFT_F_GETFL ", errno_copy); throw TTransportException(TTransportException::UNKNOWN, "THRIFT_FCNTL(THRIFT_F_GETFL)", @@ -528,6 +534,7 @@ shared_ptr<TTransport> TServerSocket::acceptImpl() { if (-1 == THRIFT_FCNTL(clientSocket, THRIFT_F_SETFL, flags & ~THRIFT_O_NONBLOCK)) { int errno_copy = THRIFT_GET_SOCKET_ERROR; + ::THRIFT_CLOSESOCKET(clientSocket); GlobalOutput .perror("TServerSocket::acceptImpl() THRIFT_FCNTL() THRIFT_F_SETFL ~THRIFT_O_NONBLOCK ", errno_copy);
