From 38287ab40da441726d5394c65021d170a2e6840f Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 24 Jan 2019 13:56:30 +0000 Subject: [PATCH 311/782] char: vcio: Add compat ioctl handling 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 --- drivers/char/broadcom/vcio.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) --- a/drivers/char/broadcom/vcio.c +++ b/drivers/char/broadcom/vcio.c @@ -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 fil 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, };