From ebdaedff4bab01794acd1122108e64e0c002b170 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 28 Sep 2015 19:31:54 +0300 Subject: [PATCH] More error checks in WiFiClientSecure --- .../ESP8266WiFi/src/WiFiClientSecure.cpp | 39 ++++++++++++++++++- libraries/ESP8266WiFi/src/WiFiClientSecure.h | 1 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 4aec1af90..7953e0623 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -130,10 +130,19 @@ public: protected: int _readAll() { + if (!_ssl) + return 0; + uint8_t* data; int rc = ssl_read(_ssl, &data); - if (rc <= 0) + if (rc <= 0) { + if (rc < SSL_OK && rc != SSL_CLOSE_NOTIFY && rc != SSL_ERROR_CONN_LOST) { + ssl_free(_ssl); + _ssl = nullptr; + } return 0; + } + if (rc > _rxbuf->room()) { DEBUGV("WiFiClientSecure rx overflow"); @@ -219,6 +228,9 @@ int WiFiClientSecure::_connectSSL() { } size_t WiFiClientSecure::write(const uint8_t *buf, size_t size) { + if (!_ssl) + return 0; + int rc = ssl_write(*_ssl, buf, size); if (rc >= 0) return rc; @@ -227,21 +239,43 @@ size_t WiFiClientSecure::write(const uint8_t *buf, size_t size) { } int WiFiClientSecure::read(uint8_t *buf, size_t size) { + if (!_ssl) + return 0; + return _ssl->read(buf, size); } int WiFiClientSecure::read() { + if (!_ssl) + return -1; + return _ssl->read(); } int WiFiClientSecure::peek() { + if (!_ssl) + return -1; + return _ssl->peek(); } int WiFiClientSecure::available() { + if (!_ssl) + return 0; + return _ssl->available(); } +uint8_t WiFiClientSecure::connected() { + if (_client->state() == ESTABLISHED) + return 1; + + if (!_ssl) + return 0; + + return _ssl->available() > 0; +} + void WiFiClientSecure::stop() { if (_ssl) { _ssl->unref(); @@ -264,6 +298,9 @@ static bool parseHexNibble(char pb, uint8_t* res) { } bool WiFiClientSecure::verify(const char* fp, const char* url) { + if (!_ssl) + return false; + uint8_t sha1[20]; int len = strlen(fp); int pos = 0; diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.h b/libraries/ESP8266WiFi/src/WiFiClientSecure.h index 3b3d2907c..f3d377e8d 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.h +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.h @@ -40,6 +40,7 @@ public: bool verify(const char* fingerprint, const char* url); + uint8_t connected() override; size_t write(const uint8_t *buf, size_t size) override; int read(uint8_t *buf, size_t size) override; int available() override;