From 5b2ae10ebf64593b8af76ff4b3b4d0113bc56527 Mon Sep 17 00:00:00 2001 From: johnm545 <52096239+johnm545@users.noreply.github.com> Date: Mon, 26 Aug 2019 22:32:45 +1000 Subject: [PATCH 1/4] Fix WiFiClientSecure::available blocking Added a check of WiFiClient::availableForWrite to prevent blocking writes when the _run_until blocking flag is false --- .../src/WiFiClientSecureBearSSL.cpp | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index c5a09cedbe..4c5ad2d06e 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -437,12 +437,9 @@ int WiFiClientSecure::_run_until(unsigned target, bool blocking) { DEBUG_BSSL("_run_until: Not connected\n"); return -1; } - for (int no_work = 0; blocking || no_work < 2;) { - if (blocking) { - // Only for blocking operations can we afford to yield() - optimistic_yield(100); - } - + for (int no_work = 0; blocking || no_work < 2;) { + optimistic_yield(100); + int state; state = br_ssl_engine_current_state(_eng); if (state & BR_SSL_CLOSED) { @@ -461,8 +458,19 @@ int WiFiClientSecure::_run_until(unsigned target, bool blocking) { unsigned char *buf; size_t len; int wlen; + int availForWrite; buf = br_ssl_engine_sendrec_buf(_eng, &len); + availForWrite = WiFiClient::availableForWrite(); + + if (!blocking && len > availForWrite) { + /* + writes on WiFiClient will block if len > availableForWrite() + this is needed to prevent available() calls from blocking + on dropped connections + */ + len = availForWrite; + } wlen = WiFiClient::write(buf, len); if (wlen <= 0) { /* From f91842edeef2b4df972d3d5f8b8a9d0054ea2fa6 Mon Sep 17 00:00:00 2001 From: johnm545 <52096239+johnm545@users.noreply.github.com> Date: Tue, 27 Aug 2019 00:43:34 +1000 Subject: [PATCH 2/4] change availForWrite from int to size_t --- libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index 4c5ad2d06e..f58f1c98a9 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -458,7 +458,7 @@ int WiFiClientSecure::_run_until(unsigned target, bool blocking) { unsigned char *buf; size_t len; int wlen; - int availForWrite; + size_t availForWrite; buf = br_ssl_engine_sendrec_buf(_eng, &len); availForWrite = WiFiClient::availableForWrite(); From 2cc92dab629b330fa1a5fab6c6dff20b59a1ff66 Mon Sep 17 00:00:00 2001 From: johnm545 <52096239+johnm545@users.noreply.github.com> Date: Sat, 31 Aug 2019 16:26:57 +1000 Subject: [PATCH 3/4] add timeout to _run_until loop fixes #6464 --- libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index f58f1c98a9..e37b57977c 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -437,9 +437,16 @@ int WiFiClientSecure::_run_until(unsigned target, bool blocking) { DEBUG_BSSL("_run_until: Not connected\n"); return -1; } + + unsigned long startMillis = millis(); for (int no_work = 0; blocking || no_work < 2;) { optimistic_yield(100); + if (millis() - startMillis > 30000) { + DEBUG_BSSL("_run_until: Timeout\n"); + return -1; + } + int state; state = br_ssl_engine_current_state(_eng); if (state & BR_SSL_CLOSED) { From 01cbc6095d67f2a28eee32d876841c51f39d3cd5 Mon Sep 17 00:00:00 2001 From: johnm545 <52096239+johnm545@users.noreply.github.com> Date: Tue, 17 Sep 2019 00:14:40 +1000 Subject: [PATCH 4/4] use polledTimeout with _timeout millis --- libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index e37b57977c..773f68cfdc 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -32,6 +32,7 @@ extern "C" { } #include "debug.h" #include "ESP8266WiFi.h" +#include "PolledTimeout.h" #include "WiFiClient.h" #include "WiFiClientSecureBearSSL.h" #include "StackThunk.h" @@ -438,11 +439,12 @@ int WiFiClientSecure::_run_until(unsigned target, bool blocking) { return -1; } - unsigned long startMillis = millis(); + esp8266::polledTimeout::oneShotMs loopTimeout(_timeout); + for (int no_work = 0; blocking || no_work < 2;) { optimistic_yield(100); - if (millis() - startMillis > 30000) { + if (loopTimeout) { DEBUG_BSSL("_run_until: Timeout\n"); return -1; }