diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 39f57b0637..db59b8321f 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -77,14 +77,14 @@ WiFiClient* SList::_s_first = 0; WiFiClient::WiFiClient() -: _client(0) +: _client(0), _owner(0) { _timeout = 5000; WiFiClient::_add(this); } WiFiClient::WiFiClient(ClientContext* client) -: _client(client) +: _client(client), _owner(0) { _timeout = 5000; _client->ref(); @@ -106,6 +106,7 @@ WiFiClient::WiFiClient(const WiFiClient& other) _client = other._client; _timeout = other._timeout; _localPort = other._localPort; + _owner = other._owner; if (_client) _client->ref(); WiFiClient::_add(this); @@ -118,6 +119,7 @@ WiFiClient& WiFiClient::operator=(const WiFiClient& other) _client = other._client; _timeout = other._timeout; _localPort = other._localPort; + _owner = other._owner; if (_client) _client->ref(); return *this; @@ -382,7 +384,16 @@ void WiFiClient::stopAll() void WiFiClient::stopAllExcept(WiFiClient* except) { + // Stop all will look at the highest-level wrapper connections only + // Find the "except" top-level connection + while (except->_owner) { + except = except->_owner; + } for (WiFiClient* it = _s_first; it; it = it->_next) { + // Find the top-level owner of the current list entry + while (it->_owner) { + it = it->_owner; + } if (it != except) { it->stop(); } diff --git a/libraries/ESP8266WiFi/src/WiFiClient.h b/libraries/ESP8266WiFi/src/WiFiClient.h index e178d3a483..5ada8b1453 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.h +++ b/libraries/ESP8266WiFi/src/WiFiClient.h @@ -144,6 +144,7 @@ class WiFiClient : public Client, public SList { void _err(int8_t err); ClientContext* _client; + WiFiClient* _owner; static uint16_t _localPort; }; diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h index 8ed5edcd9d..977d9b2628 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h @@ -232,8 +232,8 @@ class WiFiClientSecure : public WiFiClient { public: - WiFiClientSecure():_ctx(new WiFiClientSecureCtx()) { } - WiFiClientSecure(const WiFiClientSecure &rhs): WiFiClient(), _ctx(rhs._ctx) { } + WiFiClientSecure():_ctx(new WiFiClientSecureCtx()) { _ctx->_owner = this; } + WiFiClientSecure(const WiFiClientSecure &rhs): WiFiClient(), _ctx(rhs._ctx) { if (_ctx) _ctx->_owner = this; } ~WiFiClientSecure() override { _ctx = nullptr; } WiFiClientSecure& operator=(const WiFiClientSecure&) = default; // The shared-ptrs handle themselves automatically