diff options
author | Benoit Foucher <benoit@zeroc.com> | 2016-04-27 14:33:30 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2016-04-27 14:33:30 +0200 |
commit | c62cd6c4d50c7f762aefc76bc36bfa1e34022e72 (patch) | |
tree | c1751dc479145b27fe66ccebd56b257b2b3e04f9 /cpp/src | |
parent | Added ClientPrivate.js to .gitignore (diff) | |
download | ice-c62cd6c4d50c7f762aefc76bc36bfa1e34022e72.tar.bz2 ice-c62cd6c4d50c7f762aefc76bc36bfa1e34022e72.tar.xz ice-c62cd6c4d50c7f762aefc76bc36bfa1e34022e72.zip |
Fix to no longer close the socket on fdToString failure, the caller is now closing the socket if necessary
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 20 | ||||
-rw-r--r-- | cpp/src/Ice/StreamSocket.cpp | 20 | ||||
-rw-r--r-- | cpp/src/Ice/winrt/StreamTransceiver.cpp | 14 |
3 files changed, 44 insertions, 10 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index 56d3f0314f0..d7c1c22ba92 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -1263,7 +1263,6 @@ IceInternal::fdToLocalAddress(SOCKET fd, Address& addr) socklen_t len = static_cast<socklen_t>(sizeof(sockaddr_storage)); if(getsockname(fd, &addr.sa, &len) == SOCKET_ERROR) { - closeSocketNoThrow(fd); SocketException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); throw ex; @@ -1297,7 +1296,6 @@ IceInternal::fdToRemoteAddress(SOCKET fd, Address& addr) } else { - closeSocketNoThrow(fd); SocketException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); throw ex; @@ -2316,12 +2314,20 @@ repeatConnect: // port as the server). // Address localAddr; - fdToLocalAddress(fd, localAddr); - if(compareAddress(addr, localAddr) == 0) + try { - ConnectionRefusedException ex(__FILE__, __LINE__); - ex.error = 0; // No appropriate errno - throw ex; + fdToLocalAddress(fd, localAddr); + if(compareAddress(addr, localAddr) == 0) + { + ConnectionRefusedException ex(__FILE__, __LINE__); + ex.error = 0; // No appropriate errno + throw ex; + } + } + catch(const LocalException&) + { + closeSocketNoThrow(fd); + throw; } #endif return true; diff --git a/cpp/src/Ice/StreamSocket.cpp b/cpp/src/Ice/StreamSocket.cpp index e11d5709aa4..2f5cb94021f 100644 --- a/cpp/src/Ice/StreamSocket.cpp +++ b/cpp/src/Ice/StreamSocket.cpp @@ -35,7 +35,15 @@ StreamSocket::StreamSocket(const ProtocolInstancePtr& instance, _state = StateConnected; } #endif - _desc = fdToString(_fd, _proxy, _addr); + try + { + _desc = fdToString(_fd, _proxy, _addr); + } + catch(const Ice::Exception&) + { + closeSocketNoThrow(_fd); + throw; + } } StreamSocket::StreamSocket(const ProtocolInstancePtr& instance, SOCKET fd) : @@ -48,7 +56,15 @@ StreamSocket::StreamSocket(const ProtocolInstancePtr& instance, SOCKET fd) : #endif { init(); - _desc = fdToString(fd); + try + { + _desc = fdToString(fd); + } + catch(const Ice::Exception&) + { + closeSocketNoThrow(fd); + throw; + } } StreamSocket::~StreamSocket() diff --git a/cpp/src/Ice/winrt/StreamTransceiver.cpp b/cpp/src/Ice/winrt/StreamTransceiver.cpp index 410604ad0a1..d81dfa61d36 100644 --- a/cpp/src/Ice/winrt/StreamTransceiver.cpp +++ b/cpp/src/Ice/winrt/StreamTransceiver.cpp @@ -352,7 +352,6 @@ IceInternal::StreamTransceiver::StreamTransceiver(const ProtocolInstancePtr& ins NativeInfo(fd), _instance(instance), _state(connected ? StateConnected : StateNeedConnect), - _desc(connected ? fdToString(_fd) : string()), _verified(false) { StreamSocket^ streamSocket = safe_cast<StreamSocket^>(_fd); @@ -360,6 +359,19 @@ IceInternal::StreamTransceiver::StreamTransceiver(const ProtocolInstancePtr& ins _reader = ref new DataReader(streamSocket->InputStream); _reader->InputStreamOptions = InputStreamOptions::Partial; + if(connected) + { + try + { + _desc = fdToString(_fd); + } + catch(const Ice::Exception&) + { + closeSocketNoThrow(_fd); + throw; + } + } + setTcpBufSize(_fd, _instance); _maxSendPacketSize = streamSocket->Control->OutboundBufferSizeInBytes / 2; |