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 ...
This commit is contained in:
Gerd Hoffmann 2010-04-19 21:38:53 +02:00
parent ae8429d0c5
commit 7425253cec

View File

@ -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;
}