summaryrefslogtreecommitdiffstats
path: root/server/red_worker.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-04-19 21:38:53 +0200
committerGerd Hoffmann <kraxel@redhat.com>2010-04-29 18:20:15 +0200
commit7425253cec090e80cefd9390b3d34780b4bca899 (patch)
tree7ffeeaa8ea20c589274b320b8c2cf65794b9cc21 /server/red_worker.c
parentae8429d0c517f594c54660e58a8b3dc9e7d4f11c (diff)
downloadspice-7425253cec090e80cefd9390b3d34780b4bca899.tar.gz
spice-7425253cec090e80cefd9390b3d34780b4bca899.tar.xz
spice-7425253cec090e80cefd9390b3d34780b4bca899.zip
iovec: add sanity check
Adds sanity check to iovec setup. In theory this should never ever trigger. In practice guest driver bugs can make it trigger. This patch avoids qemu burning cpu in a endless loop, instead we'll print a message and abort. Not sure whenever there is a more graceful way to handle the situation ...
Diffstat (limited to 'server/red_worker.c')
-rw-r--r--server/red_worker.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 5974f196..3cd93743 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -6698,7 +6698,7 @@ static inline uint32_t __fill_iovec(RedWorker *worker, BufDescriptor *buf, int s
static inline void fill_iovec(RedChannel *channel, struct iovec *vec, int *vec_size)
{
- int vec_index = 0;
+ int rc, vec_index = 0;
uint32_t pos = channel->send_data.pos;
ASSERT(channel->send_data.size != pos && channel->send_data.size > pos);
@@ -6709,7 +6709,13 @@ static inline void fill_iovec(RedChannel *channel, struct iovec *vec, int *vec_s
buf = find_buf(channel, pos, &buf_offset);
ASSERT(buf);
- pos += __fill_iovec(channel->worker, buf, buf_offset, vec, &vec_index);
+ rc = __fill_iovec(channel->worker, buf, buf_offset, vec, &vec_index);
+ if (rc == 0) {
+ fprintf(stderr, "%s: got only %d of %d bytes\n", __FUNCTION__,
+ pos, channel->send_data.size);
+ abort();
+ }
+ pos += rc;
} while (vec_index < MAX_SEND_VEC && pos != channel->send_data.size);
*vec_size = vec_index;
}