From ea11d357cc010351871392e433880fb2401161b2 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 27 Apr 2013 13:54:52 +0200 Subject: [PATCH] Never send more than IOV_MAX (1024) iovecs in pwritev. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This fixes issues with “pwritev: Invalid argument” showing up under rare circumstances. Apparently the glibc wrapper workaround described in writev(2) does not work, or does not work for pwritev(). --- stream.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stream.cpp b/stream.cpp index 0c0faba..e8d65db 100644 --- a/stream.cpp +++ b/stream.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -129,7 +130,8 @@ void Stream::put_client_to_sleep(Client *client) vector collect_iovecs(const vector &data, size_t bytes_wanted) { vector ret; - for (size_t i = 0; i < data.size() && bytes_wanted > 0; ++i) { + size_t max_iovecs = std::min(data.size(), IOV_MAX); + for (size_t i = 0; i < max_iovecs && bytes_wanted > 0; ++i) { if (data[i].iov_len <= bytes_wanted) { // Consume the entire iovec. ret.push_back(data[i]); -- 2.39.2