diff options
Diffstat (limited to 'drivers/vhost/vhost.c')
| -rw-r--r-- | drivers/vhost/vhost.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index ed71b5347a76..cb807d0ea498 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -713,9 +713,13 @@ long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp)  			r = -EFAULT;  			break;  		} -		if ((a.avail_user_addr & (sizeof *vq->avail->ring - 1)) || -		    (a.used_user_addr & (sizeof *vq->used->ring - 1)) || -		    (a.log_guest_addr & (sizeof *vq->used->ring - 1))) { + +		/* Make sure it's safe to cast pointers to vring types. */ +		BUILD_BUG_ON(__alignof__ *vq->avail > VRING_AVAIL_ALIGN_SIZE); +		BUILD_BUG_ON(__alignof__ *vq->used > VRING_USED_ALIGN_SIZE); +		if ((a.avail_user_addr & (VRING_AVAIL_ALIGN_SIZE - 1)) || +		    (a.used_user_addr & (VRING_USED_ALIGN_SIZE - 1)) || +		    (a.log_guest_addr & (sizeof(u64) - 1))) {  			r = -EINVAL;  			break;  		}  | 
