]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix processing of large writes.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 10 Sep 2014 15:23:42 +0000 (16:23 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 10 Sep 2014 15:23:42 +0000 (16:23 +0100)
src/libutil/http.c

index 4cc4485f568737b1abfde069bbda9e068ff02ec1..5cd5e2e12340859a443b245c774540588c0ef2dc 100644 (file)
@@ -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 {