Skip to content

Commit

Permalink
Merge bitcoin#25428: Remove Sock::Release() and CloseSocket()
Browse files Browse the repository at this point in the history
a724c39 net: rename Sock::Reset() to Sock::Close() and make it private (Vasil Dimov)
e8ff3f0 net: remove CloseSocket() (Vasil Dimov)
175fb26 net: remove now unused Sock::Release() (Vasil Dimov)

Pull request description:

  _This is a piece of bitcoin#21878, chopped off to ease review._

  * `Sock::Release()` is unused, thus remove it
  * `CloseSocket()` is only called from `Sock::Reset()`, so move the body of `CloseSocket()` inside `Sock::Reset()` and remove `CloseSocket()` - this helps to hide low level file descriptor sockets inside the `Sock` class.
  * Rename `Sock::Reset()` to `Sock::Close()` and make it `private` - to be used only in the destructor and in the `Sock` assignment operator. This simplifies the public API by removing one method from it.

ACKs for top commit:
  laanwj:
    Code review ACK a724c39

Tree-SHA512: 4b12586642b3d049092fadcb1877132e285ec66a80af92563a7703c6970e278e0f2064fba45c7eaa78eb65db94b3641fd5e5264f7b4f61116d1a6f3333868639
  • Loading branch information
laanwj authored and vijaydasmp committed Jan 3, 2025
1 parent 011d3e8 commit 609b238
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 76 deletions.
2 changes: 1 addition & 1 deletion src/i2p.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ void Session::Disconnect()
Log("Destroying SAM session %s", m_session_id);
}
}
m_control_sock->Reset();
m_control_sock = std::make_unique<Sock>(INVALID_SOCKET);
m_session_id.clear();
}
} // namespace sam
Expand Down
9 changes: 2 additions & 7 deletions src/test/fuzz/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ FuzzedSock::FuzzedSock(FuzzedDataProvider& fuzzed_data_provider)
FuzzedSock::~FuzzedSock()
{
// Sock::~Sock() will be called after FuzzedSock::~FuzzedSock() and it will call
// Sock::Reset() (not FuzzedSock::Reset()!) which will call CloseSocket(m_socket).
// close(m_socket) if m_socket is not INVALID_SOCKET.
// Avoid closing an arbitrary file descriptor (m_socket is just a random very high number which
// theoretically may concide with a real opened file descriptor).
Reset();
m_socket = INVALID_SOCKET;
}

FuzzedSock& FuzzedSock::operator=(Sock&& other)
Expand All @@ -34,11 +34,6 @@ FuzzedSock& FuzzedSock::operator=(Sock&& other)
return *this;
}

void FuzzedSock::Reset()
{
m_socket = INVALID_SOCKET;
}

ssize_t FuzzedSock::Send(const void* data, size_t len, int flags) const
{
constexpr std::array send_errnos{
Expand Down
2 changes: 0 additions & 2 deletions src/test/fuzz/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,6 @@ class FuzzedSock : public Sock

FuzzedSock& operator=(Sock&& other) override;

void Reset() override;

ssize_t Send(const void* data, size_t len, int flags) const override;

ssize_t Recv(void* buf, size_t len, int flags) const override;
Expand Down
18 changes: 0 additions & 18 deletions src/test/sock_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,24 +69,6 @@ BOOST_AUTO_TEST_CASE(move_assignment)
BOOST_CHECK(SocketIsClosed(s));
}

BOOST_AUTO_TEST_CASE(release)
{
SOCKET s = CreateSocket();
Sock* sock = new Sock(s);
BOOST_CHECK_EQUAL(sock->Release(), s);
delete sock;
BOOST_CHECK(!SocketIsClosed(s));
BOOST_REQUIRE(CloseSocket(s));
}

BOOST_AUTO_TEST_CASE(reset)
{
const SOCKET s = CreateSocket();
Sock sock(s);
sock.Reset();
BOOST_CHECK(SocketIsClosed(s));
}

#ifndef WIN32 // Windows does not have socketpair(2).

static void CreateSocketPair(int s[2])
Expand Down
7 changes: 1 addition & 6 deletions src/test/util/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,19 +139,14 @@ class StaticContentsSock : public Sock
m_socket = INVALID_SOCKET - 1;
}

