From 9e3b2f576bb368a0857e808dcbd24b2dcb8bef2d Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Mon, 2 Oct 2017 14:18:32 -0400 Subject: [PATCH] net: Move IsSelectableSocket check into socket creation We use select in ConnectSocketDirectly, so this check needs to happen before that. IsSelectableSocket will not be relevant after upcoming changes to remove select. --- src/net.cpp | 27 +++++++++++---------------- src/netbase.cpp | 6 ++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 8f15842150f..07128a03495 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -446,24 +446,19 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo SplitHostPort(std::string(pszDest), port, host); connected = ConnectThroughProxy(proxy, host, port, hSocket, nConnectTimeout, nullptr); } - if (connected) { - if (!IsSelectableSocket(hSocket)) { - LogPrintf("Cannot create connection: non-selectable socket created (fd >= FD_SETSIZE ?)\n"); - CloseSocket(hSocket); - return nullptr; - } - - // Add node - NodeId id = GetNewNodeId(); - uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize(); - CAddress addr_bind = GetBindAddress(hSocket); - CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addrConnect, CalculateKeyedNetGroup(addrConnect), nonce, addr_bind, pszDest ? pszDest : "", false); - pnode->AddRef(); - - return pnode; + if (!connected) { + CloseSocket(hSocket); + return nullptr; } - return nullptr; + // Add node + NodeId id = GetNewNodeId(); + uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize(); + CAddress addr_bind = GetBindAddress(hSocket); + CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addrConnect, CalculateKeyedNetGroup(addrConnect), nonce, addr_bind, pszDest ? pszDest : "", false); + pnode->AddRef(); + + return pnode; } void CConnman::DumpBanlist() diff --git a/src/netbase.cpp b/src/netbase.cpp index 9b63d603420..1635957b7f0 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -465,6 +465,12 @@ SOCKET CreateSocket(const CService &addrConnect) if (hSocket == INVALID_SOCKET) return INVALID_SOCKET; + if (!IsSelectableSocket(hSocket)) { + CloseSocket(hSocket); + LogPrintf("Cannot create connection: non-selectable socket created (fd >= FD_SETSIZE ?)\n"); + return INVALID_SOCKET; + } + #ifdef SO_NOSIGPIPE int set = 1; // Different way of disabling SIGPIPE on BSD