vhost: return EINVAL if iovecs size does not match the message size
We've failed to copy and process vhost_iotlb_msg so let userspace at
least know about it. For instance before these patch the code below runs
without any error:
int main()
{
  struct vhost_msg msg;
  struct iovec iov;
  int fd;
  fd = open("/dev/vhost-net", O_RDWR);
  if (fd == -1) {
    perror("open");
    return 1;
  }
  iov.iov_base = &msg;
  iov.iov_len = sizeof(msg)-4;
  if (writev(fd, &iov,1) == -1) {
    perror("writev");
    return 1;
  }
  return 0;
}
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									bf4dc0b2be
								
							
						
					
					
						commit
						74ad741948
					
				| @ -1034,8 +1034,10 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev, | ||||
| 	int type, ret; | ||||
| 
 | ||||
| 	ret = copy_from_iter(&type, sizeof(type), from); | ||||
| 	if (ret != sizeof(type)) | ||||
| 	if (ret != sizeof(type)) { | ||||
| 		ret = -EINVAL; | ||||
| 		goto done; | ||||
| 	} | ||||
| 
 | ||||
| 	switch (type) { | ||||
| 	case VHOST_IOTLB_MSG: | ||||
| @ -1054,8 +1056,10 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev, | ||||
| 
 | ||||
| 	iov_iter_advance(from, offset); | ||||
| 	ret = copy_from_iter(&msg, sizeof(msg), from); | ||||
| 	if (ret != sizeof(msg)) | ||||
| 	if (ret != sizeof(msg)) { | ||||
| 		ret = -EINVAL; | ||||
| 		goto done; | ||||
| 	} | ||||
| 	if (vhost_process_iotlb_msg(dev, &msg)) { | ||||
| 		ret = -EFAULT; | ||||
| 		goto done; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user