Browse Source

Test whether created sockets are select()able

0.13
Pieter Wuille 10 years ago
parent
commit
d422f9b1fd
  1. 8
      src/compat.h
  2. 18
      src/net.cpp
  3. 3
      src/netbase.cpp

8
src/compat.h

@ -92,4 +92,12 @@ typedef u_int SOCKET;
size_t strnlen( const char *start, size_t max_len); size_t strnlen( const char *start, size_t max_len);
#endif // HAVE_DECL_STRNLEN #endif // HAVE_DECL_STRNLEN
bool static inline IsSelectableSocket(SOCKET s) {
#ifdef WIN32
return true;
#else
return (s >= 0 && s < FD_SETSIZE);
#endif
}
#endif // BITCOIN_COMPAT_H #endif // BITCOIN_COMPAT_H

18
src/net.cpp

@ -386,6 +386,12 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
if (pszDest ? ConnectSocketByName(addrConnect, hSocket, pszDest, Params().GetDefaultPort(), nConnectTimeout, &proxyConnectionFailed) : if (pszDest ? ConnectSocketByName(addrConnect, hSocket, pszDest, Params().GetDefaultPort(), nConnectTimeout, &proxyConnectionFailed) :
ConnectSocket(addrConnect, hSocket, nConnectTimeout, &proxyConnectionFailed)) ConnectSocket(addrConnect, hSocket, nConnectTimeout, &proxyConnectionFailed))
{ {
if (!IsSelectableSocket(hSocket)) {
LogPrintf("Cannot create connection: non-selectable socket created (fd >= FD_SETSIZE ?)\n");
CloseSocket(hSocket);
return NULL;
}
addrman.Attempt(addrConnect); addrman.Attempt(addrConnect);
// Add node // Add node
@ -949,6 +955,11 @@ void ThreadSocketHandler()
if (nErr != WSAEWOULDBLOCK) if (nErr != WSAEWOULDBLOCK)
LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr)); LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr));
} }
else if (!IsSelectableSocket(hSocket))
{
LogPrintf("connection from %s dropped: non-selectable socket\n", addr.ToString());
CloseSocket(hSocket);
}
else if (nInbound >= nMaxInbound) else if (nInbound >= nMaxInbound)
{ {
LogPrint("net", "connection from %s dropped (full)\n", addr.ToString()); LogPrint("net", "connection from %s dropped (full)\n", addr.ToString());
@ -1597,6 +1608,13 @@ bool BindListenPort(const CService &addrBind, string& strError, bool fWhiteliste
LogPrintf("%s\n", strError); LogPrintf("%s\n", strError);
return false; return false;
} }
if (!IsSelectableSocket(hListenSocket))
{
strError = "Error: Couldn't create a listenable socket for incoming connections";
LogPrintf("%s\n", strError);
return false;
}
#ifndef WIN32 #ifndef WIN32
#ifdef SO_NOSIGPIPE #ifdef SO_NOSIGPIPE

3
src/netbase.cpp

@ -266,6 +266,9 @@ bool static InterruptibleRecv(char* data, size_t len, int timeout, SOCKET& hSock
} else { // Other error or blocking } else { // Other error or blocking
int nErr = WSAGetLastError(); int nErr = WSAGetLastError();
if (nErr == WSAEINPROGRESS || nErr == WSAEWOULDBLOCK || nErr == WSAEINVAL) { if (nErr == WSAEINPROGRESS || nErr == WSAEWOULDBLOCK || nErr == WSAEINVAL) {
if (!IsSelectableSocket(hSocket)) {
return false;
}
struct timeval tval = MillisToTimeval(std::min(endTime - curTime, maxWait)); struct timeval tval = MillisToTimeval(std::min(endTime - curTime, maxWait));
fd_set fdset; fd_set fdset;
FD_ZERO(&fdset); FD_ZERO(&fdset);

Loading…
Cancel
Save