[PATCH spice-server 04/23] websocket: Simplify and fix constrain_iov

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Use g_memdup instead of manual copy.
Trim the original iov if necessary.

Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx>
---
 server/websocket.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/server/websocket.c b/server/websocket.c
index 58f36da0a..fc1d82c28 100644
--- a/server/websocket.c
+++ b/server/websocket.c
@@ -310,26 +310,24 @@ static void constrain_iov(struct iovec *iov, int iovcnt,
                           struct iovec **iov_out, int *iov_out_cnt,
                           uint64_t maxlen)
 {
-    int i, j;
-
-    *iov_out = iov;
-    *iov_out_cnt = iovcnt;
+    int i;
 
     for (i = 0; i < iovcnt && maxlen > 0; i++) {
         if (iov[i].iov_len > maxlen) {
             /* TODO - This code has never triggered afaik... */
-            *iov_out_cnt = i + 1;
-            *iov_out = g_malloc((*iov_out_cnt) * sizeof (**iov_out));
-            for (j = 0; j < i; j++) {
-                (*iov_out)[j].iov_base = iov[j].iov_base;
-                (*iov_out)[j].iov_len = iov[j].iov_len;
-            }
-            (*iov_out)[j].iov_base = iov[j].iov_base;
-            (*iov_out)[j].iov_len = maxlen;
-            break;
+            *iov_out_cnt = ++i;
+            *iov_out = g_memdup(iov, i * sizeof (*iov));
+            (*iov_out)[i-1].iov_len = maxlen;
+            return;
         }
         maxlen -= iov[i].iov_len;
     }
+
+    /* we must trim the iov in case maxlen initially matches some chunks
+     * For instance if initially we had 2 chunks 256 and 128 bytes respectively
+     * and a maxlen of 256 we should just return the first chunk */
+    *iov_out_cnt = i;
+    *iov_out = iov;
 }
 
 
-- 
2.20.1

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]