summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/Network.cpp126
1 files changed, 95 insertions, 31 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 85ffdae638f..0c375ed4797 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -200,6 +200,20 @@ IceInternal::createSocket(bool udp)
return fd;
}
+static void
+closeSocketNoThrow(SOCKET fd)
+{
+#ifdef _WIN32
+ int error = WSAGetLastError();
+ closesocket(fd);
+ WSASetLastError(error);
+#else
+ int error = errno;
+ close(fd);
+ errno = error;
+#endif
+}
+
void
IceInternal::closeSocket(SOCKET fd)
{
@@ -294,22 +308,46 @@ IceInternal::setBlock(SOCKET fd, bool block)
{
#ifdef _WIN32
unsigned long arg = 0;
- ioctlsocket(fd, FIONBIO, &arg);
+ if(ioctlsocket(fd, FIONBIO, &arg) == SOCKET_ERROR)
+ {
+ closeSocketNoThrow(fd);
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = WSAGetLastError();
+ throw ex;
+ }
#else
int flags = fcntl(fd, F_GETFL);
flags &= ~O_NONBLOCK;
- fcntl(fd, F_SETFL, flags);
+ if(fcntl(fd, F_SETFL, flags) == SOCKET_ERROR)
+ {
+ closeSocketNoThrow(fd);
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = errno;
+ throw ex;
+ }
#endif
}
else
{
#ifdef _WIN32
unsigned long arg = 1;
- ioctlsocket(fd, FIONBIO, &arg);
+ if(ioctlsocket(fd, FIONBIO, &arg) == SOCKET_ERROR)
+ {
+ closeSocketNoThrow(fd);
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = WSAGetLastError();
+ throw ex;
+ }
#else
int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK;
- fcntl(fd, F_SETFL, flags);
+ if(fcntl(fd, F_SETFL, flags) == SOCKET_ERROR)
+ {
+ closeSocketNoThrow(fd);
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = errno;
+ throw ex;
+ }
#endif
}
}
@@ -320,7 +358,7 @@ IceInternal::setTcpNoDelay(SOCKET fd)
int flag = 1;
if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, int(sizeof(int))) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -333,7 +371,7 @@ IceInternal::setKeepAlive(SOCKET fd)
int flag = 1;
if(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&flag, int(sizeof(int))) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -345,7 +383,7 @@ IceInternal::setSendBufferSize(SOCKET fd, int sz)
{
if(setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&sz, int(sizeof(int))) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -359,7 +397,7 @@ IceInternal::getSendBufferSize(SOCKET fd)
socklen_t len = sizeof(sz);
if(getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&sz, &len) == SOCKET_ERROR || len != sizeof(sz))
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -372,7 +410,7 @@ IceInternal::setRecvBufferSize(SOCKET fd, int sz)
{
if(setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&sz, int(sizeof(int))) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -386,7 +424,7 @@ IceInternal::getRecvBufferSize(SOCKET fd)
socklen_t len = sizeof(sz);
if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&sz, &len) == SOCKET_ERROR || len != sizeof(sz))
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -401,7 +439,7 @@ IceInternal::doBind(SOCKET fd, struct sockaddr_in& addr)
int flag = 1;
if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, int(sizeof(int))) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -410,7 +448,7 @@ IceInternal::doBind(SOCKET fd, struct sockaddr_in& addr)
if(bind(fd, reinterpret_cast<struct sockaddr*>(&addr), int(sizeof(addr))) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -436,7 +474,7 @@ repeatListen:
goto repeatListen;
}
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -461,7 +499,7 @@ IceInternal::doConnect(SOCKET fd, struct sockaddr_in& addr, int timeout)
WSAEVENT event = WSACreateEvent();
if(event == 0)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = WSAGetLastError();
@@ -473,7 +511,7 @@ IceInternal::doConnect(SOCKET fd, struct sockaddr_in& addr, int timeout)
int error = WSAGetLastError();
WSACloseEvent(event);
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = error;
@@ -502,7 +540,7 @@ repeatConnect:
int error = WSAGetLastError();
WSACloseEvent(event);
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = error;
@@ -512,7 +550,7 @@ repeatConnect:
if(rc == WSA_WAIT_TIMEOUT)
{
WSACloseEvent(event);
- closeSocket(fd);
+ closeSocketNoThrow(fd);
assert(timeout >= 0);
throw ConnectTimeoutException(__FILE__, __LINE__);
@@ -524,7 +562,7 @@ repeatConnect:
{
int error = WSAGetLastError();
WSACloseEvent(event);
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = error;
@@ -564,7 +602,7 @@ repeatConnect:
if(ret == 0)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
throw ConnectTimeoutException(__FILE__, __LINE__);
}
else if(ret == SOCKET_ERROR)
@@ -588,7 +626,7 @@ repeatConnect:
socklen_t len = static_cast<socklen_t>(sizeof(int));
if(getsockopt(fd, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&val), &len) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -597,7 +635,7 @@ repeatConnect:
if(val > 0)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
#ifdef _WIN32
WSASetLastError(val);
#else
@@ -626,7 +664,7 @@ repeatConnect:
return;
}
- closeSocket(fd);
+ closeSocketNoThrow(fd);
if(connectionRefused())
{
ConnectionRefusedException ex(__FILE__, __LINE__);
@@ -912,9 +950,9 @@ IceInternal::createPipe(SOCKET fds[2])
throw;
}
- setBlock(fds[0], true);
try
{
+ setBlock(fds[0], true);
doConnect(fds[0], addr, -1);
}
catch(...)
@@ -935,8 +973,17 @@ IceInternal::createPipe(SOCKET fds[2])
}
::closesocket(fd);
-
- setBlock(fds[1], true);
+
+ try
+ {
+ setBlock(fds[1], true);
+ }
+ catch(...)
+ {
+ ::closesocket(fds[0]);
+ ::closesocket(fd);
+ throw;
+ }
#else
@@ -947,8 +994,25 @@ IceInternal::createPipe(SOCKET fds[2])
throw ex;
}
- setBlock(fds[0], true);
- setBlock(fds[1], true);
+ try
+ {
+ setBlock(fds[0], true);
+ }
+ catch(...)
+ {
+ closeSocketNoThrow(fds[1]);
+ throw;
+ }
+
+ try
+ {
+ setBlock(fds[1], true);
+ }
+ catch(...)
+ {
+ closeSocketNoThrow(fds[0]);
+ throw;
+ }
#endif
}
@@ -1194,7 +1258,7 @@ IceInternal::fdToString(SOCKET fd)
struct sockaddr_in localAddr;
if(getsockname(fd, reinterpret_cast<struct sockaddr*>(&localAddr), &localLen) == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -1211,7 +1275,7 @@ IceInternal::fdToString(SOCKET fd)
}
else
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -1272,7 +1336,7 @@ IceInternal::getLocalAddresses()
if(rs == SOCKET_ERROR)
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;
@@ -1338,7 +1402,7 @@ IceInternal::isPeerLocal(SOCKET fd)
}
else
{
- closeSocket(fd);
+ closeSocketNoThrow(fd);
SocketException ex(__FILE__, __LINE__);
ex.error = getSocketErrno();
throw ex;