Input: pegasus-notetaker - check pipe type when probing
authorSoumya Negi <soumya.negi97@gmail.com>
Mon, 10 Apr 2023 02:12:04 +0000 (19:12 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 10 Apr 2023 02:19:14 +0000 (19:19 -0700)
Fix WARNING in pegasus_open/usb_submit_urb
Syzbot bug: https://syzkaller.appspot.com/bug?id=bbc107584dcf3262253ce93183e51f3612aaeb13

Warning raised because pegasus_driver submits transfer request for
bogus URB (pipe type does not match endpoint type). Add sanity check at
probe time for pipe value extracted from endpoint descriptor. Probe
will fail if sanity check fails.

Reported-and-tested-by: syzbot+04ee0cb4caccaed12d78@syzkaller.appspotmail.com
Signed-off-by: Soumya Negi <soumya.negi97@gmail.com>
Link: https://lore.kernel.org/r/20230404074145.11523-1-soumya.negi97@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/tablet/pegasus_notetaker.c

index d836d3dcc6a2491905535f0c8fcab35d5ae6b541..a68da2988f9cd828942b5a23eed5efd5576cb7f5 100644 (file)
@@ -296,6 +296,12 @@ static int pegasus_probe(struct usb_interface *intf,
        pegasus->intf = intf;
 
        pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
+       /* Sanity check that pipe's type matches endpoint's type */
+       if (usb_pipe_type_check(dev, pipe)) {
+               error = -EINVAL;
+               goto err_free_mem;
+       }
+
        pegasus->data_len = usb_maxpacket(dev, pipe);
 
        pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL,