Skip to content

Commit 9e3cbfc

Browse files
committed
net: use Sock in CConnman::ListenSocket
Change `CConnman::ListenSocket` to use a pointer to `Sock` instead of a bare `SOCKET` and use `Sock::Accept()` instead of bare `accept()`. This will help mocking / testing / fuzzing more code.
1 parent f8bd13f commit 9e3cbfc

File tree

2 files changed

+14
-18
lines changed

2 files changed

+14
-18
lines changed

src/net.cpp

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,10 +1098,10 @@ bool CConnman::AttemptToEvictConnection()
10981098
void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
10991099
struct sockaddr_storage sockaddr;
11001100
socklen_t len = sizeof(sockaddr);
1101-
SOCKET hSocket = accept(hListenSocket.socket, (struct sockaddr*)&sockaddr, &len);
1101+
auto sock = hListenSocket.sock->Accept((struct sockaddr*)&sockaddr, &len);
11021102
CAddress addr;
11031103

1104-
if (hSocket == INVALID_SOCKET) {
1104+
if (!sock) {
11051105
const int nErr = WSAGetLastError();
11061106
if (nErr != WSAEWOULDBLOCK) {
11071107
LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr));
@@ -1115,12 +1115,12 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
11151115
addr = CAddress{MaybeFlipIPv6toCJDNS(addr), NODE_NONE};
11161116
}
11171117

1118-
const CAddress addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(hSocket)), NODE_NONE};
1118+
const CAddress addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(sock->Get())), NODE_NONE};
11191119

11201120
NetPermissionFlags permissionFlags = NetPermissionFlags::None;
11211121
hListenSocket.AddSocketPermissionFlags(permissionFlags);
11221122

1123-
CreateNodeFromAcceptedSocket(hSocket, permissionFlags, addr_bind, addr);
1123+
CreateNodeFromAcceptedSocket(sock->Release(), permissionFlags, addr_bind, addr);
11241124
}
11251125

11261126
void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
@@ -1359,7 +1359,7 @@ bool CConnman::GenerateSelectSet(const std::vector<CNode*>& nodes,
13591359
std::set<SOCKET>& error_set)
13601360
{
13611361
for (const ListenSocket& hListenSocket : vhListenSocket) {
1362-
recv_set.insert(hListenSocket.socket);
1362+
recv_set.insert(hListenSocket.sock->Get());
13631363
}
13641364

13651365
for (CNode* pnode : nodes) {
@@ -1640,7 +1640,7 @@ void CConnman::SocketHandlerListening(const std::set<SOCKET>& recv_set)
16401640
if (interruptNet) {
16411641
return;
16421642
}
1643-
if (recv_set.count(listen_socket.socket) > 0) {
1643+
if (recv_set.count(listen_socket.sock->Get()) > 0) {
16441644
AcceptConnection(listen_socket);
16451645
}
16461646
}
@@ -2391,7 +2391,7 @@ bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError,
23912391
return false;
23922392
}
23932393

2394-
vhListenSocket.push_back(ListenSocket(sock->Release(), permissions));
2394+
vhListenSocket.emplace_back(std::move(sock), permissions);
23952395
return true;
23962396
}
23972397

@@ -2700,15 +2700,6 @@ void CConnman::StopNodes()
27002700
DeleteNode(pnode);
27012701
}
27022702

2703-
// Close listening sockets.
2704-
for (ListenSocket& hListenSocket : vhListenSocket) {
2705-
if (hListenSocket.socket != INVALID_SOCKET) {
2706-
if (!CloseSocket(hListenSocket.socket)) {
2707-
LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
2708-
}
2709-
}
2710-
}
2711-
27122703
for (CNode* pnode : m_nodes_disconnected) {
27132704
DeleteNode(pnode);
27142705
}

src/net.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <threadinterrupt.h>
2727
#include <uint256.h>
2828
#include <util/check.h>
29+
#include <util/sock.h>
2930

3031
#include <atomic>
3132
#include <condition_variable>
@@ -947,9 +948,13 @@ class CConnman
947948
private:
948949
struct ListenSocket {
949950
public:
950-
SOCKET socket;
951+
std::shared_ptr<Sock> sock;
951952
inline void AddSocketPermissionFlags(NetPermissionFlags& flags) const { NetPermissions::AddFlag(flags, m_permissions); }
952-
ListenSocket(SOCKET socket_, NetPermissionFlags permissions_) : socket(socket_), m_permissions(permissions_) {}
953+
ListenSocket(std::shared_ptr<Sock> sock_, NetPermissionFlags permissions_)
954+
: sock{sock_}, m_permissions{permissions_}
955+
{
956+
}
957+
953958
private:
954959
NetPermissionFlags m_permissions;
955960
};

0 commit comments

Comments
 (0)