From e8e251abc617e31bc3438c45e2c8c6b086bd9849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Andr=C3=A1ssy?= <10706773+JAndrassy@users.noreply.github.com> Date: Fri, 10 May 2024 16:49:34 +0200 Subject: [PATCH] NetworkClient - close the connection in stop() method (#9542) * fix: NetworkClient - close the connection in stop() method for all copies referring it * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Me No Dev Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Network/src/NetworkClient.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index fb7f2515e9e..7e59d2aa3f3 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -162,7 +162,14 @@ class NetworkClientSocketHandle { NetworkClientSocketHandle(int fd) : sockfd(fd) {} ~NetworkClientSocketHandle() { - close(sockfd); + close(); + } + + void close() { + if (sockfd >= 0) { + ::close(sockfd); + sockfd = -1; + } } int fd() { @@ -177,11 +184,12 @@ NetworkClient::NetworkClient(int fd) : _connected(true), _timeout(WIFI_CLIENT_DE _rxBuffer.reset(new NetworkClientRxBuffer(fd)); } -NetworkClient::~NetworkClient() { - stop(); -} +NetworkClient::~NetworkClient() {} void NetworkClient::stop() { + if (clientSocketHandle) { + clientSocketHandle->close(); + } clientSocketHandle = NULL; _rxBuffer = NULL; _connected = false; @@ -473,7 +481,7 @@ int NetworkClient::read(uint8_t *buf, size_t size) { int NetworkClient::peek() { int res = -1; - if (_rxBuffer) { + if (fd() >= 0 && _rxBuffer) { res = _rxBuffer->peek(); if (_rxBuffer->failed()) { log_e("fail on fd %d, errno: %d, \"%s\"", fd(), errno, strerror(errno)); @@ -484,7 +492,7 @@ int NetworkClient::peek() { } int NetworkClient::available() { - if (!_rxBuffer) { + if (fd() < 0 || !_rxBuffer) { return 0; } int res = _rxBuffer->available(); @@ -502,6 +510,9 @@ void NetworkClient::clear() { } uint8_t NetworkClient::connected() { + if (fd() == -1 && _connected) { + stop(); + } if (_connected) { uint8_t dummy; int res = recv(fd(), &dummy, 0, MSG_DONTWAIT);