From 1b9e3f28b815ae29413c605e92e37198e75228b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Crist=C3=B3v=C3=A3o=20Trevisan?= Date: Tue, 22 Aug 2017 16:19:38 -0300 Subject: [PATCH 1/3] Fixes #3537 --- libraries/ESP8266WiFi/src/WiFiClientSecure.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 7e16e594b2..e6d22bb230 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -605,17 +605,24 @@ extern "C" int __ax_port_read(int fd, uint8_t* buffer, size_t count) } extern "C" void ax_port_read() __attribute__ ((weak, alias("__ax_port_read"))); -extern "C" int __ax_port_write(int fd, uint8_t* buffer, size_t count) -{ +uint8_t ax_port_write_retries = 0; +extern "C" int ax_port_write(int fd, uint8_t* buffer, size_t count) { ClientContext* _client = SSLContext::getIOContext(fd); if (!_client || _client->state() != ESTABLISHED) { errno = EIO; return -1; } - - size_t cb = _client->write(buffer, count); + size_t cb = _client->write((const char*) buffer, count); if (cb != count) { - errno = EAGAIN; + if (++ax_port_write_retries > 0x19) { + DEBUGV("ssl_write: Exceeded max write retries"); + _client->close(); + ax_port_write_retries = 0; + errno = ENOTCONN; + } + else errno = EAGAIN; + } else { + ax_port_write_retries = 0; } return cb; } From 5efa774018cbbc07e9394d1bb1cbc62f37ea7650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Crist=C3=B3v=C3=A3o=20Trevisan?= Date: Tue, 22 Aug 2017 16:27:06 -0300 Subject: [PATCH 2/3] Fixing function name (for 2.4.0) --- libraries/ESP8266WiFi/src/WiFiClientSecure.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index e6d22bb230..aae9707d14 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -606,7 +606,7 @@ extern "C" int __ax_port_read(int fd, uint8_t* buffer, size_t count) extern "C" void ax_port_read() __attribute__ ((weak, alias("__ax_port_read"))); uint8_t ax_port_write_retries = 0; -extern "C" int ax_port_write(int fd, uint8_t* buffer, size_t count) { +extern "C" int __ax_port_write(int fd, uint8_t* buffer, size_t count) { ClientContext* _client = SSLContext::getIOContext(fd); if (!_client || _client->state() != ESTABLISHED) { errno = EIO; From bfa0bc521362d21823e07cfe6c77c5428a657716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Crist=C3=B3v=C3=A3o=20Trevisan?= Date: Tue, 22 Aug 2017 16:33:35 -0300 Subject: [PATCH 3/3] Fixing write parameters (for 2.4.0) --- libraries/ESP8266WiFi/src/WiFiClientSecure.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index aae9707d14..27aa32c850 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -606,13 +606,15 @@ extern "C" int __ax_port_read(int fd, uint8_t* buffer, size_t count) extern "C" void ax_port_read() __attribute__ ((weak, alias("__ax_port_read"))); uint8_t ax_port_write_retries = 0; -extern "C" int __ax_port_write(int fd, uint8_t* buffer, size_t count) { +extern "C" int __ax_port_write(int fd, uint8_t* buffer, size_t count) +{ ClientContext* _client = SSLContext::getIOContext(fd); if (!_client || _client->state() != ESTABLISHED) { errno = EIO; return -1; } - size_t cb = _client->write((const char*) buffer, count); + + size_t cb = _client->write(buffer, count); if (cb != count) { if (++ax_port_write_retries > 0x19) { DEBUGV("ssl_write: Exceeded max write retries");