summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaiki Ueno <ueno@gnu.org>2021-11-26 17:11:45 +0000
committerDaiki Ueno <ueno@gnu.org>2021-11-26 17:11:45 +0000
commitef9e04d89205ef10d4d13868eae9f47b0d666ee9 (patch)
tree69e7315285be8062f3be934a15647f7c3c329781
parent8f17428b84f877bd04e03b6cccd0f4f23101ef3a (diff)
parent1a44ebda71ddd135ba035f4f870a1976d04216a0 (diff)
downloadgnutls-ef9e04d89205ef10d4d13868eae9f47b0d666ee9.tar.gz
Merge branch 'fix_non_vla_02' into 'master'
sockets: fixed building for Windows with compilers without VLA support (alternative version) See merge request gnutls/gnutls!1490
-rw-r--r--lib/system/sockets.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/system/sockets.c b/lib/system/sockets.c
index 5990d2dfa6..e1d6fd1842 100644
--- a/lib/system/sockets.c
+++ b/lib/system/sockets.c
@@ -84,12 +84,15 @@ ssize_t
system_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
int iovec_cnt)
{
- WSABUF bufs[iovec_cnt];
+ WSABUF bufs[32];
DWORD bytes_sent;
- int to_send_cnt = 0;
+ DWORD to_send_cnt = 0;
size_t to_send_bytes = 0;
- while (to_send_cnt < iovec_cnt && to_send_bytes < SSIZE_MAX) {
+ if ((size_t)iovec_cnt > sizeof(bufs) / sizeof(bufs[0]))
+ iovec_cnt = sizeof(bufs) / sizeof(bufs[0]);
+
+ while (to_send_cnt < (DWORD)iovec_cnt && to_send_bytes < SSIZE_MAX) {
bufs[to_send_cnt].buf = iovec[to_send_cnt].iov_base;
if (to_send_bytes + iovec[to_send_cnt].iov_len > SSIZE_MAX) {
@@ -102,12 +105,14 @@ system_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
to_send_cnt++;
break;
}
+#ifdef _WIN64
if (iovec[to_send_cnt].iov_len > ULONG_MAX) {
/* WSASend() limitation */
bufs[to_send_cnt].len = ULONG_MAX;
to_send_cnt++;
break;
}
+#endif
bufs[to_send_cnt].len =
(unsigned long) iovec[to_send_cnt].iov_len;
to_send_bytes += iovec[to_send_cnt].iov_len;