summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Vanderstuyft <elias.vds@gmail.com>2015-12-19 04:32:19 +0300
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-12-19 04:48:52 +0300
commitdaf6cd0c1829c48cba197bd87d57fc8bf3f65faa (patch)
treecfc0ce649b7a874b3964efc55b44c6c45d38b77c
parentfbae10db094046dba1d59e1c2ee5140835045f14 (diff)
downloadlinux-daf6cd0c1829c48cba197bd87d57fc8bf3f65faa.tar.xz
Input: uinput - sanity check on ff_effects_max and EV_FF
Currently the user can set ff_effects_max to zero with the EV_FF bit (and the FF_GAIN and/or FF_AUTOCENTER bits) set, in this case the uninitialized methods ff->set_gain and/or ff->set_autocenter can be dereferenced, resulting in a kernel oops. Check in uinput_create_device() and print a helpful message and return -EINVAL in case the check fails. Signed-off-by: Elias Vanderstuyft <elias.vds@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/misc/uinput.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
index 782df415e4d5..4eb9e4d94f46 100644
--- a/drivers/input/misc/uinput.c
+++ b/drivers/input/misc/uinput.c
@@ -272,6 +272,13 @@ static int uinput_create_device(struct uinput_device *udev)
input_set_events_per_packet(dev, 60);
}
+ if (test_bit(EV_FF, dev->evbit) && !udev->ff_effects_max) {
+ printk(KERN_DEBUG "%s: ff_effects_max should be non-zero when FF_BIT is set\n",
+ UINPUT_NAME);
+ error = -EINVAL;
+ goto fail1;
+ }
+
if (udev->ff_effects_max) {
error = input_ff_create(dev, udev->ff_effects_max);
if (error)