Ver Fonte

Input: cleanse capabilities bits before registering device

To avoid showing garbage in capability bits, zero out bitmasks absent
from dev->evbit in case driver inadvertently leaves some garbage there.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Dmitry Torokhov há 15 anos atrás
pai
commit
92a3a58788
1 ficheiros alterados com 22 adições e 0 exclusões
  1. 22 0
      drivers/input/input.c

+ 22 - 0
drivers/input/input.c

@@ -1497,6 +1497,25 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
 }
 }
 EXPORT_SYMBOL(input_set_capability);
 EXPORT_SYMBOL(input_set_capability);
 
 
+#define INPUT_CLEANSE_BITMASK(dev, type, bits)				\
+	do {								\
+		if (!test_bit(EV_##type, dev->evbit))			\
+			memset(dev->bits##bit, 0,			\
+				sizeof(dev->bits##bit));		\
+	} while (0)
+
+static void input_cleanse_bitmasks(struct input_dev *dev)
+{
+	INPUT_CLEANSE_BITMASK(dev, KEY, key);
+	INPUT_CLEANSE_BITMASK(dev, REL, rel);
+	INPUT_CLEANSE_BITMASK(dev, ABS, abs);
+	INPUT_CLEANSE_BITMASK(dev, MSC, msc);
+	INPUT_CLEANSE_BITMASK(dev, LED, led);
+	INPUT_CLEANSE_BITMASK(dev, SND, snd);
+	INPUT_CLEANSE_BITMASK(dev, FF, ff);
+	INPUT_CLEANSE_BITMASK(dev, SW, sw);
+}
+
 /**
 /**
  * input_register_device - register device with input core
  * input_register_device - register device with input core
  * @dev: device to be registered
  * @dev: device to be registered
@@ -1522,6 +1541,9 @@ int input_register_device(struct input_dev *dev)
 	/* KEY_RESERVED is not supposed to be transmitted to userspace. */
 	/* KEY_RESERVED is not supposed to be transmitted to userspace. */
 	__clear_bit(KEY_RESERVED, dev->keybit);
 	__clear_bit(KEY_RESERVED, dev->keybit);
 
 
+	/* Make sure that bitmasks not mentioned in dev->evbit are clean. */
+	input_cleanse_bitmasks(dev);
+
 	/*
 	/*
 	 * If delay and period are pre-set by the driver, then autorepeating
 	 * If delay and period are pre-set by the driver, then autorepeating
 	 * is handled by the driver itself and we don't do it in input.c.
 	 * is handled by the driver itself and we don't do it in input.c.