Skip to content

Commit be19868

Browse files
committed
merge bitcoin#25426: add new method Sock::GetSockName() that wraps getsockname() and use it in GetBindAddress()
1 parent 6b159f1 commit be19868

File tree

6 files changed

+39
-5
lines changed

6 files changed

+39
-5
lines changed

src/net.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,13 +423,13 @@ bool CConnman::CheckIncomingNonce(uint64_t nonce)
423423
}
424424

425425
/** Get the bind address for a socket as CAddress */
426-
static CAddress GetBindAddress(SOCKET sock)
426+
static CAddress GetBindAddress(const Sock& sock)
427427
{
428428
CAddress addr_bind;
429429
struct sockaddr_storage sockaddr_bind;
430430
socklen_t sockaddr_bind_len = sizeof(sockaddr_bind);
431-
if (sock != INVALID_SOCKET) {
432-
if (!getsockname(sock, (struct sockaddr*)&sockaddr_bind, &sockaddr_bind_len)) {
431+
if (sock.Get() != INVALID_SOCKET) {
432+
if (!sock.GetSockName((struct sockaddr*)&sockaddr_bind, &sockaddr_bind_len)) {
433433
addr_bind.SetSockAddr((const struct sockaddr*)&sockaddr_bind);
434434
} else {
435435
LogPrint(BCLog::NET, "Warning: getsockname failed\n");
@@ -572,7 +572,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
572572
NodeId id = GetNewNodeId();
573573
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
574574
if (!addr_bind.IsValid()) {
575-
addr_bind = GetBindAddress(sock->Get());
575+
addr_bind = GetBindAddress(*sock);
576576
}
577577
CNode* pnode = new CNode(id,
578578
nLocalServices,
@@ -1248,7 +1248,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket, CMasternodeSy
12481248
addr = CAddress{MaybeFlipIPv6toCJDNS(addr), NODE_NONE};
12491249
}
12501250

1251-
const CAddress addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(sock->Get())), NODE_NONE};
1251+
const CAddress addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(*sock)), NODE_NONE};
12521252

12531253
NetPermissionFlags permissionFlags = NetPermissionFlags::None;
12541254
hListenSocket.AddSocketPermissionFlags(permissionFlags);

src/test/fuzz/util.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,20 @@ int FuzzedSock::SetSockOpt(int, int, const void*, socklen_t) const
203203
return 0;
204204
}
205205

206+
int FuzzedSock::GetSockName(sockaddr* name, socklen_t* name_len) const
207+
{
208+
constexpr std::array getsockname_errnos{
209+
ECONNRESET,
210+
ENOBUFS,
211+
};
212+
if (m_fuzzed_data_provider.ConsumeBool()) {
213+
SetFuzzedErrNo(m_fuzzed_data_provider, getsockname_errnos);
214+
return -1;
215+
}
216+
*name_len = m_fuzzed_data_provider.ConsumeData(name, *name_len);
217+
return 0;
218+
}
219+
206220
bool FuzzedSock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occurred) const
207221
{
208222
constexpr std::array wait_errnos{

src/test/fuzz/util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class FuzzedSock : public Sock
7272

7373
int SetSockOpt(int level, int opt_name, const void* opt_val, socklen_t opt_len) const override;
7474

75+
int GetSockName(sockaddr* name, socklen_t* name_len) const override;
76+
7577
bool Wait(std::chrono::milliseconds timeout, Event requested, Event* occurred = nullptr) const override;
7678

7779
bool IsConnected(std::string& errmsg) const override;

src/test/util/net.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ class StaticContentsSock : public Sock
152152

153153
int SetSockOpt(int, int, const void*, socklen_t) const override { return 0; }
154154

155+
int GetSockName(sockaddr* name, socklen_t* name_len) const override
156+
{
157+
std::memset(name, 0x0, *name_len);
158+
return 0;
159+
}
160+
155161
bool Wait(std::chrono::milliseconds timeout,
156162
Event requested,
157163
Event* occurred = nullptr) const override

src/util/sock.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ int Sock::SetSockOpt(int level, int opt_name, const void* opt_val, socklen_t opt
110110
return setsockopt(m_socket, level, opt_name, static_cast<const char*>(opt_val), opt_len);
111111
}
112112

113+
int Sock::GetSockName(sockaddr* name, socklen_t* name_len) const
114+
{
115+
return getsockname(m_socket, name, name_len);
116+
}
117+
113118
bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occurred) const
114119
{
115120
#ifdef USE_POLL

src/util/sock.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ class Sock
173173
const void* opt_val,
174174
socklen_t opt_len) const;
175175

176+
/**
177+
* getsockname(2) wrapper. Equivalent to
178+
* `getsockname(this->Get(), name, name_len)`. Code that uses this
179+
* wrapper can be unit tested if this method is overridden by a mock Sock implementation.
180+
*/
181+
[[nodiscard]] virtual int GetSockName(sockaddr* name, socklen_t* name_len) const;
182+
176183
using Event = uint8_t;
177184

178185
/**

0 commit comments

Comments
 (0)