diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-04-19 21:38:53 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-04-29 18:20:15 +0200 |
commit | 7425253cec090e80cefd9390b3d34780b4bca899 (patch) | |
tree | 7ffeeaa8ea20c589274b320b8c2cf65794b9cc21 /server/red_worker.c | |
parent | ae8429d0c517f594c54660e58a8b3dc9e7d4f11c (diff) | |
download | spice-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.c | 10 |
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; } |