From 912c0db0910752d029d329ad20cbff8316a1db08 Mon Sep 17 00:00:00 2001 From: Dave <47106837+sislakd@users.noreply.github.com> Date: Sun, 19 May 2019 22:38:24 +0200 Subject: [PATCH] Remove deadlock when server is not acking our data (#6107) * Use bounded waiting instead of infinite one to avoid deadlock * Reduce timeout to fail much sooner if server is not acking our data * Return timeout to 15 seconds on every disconnect * Add comment to introduced delay to make it super clear --- libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp | 4 ++++ libraries/ESP8266WiFi/src/include/ClientContext.h | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index 7ae53e6b9..b71a5fa7b 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -248,6 +248,7 @@ void WiFiClientSecure::_freeSSL() { _recvapp_len = 0; // This connection is toast _handshake_done = false; + _timeout = 15000; } bool WiFiClientSecure::_clientConnected() { @@ -1009,6 +1010,9 @@ bool WiFiClientSecure::_connectSSL(const char* hostName) { _x509_insecure = nullptr; _x509_knownkey = nullptr; + // reduce timeout after successful handshake to fail fast if server stop accepting our data for whathever reason + if (ret) _timeout = 5000; + return ret; } diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index 0126621a6..2f2891510 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -456,7 +456,8 @@ protected: } _send_waiting = true; - esp_yield(); + // This delay will be interrupted by esp_schedule on next received ack + delay(_timeout_ms); } while(true); _send_waiting = false;