From fa270e07c0eddc71ee581c322ac40c5088e3e757 Mon Sep 17 00:00:00 2001 From: xiehan <52160700+Barenboim@users.noreply.github.com> Date: Fri, 3 Jul 2026 00:07:20 +0800 Subject: [PATCH] Support sending IO vector over 2GB on TLS. (#1822) --- src/kernel/Communicator.cc | 6 ++++-- src/kernel/poller.c | 21 ++++++++------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/kernel/Communicator.cc b/src/kernel/Communicator.cc index 2b248aa7..f92bbfe9 100644 --- a/src/kernel/Communicator.cc +++ b/src/kernel/Communicator.cc @@ -158,10 +158,12 @@ static int __ssl_writev(poller_ssl_t *ssl, struct iovec vectors[], int cnt) break; } - cnt = vectors[0].iov_len; if (n > 0 && n < SSL_WRITEV_BUFSIZE) - cnt -= SSL_WRITEV_BUFSIZE - n; + n += vectors[0].iov_len - SSL_WRITEV_BUFSIZE; + else + n = vectors[0].iov_len; + cnt = n <= INT_MAX ? n : INT_MAX; return poller_ssl_write(vectors[0].iov_base, cnt, &i, ssl); } diff --git a/src/kernel/poller.c b/src/kernel/poller.c index 4d56746e..24eba0e9 100644 --- a/src/kernel/poller.c +++ b/src/kernel/poller.c @@ -557,20 +557,17 @@ static void __poller_handle_write(struct __poller_node *node, poller_t *poller) { struct iovec *iov = node->data.write_iov; - size_t count = 0; + size_t sum = 0; ssize_t nleft; - int iovcnt; + int cnt; int ret; while (node->data.iovcnt > 0) { if (!node->data.ssl) { - iovcnt = node->data.iovcnt; - if (iovcnt > IOV_MAX) - iovcnt = IOV_MAX; - - nleft = writev(node->data.fd, iov, iovcnt); + cnt = node->data.iovcnt <= IOV_MAX ? node->data.iovcnt : IOV_MAX; + nleft = writev(node->data.fd, iov, cnt); if (nleft < 0) { ret = errno == EAGAIN ? 0 : -1; @@ -579,7 +576,8 @@ static void __poller_handle_write(struct __poller_node *node, } else if (iov->iov_len > 0) { - nleft = SSL_write(node->data.ssl->ssl, iov->iov_base, iov->iov_len); + cnt = iov->iov_len <= INT_MAX ? iov->iov_len : INT_MAX; + nleft = SSL_write(node->data.ssl->ssl, iov->iov_base, cnt); if (nleft <= 0) { ret = __poller_handle_ssl_error(node, nleft, poller); @@ -589,7 +587,7 @@ static void __poller_handle_write(struct __poller_node *node, else nleft = 0; - count += nleft; + sum += nleft; do { if (nleft >= iov->iov_len) @@ -612,10 +610,7 @@ static void __poller_handle_write(struct __poller_node *node, node->data.write_iov = iov; if (node->data.iovcnt > 0 && ret >= 0) { - if (count == 0) - return; - - if (node->data.partial_written(count, node->data.context) >= 0) + if (node->data.partial_written(sum, node->data.context) >= 0) return; }