On 13.11.19 17:05, Marc Zyngier wrote: > On a system without KVM_COMPAT, we prevent IOCTLs from being issued > by a compat task. Although this prevents most silly things from > happening, it can still confuse a 32bit userspace that is able > to open the kvm device (the qemu test suite seems to be pretty > mad with this behaviour). > > Take a more radical approach and return a -ENODEV to the compat > task. > > Reported-by: Peter Maydell <peter.maydell@xxxxxxxxxx> > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > virt/kvm/kvm_main.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 543024c7a87f..1243e48dc717 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -122,7 +122,13 @@ static long kvm_vcpu_compat_ioctl(struct file *file, unsigned int ioctl, > #else > static long kvm_no_compat_ioctl(struct file *file, unsigned int ioctl, > unsigned long arg) { return -EINVAL; } > -#define KVM_COMPAT(c) .compat_ioctl = kvm_no_compat_ioctl > + > +static int kvm_no_compat_open(struct inode *inode, struct file *file) > +{ > + return is_compat_task() ? -ENODEV : 0; > +} > +#define KVM_COMPAT(c) .compat_ioctl = kvm_no_compat_ioctl, \ Do we still need compat_ioctl if open never succeeds? > + .open = kvm_no_compat_open > #endif > static int hardware_enable_all(void); > static void hardware_disable_all(void); >