Skip to content

Commit cd861c0

Browse files
Rocketctsandeepmistry
authored andcommitted
infinite while loop fix write() and clientWrite() (#2)
* 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) * Reimplemented logic of BearSSLClient::write(const uint8_t *buf, size_t size) function
1 parent a503bdf commit cd861c0

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

Diff for: src/BearSSLClient.cpp

+27-11
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,24 @@ size_t BearSSLClient::write(uint8_t b)
4646

4747
size_t BearSSLClient::write(const uint8_t *buf, size_t size)
4848
{
49-
br_sslio_write_all(&_ioc, buf, size);
50-
br_sslio_flush(&_ioc);
49+
size_t written = 0;
50+
51+
while (written < size) {
52+
int result = br_sslio_write(&_ioc, buf, size);
53+
54+
if (result < 0) {
55+
break;
56+
}
57+
58+
buf += result;
59+
written += result;
60+
}
5161

52-
return size;
62+
if (written == size && br_sslio_flush(&_ioc) < 0) {
63+
return 0;
64+
}
65+
66+
return written;
5367
}
5468

5569
int BearSSLClient::available()
@@ -240,17 +254,16 @@ int BearSSLClient::clientRead(void *ctx, unsigned char *buf, size_t len)
240254
return -1;
241255
}
242256

243-
int r = c->read(buf, len);
244-
245-
if (r == -1) {
257+
int result = c->read(buf, len);
258+
if (result == -1) {
246259
return 0;
247260
}
248261

249262
#ifdef DEBUGSERIAL
250263
DEBUGSERIAL.print("BearSSLClient::clientRead - ");
251-
DEBUGSERIAL.print(r);
264+
DEBUGSERIAL.print(result);
252265
DEBUGSERIAL.print(" - ");
253-
for (size_t i = 0; i < r; i++) {
266+
for (size_t i = 0; i < result; i++) {
254267
byte b = buf[i];
255268

256269
if (b < 16) {
@@ -261,7 +274,7 @@ int BearSSLClient::clientRead(void *ctx, unsigned char *buf, size_t len)
261274
DEBUGSERIAL.println();
262275
#endif
263276

264-
return r;
277+
return result;
265278
}
266279

267280
int BearSSLClient::clientWrite(void *ctx, const unsigned char *buf, size_t len)
@@ -287,7 +300,10 @@ int BearSSLClient::clientWrite(void *ctx, const unsigned char *buf, size_t len)
287300
return -1;
288301
}
289302

290-
int w = c->write(buf, len);
303+
int result = c->write(buf, len);
304+
if (result == 0) {
305+
return -1;
306+
}
291307

292-
return w;
308+
return result;
293309
}

0 commit comments

Comments
 (0)