nslots is derived from the ABS_MT_SLOT maximum reported by the
virtio device. A device could report a bogus maximum (e.g. -1)
making nslots = 0, which input_mt_init_slots() does not reject;
it returns success without allocating any slot storage, silently
leaving the device registered as multitouch capable with no
backing state. Reject non-positive slot counts before calling
input_mt_init_slots().

Assisted-by: gkh_clanker:t1000
Signed-off-by: Hari Mishal <[email protected]>
---
 drivers/virtio/virtio_input.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index deec24e8e682..2cc19782cdd3 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -312,6 +312,10 @@ static int virtinput_probe(struct virtio_device *vdev)
 
                if (test_bit(ABS_MT_SLOT, vi->idev->absbit)) {
                        nslots = input_abs_get_max(vi->idev, ABS_MT_SLOT) + 1;
+                       if (nslots <= 0) {
+                               err = -EINVAL;
+                               goto err_mt_init_slots;
+                       }
                        err = input_mt_init_slots(vi->idev, nslots, 0);
                        if (err)
                                goto err_mt_init_slots;
-- 
2.43.0


Reply via email to