diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-09-10 16:23:42 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-09-10 16:23:42 +0100 |
commit | f9f1f63b5b35a4730cf0c02474fad94a432e8f83 (patch) | |
tree | 8b0ebc4c3f4356f1d55b78c35fbc16b811c6b049 | |
parent | fe95675a5b2e8b863c6b1393c909254b1aca2e0d (diff) | |
download | rspamd-f9f1f63b5b35a4730cf0c02474fad94a432e8f83.tar.gz rspamd-f9f1f63b5b35a4730cf0c02474fad94a432e8f83.zip |
Fix processing of large writes.
-rw-r--r-- | src/libutil/http.c | 8 |
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 { |