vhost: fix error handling in vring ioctls
Stanse found a locking problem in vhost_set_vring: several returns from VHOST_SET_VRING_KICK, VHOST_SET_VRING_CALL, VHOST_SET_VRING_ERR with the vq->mutex held. Fix these up. Reported-by: Jiri Slaby <jirislaby@gmail.com> Acked-by: Laurent Chavey <chavey@google.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0e25557212
commit
535297a6ae
|
@ -476,8 +476,10 @@ static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
|
|||
if (r < 0)
|
||||
break;
|
||||
eventfp = f.fd == -1 ? NULL : eventfd_fget(f.fd);
|
||||
if (IS_ERR(eventfp))
|
||||
return PTR_ERR(eventfp);
|
||||
if (IS_ERR(eventfp)) {
|
||||
r = PTR_ERR(eventfp);
|
||||
break;
|
||||
}
|
||||
if (eventfp != vq->kick) {
|
||||
pollstop = filep = vq->kick;
|
||||
pollstart = vq->kick = eventfp;
|
||||
|
@ -489,8 +491,10 @@ static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
|
|||
if (r < 0)
|
||||
break;
|
||||
eventfp = f.fd == -1 ? NULL : eventfd_fget(f.fd);
|
||||
if (IS_ERR(eventfp))
|
||||
return PTR_ERR(eventfp);
|
||||
if (IS_ERR(eventfp)) {
|
||||
r = PTR_ERR(eventfp);
|
||||
break;
|
||||
}
|
||||
if (eventfp != vq->call) {
|
||||
filep = vq->call;
|
||||
ctx = vq->call_ctx;
|
||||
|
@ -505,8 +509,10 @@ static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
|
|||
if (r < 0)
|
||||
break;
|
||||
eventfp = f.fd == -1 ? NULL : eventfd_fget(f.fd);
|
||||
if (IS_ERR(eventfp))
|
||||
return PTR_ERR(eventfp);
|
||||
if (IS_ERR(eventfp)) {
|
||||
r = PTR_ERR(eventfp);
|
||||
break;
|
||||
}
|
||||
if (eventfp != vq->error) {
|
||||
filep = vq->error;
|
||||
vq->error = eventfp;
|
||||
|
|
Loading…
Reference in New Issue