From b93822fc502c8bb74028b681d15a364ab364f250 Mon Sep 17 00:00:00 2001 From: cpq Date: Wed, 28 Jan 2026 14:17:08 +0000 Subject: [PATCH] Read out all pending TLS data --- mongoose.c | 50 ++++++++++++++++++++++++++--------------------- src/tls_builtin.c | 18 +++++++---------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/mongoose.c b/mongoose.c index cbe9114f..78425b96 100644 --- a/mongoose.c +++ b/mongoose.c @@ -15037,31 +15037,37 @@ long mg_tls_send(struct mg_connection *c, const void *buf, size_t len) { } long mg_tls_recv(struct mg_connection *c, void *buf, size_t len) { - int r = 0; struct tls_data *tls = (struct tls_data *) c->tls; - unsigned char *recv_buf; - size_t minlen; + long res = 0; - r = mg_tls_recv_record(c); - if (r < 0) { - return r; + while (buf != NULL && len > 0) { + if (tls->recv_len == 0) { + int r = mg_tls_recv_record(c); + if (r < 0) { + if (res == 0) res = r; + break; + } + if (tls->content_type != MG_TLS_APP_DATA) { + tls->recv_len = 0; + mg_tls_drop_record(c); + continue; + } + } + { + uint8_t *recv_buf = &c->rtls.buf[tls->recv_offset]; + size_t n = len < tls->recv_len ? len : tls->recv_len; + memmove(buf, recv_buf, n); + tls->recv_offset += n; + tls->recv_len -= n; + res += (long) n; + buf = (char *) buf + n; + len -= n; + if (tls->recv_len == 0) { + mg_tls_drop_record(c); + } + } } - recv_buf = &c->rtls.buf[tls->recv_offset]; - - if (tls->content_type != MG_TLS_APP_DATA) { - tls->recv_len = 0; - mg_tls_drop_record(c); - return MG_IO_WAIT; - } - if (buf == NULL || len == 0) return 0L; - minlen = len < tls->recv_len ? len : tls->recv_len; - memmove(buf, recv_buf, minlen); - tls->recv_offset += minlen; - tls->recv_len -= minlen; - if (tls->recv_len == 0) { - mg_tls_drop_record(c); - } - return (long) minlen; + return res; } size_t mg_tls_pending(struct mg_connection *c) { diff --git a/src/tls_builtin.c b/src/tls_builtin.c index b886e384..86fc0bab 100644 --- a/src/tls_builtin.c +++ b/src/tls_builtin.c @@ -2509,25 +2509,21 @@ long mg_tls_recv(struct mg_connection *c, void *buf, size_t len) { unsigned char *recv_buf; size_t minlen; - r = mg_tls_recv_record(c); - if (r < 0) { - return r; - } - recv_buf = &c->rtls.buf[tls->recv_offset]; - - if (tls->content_type != MG_TLS_APP_DATA) { + for (;;) { + r = mg_tls_recv_record(c); + if (r < 0) return r; + if (tls->content_type == MG_TLS_APP_DATA) break; tls->recv_len = 0; mg_tls_drop_record(c); - return MG_IO_WAIT; } + if (buf == NULL || len == 0) return 0L; + recv_buf = &c->rtls.buf[tls->recv_offset]; minlen = len < tls->recv_len ? len : tls->recv_len; memmove(buf, recv_buf, minlen); tls->recv_offset += minlen; tls->recv_len -= minlen; - if (tls->recv_len == 0) { - mg_tls_drop_record(c); - } + if (tls->recv_len == 0) mg_tls_drop_record(c); return (long) minlen; }