Use spice_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 4af3748..38486b6 100644 --- a/server/websocket.c +++ b/server/websocket.c @@ -340,26 +340,24 @@ static void constrain_iov(struct iovec *iov, int iovcnt, struct iovec **iov_out, int *iov_out_cnt, guint64 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 = spice_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 = spice_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 jut return the first chunk */ + *iov_out_cnt = i; + *iov_out = iov; } static int send_data_header_left(RedsWebSocket *ws) -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel