From 237d0ca4093813830786865dcb1a3a23e26bcd3a Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Wed, 23 May 2018 16:27:11 +0200 Subject: [PATCH 1/4] infinite while loop fix write() and clientWrite() Reimplemented return logic in BearSSLClient::write() and BearSSLClient::clientWrite() in order to avoid infinite loop in https://github.com/Rocketct/ArduinoBearSSL/blob/master/src/bearssl/ssl_io.c#L279 when networking error happend in low level client(GSMClient) --- src/BearSSLClient.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/BearSSLClient.cpp b/src/BearSSLClient.cpp index e029f9d..09748f5 100644 --- a/src/BearSSLClient.cpp +++ b/src/BearSSLClient.cpp @@ -41,15 +41,16 @@ int BearSSLClient::connect(const char* host, uint16_t port) size_t BearSSLClient::write(uint8_t b) { + return write(&b, sizeof(b)); } size_t BearSSLClient::write(const uint8_t *buf, size_t size) { br_sslio_write_all(&_ioc, buf, size); - br_sslio_flush(&_ioc); + int ret = br_sslio_flush(&_ioc); - return size; + return ret<0?0:size; } int BearSSLClient::available() @@ -289,5 +290,5 @@ int BearSSLClient::clientWrite(void *ctx, const unsigned char *buf, size_t len) int w = c->write(buf, len); - return w; + return w>0?w:-1; } From 90d7d18fb2d3c5504ec90fb7623fb0d051edeea4 Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Wed, 20 Jun 2018 11:12:58 +0200 Subject: [PATCH 2/4] Modified BearSSLClient::write Reimplemented logic of BearSSLClient::write(const uint8_t *buf, size_t size) function --- src/BearSSLClient.cpp | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/BearSSLClient.cpp b/src/BearSSLClient.cpp index 09748f5..27d4d82 100644 --- a/src/BearSSLClient.cpp +++ b/src/BearSSLClient.cpp @@ -47,10 +47,24 @@ size_t BearSSLClient::write(uint8_t b) size_t BearSSLClient::write(const uint8_t *buf, size_t size) { - br_sslio_write_all(&_ioc, buf, size); - int ret = br_sslio_flush(&_ioc); + size_t written = 0; - return ret<0?0:size; + while (written < size) { + int result = br_sslio_write(&_ioc, buf, size); + + if (result < 0) { + break; + } + + buf += result; + written += result; + } + + if (written == size && br_sslio_flush(&_ioc) < 0) { + return 0; + } + + return written; } int BearSSLClient::available() @@ -241,17 +255,16 @@ int BearSSLClient::clientRead(void *ctx, unsigned char *buf, size_t len) return -1; } - int r = c->read(buf, len); - - if (r == -1) { + int result = c->read(buf, len); + if (result == -1) { return 0; } #ifdef DEBUGSERIAL DEBUGSERIAL.print("BearSSLClient::clientRead - "); - DEBUGSERIAL.print(r); + DEBUGSERIAL.print(result); DEBUGSERIAL.print(" - "); - for (size_t i = 0; i < r; i++) { + for (size_t i = 0; i < result; i++) { byte b = buf[i]; if (b < 16) { @@ -262,7 +275,7 @@ int BearSSLClient::clientRead(void *ctx, unsigned char *buf, size_t len) DEBUGSERIAL.println(); #endif - return r; + return result; } int BearSSLClient::clientWrite(void *ctx, const unsigned char *buf, size_t len) @@ -288,7 +301,10 @@ int BearSSLClient::clientWrite(void *ctx, const unsigned char *buf, size_t len) return -1; } - int w = c->write(buf, len); + int result = c->write(buf, len); + if (result == 0) { + return -1; + } - return w>0?w:-1; + return result; } From b0336cec05da62365940bebfb6226000dee6027f Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Wed, 20 Jun 2018 11:23:33 +0200 Subject: [PATCH 3/4] fixed whitespace --- src/BearSSLClient.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/BearSSLClient.cpp b/src/BearSSLClient.cpp index 27d4d82..80709d4 100644 --- a/src/BearSSLClient.cpp +++ b/src/BearSSLClient.cpp @@ -41,7 +41,6 @@ int BearSSLClient::connect(const char* host, uint16_t port) size_t BearSSLClient::write(uint8_t b) { - return write(&b, sizeof(b)); } From f5bdb7f1b3b696c97e91233d085965fb1811dce3 Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Wed, 20 Jun 2018 11:28:13 +0200 Subject: [PATCH 4/4] fixed whitespace --- src/BearSSLClient.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BearSSLClient.cpp b/src/BearSSLClient.cpp index 80709d4..924558e 100644 --- a/src/BearSSLClient.cpp +++ b/src/BearSSLClient.cpp @@ -51,12 +51,12 @@ size_t BearSSLClient::write(const uint8_t *buf, size_t size) while (written < size) { int result = br_sslio_write(&_ioc, buf, size); - if (result < 0) { - break; - } + if (result < 0) { + break; + } - buf += result; - written += result; + buf += result; + written += result; } if (written == size && br_sslio_flush(&_ioc) < 0) {