~StaticContentsSock() override { Reset(); }
~StaticContentsSock() override { m_socket = INVALID_SOCKET; }

StaticContentsSock& operator=(Sock&& other) override
{
assert(false && "Move of Sock into MockSock not allowed.");
return *this;
}

void Reset() override
{
m_socket = INVALID_SOCKET;
}

ssize_t Send(const void*, size_t len, int) const override { return len; }

ssize_t Recv(void* buf, size_t len, int flags) const override
Expand Down
45 changes: 18 additions & 27 deletions src/util/sock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,27 +38,18 @@ Sock::Sock(Sock&& other)
other.m_socket = INVALID_SOCKET;
}

Sock::~Sock() { Reset(); }
Sock::~Sock() { Close(); }

Sock& Sock::operator=(Sock&& other)
{
Reset();
Close();
m_socket = other.m_socket;
other.m_socket = INVALID_SOCKET;
return *this;
}

SOCKET Sock::Get() const { return m_socket; }

SOCKET Sock::Release()
{
const SOCKET s = m_socket;
m_socket = INVALID_SOCKET;
return s;
}

void Sock::Reset() { CloseSocket(m_socket); }

ssize_t Sock::Send(const void* data, size_t len, int flags) const
{
return send(m_socket, static_cast<const char*>(data), len, flags);
Expand Down Expand Up @@ -340,6 +331,22 @@ bool Sock::IsConnected(std::string& errmsg) const
}
}

void Sock::Close()
{
if (m_socket == INVALID_SOCKET) {
return;
}
#ifdef WIN32
int ret = closesocket(m_socket);
#else
int ret = close(m_socket);
#endif
if (ret) {
LogPrintf("Error closing socket %d: %s\n", m_socket, NetworkErrorString(WSAGetLastError()));
}
m_socket = INVALID_SOCKET;
}

#ifdef WIN32
std::string NetworkErrorString(int err)
{
Expand Down Expand Up @@ -374,19 +381,3 @@ std::string NetworkErrorString(int err)
return strprintf("%s (%d)", s, err);
}
#endif

bool CloseSocket(SOCKET& hSocket)
{
if (hSocket == INVALID_SOCKET)
return false;
#ifdef WIN32
int ret = closesocket(hSocket);
#else
int ret = close(hSocket);
#endif
if (ret) {
LogPrintf("Socket close failed: %d. Error: %s\n", hSocket, NetworkErrorString(WSAGetLastError()));
}
hSocket = INVALID_SOCKET;
return ret != SOCKET_ERROR;
}
21 changes: 6 additions & 15 deletions src/util/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,18 +113,6 @@ class Sock
*/
[[nodiscard]] virtual SOCKET Get() const;

/**
* Get the value of the contained socket and drop ownership. It will not be closed by the
* destructor after this call.
* @return socket or INVALID_SOCKET if empty
*/
virtual SOCKET Release();

/**
* Close if non-empty.
*/
virtual void Reset();

/**
* send(2) wrapper. Equivalent to `send(this->Get(), data, len, flags);`. Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation.
Expand Down Expand Up @@ -258,12 +246,15 @@ class Sock
* Contained socket. `INVALID_SOCKET` designates the object is empty.
*/
SOCKET m_socket;

private:
/**
* Close `m_socket` if it is not `INVALID_SOCKET`.
*/
void Close();
};

/** Return readable error string for a network error code */
std::string NetworkErrorString(int err);

/** Close socket and set hSocket to INVALID_SOCKET */
bool CloseSocket(SOCKET& hSocket);

#endif // BITCOIN_UTIL_SOCK_H

0 comments on commit 609b238

Please sign in to comment.