Commit 4dd6f17e authored by Michael Mueller's avatar Michael Mueller Committed by Christian Borntraeger

KVM: s390: clear_io_irq() requests are not expected for adapter interrupts

There is a chance to delete not yet delivered I/O interrupts if an
exploiter uses the subsystem identification word 0x0000 while
processing a KVM_DEV_FLIC_CLEAR_IO_IRQ ioctl. -EINVAL will be returned
now instead in that case.

Classic interrupts will always have bit 0x10000 set in the schid while
adapter interrupts have a zero schid. The clear_io_irq interface is
only useful for classic interrupts (as adapter interrupts belong to
many devices). Let's make this interface more strict and forbid a schid
of 0.
Signed-off-by: default avatarMichael Mueller <mimu@linux.vnet.ibm.com>
Reviewed-by: default avatarHalil Pasic <pasic@linux.vnet.ibm.com>
Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent ee739f4b
...@@ -156,3 +156,6 @@ FLIC with an unknown group or attribute gives the error code EINVAL (instead of ...@@ -156,3 +156,6 @@ FLIC with an unknown group or attribute gives the error code EINVAL (instead of
ENXIO, as specified in the API documentation). It is not possible to conclude ENXIO, as specified in the API documentation). It is not possible to conclude
that a FLIC operation is unavailable based on the error code resulting from a that a FLIC operation is unavailable based on the error code resulting from a
usage attempt. usage attempt.
Note: The KVM_DEV_FLIC_CLEAR_IO_IRQ ioctl will return EINVAL in case a zero
schid is specified.
...@@ -2191,6 +2191,8 @@ static int clear_io_irq(struct kvm *kvm, struct kvm_device_attr *attr) ...@@ -2191,6 +2191,8 @@ static int clear_io_irq(struct kvm *kvm, struct kvm_device_attr *attr)
return -EINVAL; return -EINVAL;
if (copy_from_user(&schid, (void __user *) attr->addr, sizeof(schid))) if (copy_from_user(&schid, (void __user *) attr->addr, sizeof(schid)))
return -EFAULT; return -EFAULT;
if (!schid)
return -EINVAL;
kfree(kvm_s390_get_io_int(kvm, isc_mask, schid)); kfree(kvm_s390_get_io_int(kvm, isc_mask, schid));
/* /*
* If userspace is conforming to the architecture, we can have at most * If userspace is conforming to the architecture, we can have at most
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment