On Fri, Jun 06, 2014 at 09:53:27AM +0800, Fam Zheng wrote:
> @@ -200,17 +193,12 @@ static int process_request(VirtIOBlockDataPlane *s,
> VirtQueueElement *elem)
> }
> iov_discard_front(&iov, &out_num, sizeof(outhdr));
>
> + /* This is always true because it is only 1 byte, but checked here in
> case
> + * the header gets bigger in the future. */
> + assert(in_iov[in_num - 1].iov_len >= sizeof(*inhdr));
> /* Grab inhdr for later */
> - in_size = iov_size(in_iov, in_num);
> - if (in_size < sizeof(struct virtio_blk_inhdr)) {
> - error_report("virtio_blk request inhdr too short");
> - return -EFAULT;
> - }
This assertion can be triggered by the guest. It even accesses
undefined memory when in_num == 0.
Please be careful, we need to validate guest input.
Stefan