char: vcio: Add compat ioctl handling
authorDave Stevenson <dave.stevenson@raspberrypi.org>
Thu, 24 Jan 2019 13:56:30 +0000 (13:56 +0000)
committerpopcornmix <popcornmix@gmail.com>
Mon, 13 May 2019 23:08:17 +0000 (00:08 +0100)
There was no compat ioctl handler, so 32 bit userspace on a
64 bit kernel failed as IOCTL_MBOX_PROPERTY used the size
of char*.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
drivers/char/broadcom/vcio.c

index c19bc20..72b133e 100644 (file)
@@ -24,6 +24,9 @@
 
 #define VCIO_IOC_MAGIC 100
 #define IOCTL_MBOX_PROPERTY _IOWR(VCIO_IOC_MAGIC, 0, char *)
+#ifdef CONFIG_COMPAT
+#define IOCTL_MBOX_PROPERTY32 _IOWR(VCIO_IOC_MAGIC, 0, compat_uptr_t)
+#endif
 
 static struct {
        dev_t devt;
@@ -87,13 +90,30 @@ static long vcio_device_ioctl(struct file *file, unsigned int ioctl_num,
        case IOCTL_MBOX_PROPERTY:
                return vcio_user_property_list((void *)ioctl_param);
        default:
-               pr_err("unknown ioctl: %d\n", ioctl_num);
+               pr_err("unknown ioctl: %x\n", ioctl_num);
                return -EINVAL;
        }
 }
 
+#ifdef CONFIG_COMPAT
+static long vcio_device_compat_ioctl(struct file *file, unsigned int ioctl_num,
+                                    unsigned long ioctl_param)
+{
+       switch (ioctl_num) {
+       case IOCTL_MBOX_PROPERTY32:
+               return vcio_user_property_list(compat_ptr(ioctl_param));
+       default:
+               pr_err("unknown ioctl: %x\n", ioctl_num);
+               return -EINVAL;
+       }
+}
+#endif
+
 const struct file_operations vcio_fops = {
        .unlocked_ioctl = vcio_device_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = vcio_device_compat_ioctl,
+#endif
        .open = vcio_device_open,
        .release = vcio_device_release,
 };