diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2005-09-07 14:58:13 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2005-09-07 14:58:13 +0000 |
commit | 7690582b1095960874a068c47d20e02bbacedc0f (patch) | |
tree | d07a0ccd870c674f1507dfd89b8935468084dc75 /cpp | |
parent | removing bogus condition around setProperty() in exception handler (diff) | |
download | ice-7690582b1095960874a068c47d20e02bbacedc0f.tar.bz2 ice-7690582b1095960874a068c47d20e02bbacedc0f.tar.xz ice-7690582b1095960874a068c47d20e02bbacedc0f.zip |
Bug 371: closeSocket can hide real errors
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 126 |
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; |