diff options
author | Daiki Ueno <ueno@gnu.org> | 2021-11-26 17:11:45 +0000 |
---|---|---|
committer | Daiki Ueno <ueno@gnu.org> | 2021-11-26 17:11:45 +0000 |
commit | ef9e04d89205ef10d4d13868eae9f47b0d666ee9 (patch) | |
tree | 69e7315285be8062f3be934a15647f7c3c329781 | |
parent | 8f17428b84f877bd04e03b6cccd0f4f23101ef3a (diff) | |
parent | 1a44ebda71ddd135ba035f4f870a1976d04216a0 (diff) | |
download | gnutls-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.c | 11 |
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; |