summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2016-04-27 14:33:30 +0200
committerBenoit Foucher <benoit@zeroc.com>2016-04-27 14:33:30 +0200
commitc62cd6c4d50c7f762aefc76bc36bfa1e34022e72 (patch)
treec1751dc479145b27fe66ccebd56b257b2b3e04f9 /cpp/src
parentAdded ClientPrivate.js to .gitignore (diff)
downloadice-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.cpp20
-rw-r--r--cpp/src/Ice/StreamSocket.cpp20
-rw-r--r--cpp/src/Ice/winrt/StreamTransceiver.cpp14
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;