Skip to content

Commit 0398bff

Browse files
committed
fix(ssl_client,WiFiClientSecure): write full TLS buffer and avoid zero-length writes
Loop in send_ssl_data() until the entire buffer is written; handle MBEDTLS_ERR_SSL_WANT_{READ,WRITE} and respect socket timeouts. Return 0 for len==0 to prevent zero-length TLS writes. Add a size==0 guard in WiFiClientSecure::write() for symmetry. No API changes.
1 parent 393834b commit 0398bff

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

libraries/NetworkClientSecure/src/NetworkClientSecure.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ size_t NetworkClientSecure::write(const uint8_t *buf, size_t size) {
227227
return 0;
228228
}
229229

230+
if (size == 0) {
231+
return 0;
232+
}
233+
230234
if (_stillinPlainStart) {
231235
return send_net_data(sslclient.get(), buf, size);
232236
}

libraries/NetworkClientSecure/src/ssl_client.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -409,25 +409,31 @@ int data_to_read(sslclient_context *ssl_client) {
409409
}
410410

411411
int send_ssl_data(sslclient_context *ssl_client, const uint8_t *data, size_t len) {
412-
unsigned long write_start_time = millis();
413-
int ret = -1;
412+
if (len == 0) {
413+
return 0; // Skipping zero-length write
414+
}
415+
416+
const unsigned long write_start_time = millis();
414417

415-
while ((ret = mbedtls_ssl_write(&ssl_client->ssl_ctx, data, len)) <= 0) {
418+
size_t sent = 0;
419+
while (sent < len) {
420+
const size_t to_send = len - sent;
421+
const int ret = mbedtls_ssl_write(&ssl_client->ssl_ctx, data + sent, to_send);
422+
if (ret > 0) {
423+
sent += ret;
424+
continue;
425+
}
416426
if ((millis() - write_start_time) > ssl_client->socket_timeout) {
417-
log_v("SSL write timed out.");
418-
return -1;
427+
log_v("SSL write timed out.");
428+
return -1;
419429
}
420-
421430
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret < 0) {
422-
log_v("Handling error %d", ret); //for low level debug
423-
return handle_error(ret);
431+
log_v("Handling error %d", ret);
432+
return handle_error(ret);
424433
}
425-
426-
//wait for space to become available
427434
vTaskDelay(2);
428435
}
429-
430-
return ret;
436+
return (int)sent;
431437
}
432438

433439
// Some protocols, such as SMTP, XMPP, MySQL/Posgress and various others

0 commit comments

Comments
 (0)