summaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2014-09-10 16:23:42 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2014-09-10 16:23:42 +0100
commitf9f1f63b5b35a4730cf0c02474fad94a432e8f83 (patch)
tree8b0ebc4c3f4356f1d55b78c35fbc16b811c6b049 /src/libutil
parentfe95675a5b2e8b863c6b1393c909254b1aca2e0d (diff)
downloadrspamd-f9f1f63b5b35a4730cf0c02474fad94a432e8f83.tar.gz
rspamd-f9f1f63b5b35a4730cf0c02474fad94a432e8f83.zip
Fix processing of large writes.
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/http.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/libutil/http.c b/src/libutil/http.c
index 4cc4485f5..5cd5e2e12 100644
--- a/src/libutil/http.c
+++ b/src/libutil/http.c
@@ -569,6 +569,7 @@ rspamd_http_write_helper (struct rspamd_http_connection *conn)
gsize remain;
gssize r;
GError *err;
+ struct iovec *cur_iov;
priv = conn->priv;
@@ -579,12 +580,15 @@ rspamd_http_write_helper (struct rspamd_http_connection *conn)
start = &priv->out[0];
niov = priv->outlen;
remain = priv->wr_pos;
+ /* We know that niov is small enough for that */
+ cur_iov = alloca (niov * sizeof (struct iovec));
+ memcpy (cur_iov, priv->out, niov * sizeof (struct iovec));
for (i = 0; i < priv->outlen && remain > 0; i++) {
/* Find out the first iov required */
- start = &priv->out[i];
+ start = &cur_iov[i];
if (start->iov_len <= remain) {
remain -= start->iov_len;
- start = &priv->out[i + 1];
+ start = &cur_iov[i + 1];
niov--;
}
else {