From 14e26f5c17b43ffbc3b2467d752386edf46db0af Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 13 Sep 2021 19:11:59 +0200 Subject: [PATCH] Fix: always check before closing TCP handles --- src/json_rpc_request.cpp | 6 ++++-- src/tcp_server.inl | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/json_rpc_request.cpp b/src/json_rpc_request.cpp index 2a2cb4d..7ed54d2 100644 --- a/src/json_rpc_request.cpp +++ b/src/json_rpc_request.cpp @@ -216,8 +216,10 @@ void JSONRPCRequest::on_read(const char* data, size_t size) void JSONRPCRequest::close() { - uv_tcp_t* s = &m_socket; - uv_close(reinterpret_cast(s), on_close); + uv_handle_t* h = reinterpret_cast(&m_socket); + if (!uv_is_closing(h)) { + uv_close(h, on_close); + } } void JSONRPCRequest::on_close(uv_handle_t* handle) diff --git a/src/tcp_server.inl b/src/tcp_server.inl index 6ecc1b3..aa438b0 100644 --- a/src/tcp_server.inl +++ b/src/tcp_server.inl @@ -385,10 +385,16 @@ void TCPServer::close_sockets(bool listen_sockets if (listen_sockets) { for (uv_tcp_t* s : m_listenSockets6) { - uv_close(reinterpret_cast(s), [](uv_handle_t* h) { delete reinterpret_cast(h); }); + uv_handle_t* h = reinterpret_cast(s); + if (!uv_is_closing(h)) { + uv_close(h, [](uv_handle_t* h) { delete reinterpret_cast(h); }); + } } for (uv_tcp_t* s : m_listenSockets) { - uv_close(reinterpret_cast(s), [](uv_handle_t* h) { delete reinterpret_cast(h); }); + uv_handle_t* h = reinterpret_cast(s); + if (!uv_is_closing(h)) { + uv_close(h, [](uv_handle_t* h) { delete reinterpret_cast(h); }); + } } } @@ -621,7 +627,10 @@ void TCPServer::on_connect(uv_connect_t* req, int LOGWARN(5, "failed to connect to " << static_cast(client->m_addrString) << ", error " << uv_err_name(status)); } server->on_connect_failed(client->m_isV6, client->m_addr, client->m_port); - uv_close(reinterpret_cast(&client->m_socket), nullptr); + uv_handle_t* h = reinterpret_cast(&client->m_socket); + if (!uv_is_closing(h)) { + uv_close(h, nullptr); + } server->m_preallocatedClients.push_back(client); return; }