Skip to content

Commit 136bed0

Browse files
pskrgagmarckleinebudde
authored andcommitted
can: mcba_usb: properly check endpoint type
Syzbot reported warning in usb_submit_urb() which is caused by wrong endpoint type. We should check that in endpoint is actually present to prevent this warning. Found pipes are now saved to struct mcba_priv and code uses them directly instead of making pipes in place. Fail log: | usb 5-1: BOGUS urb xfer, pipe 3 != type 1 | WARNING: CPU: 1 PID: 49 at drivers/usb/core/urb.c:502 usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502 | Modules linked in: | CPU: 1 PID: 49 Comm: kworker/1:2 Not tainted 5.17.0-rc6-syzkaller-00184-g38f80f42147f #0 | Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.14.0-2 04/01/2014 | Workqueue: usb_hub_wq hub_event | RIP: 0010:usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502 | ... | Call Trace: | <TASK> | mcba_usb_start drivers/net/can/usb/mcba_usb.c:662 [inline] | mcba_usb_probe+0x8a3/0xc50 drivers/net/can/usb/mcba_usb.c:858 | usb_probe_interface+0x315/0x7f0 drivers/usb/core/driver.c:396 | call_driver_probe drivers/base/dd.c:517 [inline] Fixes: 51f3baa ("can: mcba_usb: Add support for Microchip CAN BUS Analyzer") Link: https://lore.kernel.org/all/20220313100903.10868-1-paskripkin@gmail.com Reported-and-tested-by: syzbot+3bc1dce0cc0052d60fde@syzkaller.appspotmail.com Signed-off-by: Pavel Skripkin <paskripkin@gmail.com> Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent 04c9b00 commit 136bed0

1 file changed

Lines changed: 16 additions & 10 deletions

File tree

drivers/net/can/usb/mcba_usb.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@
3333
#define MCBA_USB_RX_BUFF_SIZE 64
3434
#define MCBA_USB_TX_BUFF_SIZE (sizeof(struct mcba_usb_msg))
3535

36-
/* MCBA endpoint numbers */
37-
#define MCBA_USB_EP_IN 1
38-
#define MCBA_USB_EP_OUT 1
39-
4036
/* Microchip command id */
4137
#define MBCA_CMD_RECEIVE_MESSAGE 0xE3
4238
#define MBCA_CMD_I_AM_ALIVE_FROM_CAN 0xF5
@@ -83,6 +79,8 @@ struct mcba_priv {
8379
atomic_t free_ctx_cnt;
8480
void *rxbuf[MCBA_MAX_RX_URBS];
8581
dma_addr_t rxbuf_dma[MCBA_MAX_RX_URBS];
82+
int rx_pipe;
83+
int tx_pipe;
8684
};
8785

8886
/* CAN frame */
@@ -268,10 +266,8 @@ static netdev_tx_t mcba_usb_xmit(struct mcba_priv *priv,
268266

269267
memcpy(buf, usb_msg, MCBA_USB_TX_BUFF_SIZE);
270268

271-
usb_fill_bulk_urb(urb, priv->udev,
272-
usb_sndbulkpipe(priv->udev, MCBA_USB_EP_OUT), buf,
273-
MCBA_USB_TX_BUFF_SIZE, mcba_usb_write_bulk_callback,
274-
ctx);
269+
usb_fill_bulk_urb(urb, priv->udev, priv->tx_pipe, buf, MCBA_USB_TX_BUFF_SIZE,
270+
mcba_usb_write_bulk_callback, ctx);
275271

276272
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
277273
usb_anchor_urb(urb, &priv->tx_submitted);
@@ -607,7 +603,7 @@ static void mcba_usb_read_bulk_callback(struct urb *urb)
607603
resubmit_urb:
608604

609605
usb_fill_bulk_urb(urb, priv->udev,
610-
usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_OUT),
606+
priv->rx_pipe,
611607
urb->transfer_buffer, MCBA_USB_RX_BUFF_SIZE,
612608
mcba_usb_read_bulk_callback, priv);
613609

@@ -652,7 +648,7 @@ static int mcba_usb_start(struct mcba_priv *priv)
652648
urb->transfer_dma = buf_dma;
653649

654650
usb_fill_bulk_urb(urb, priv->udev,
655-
usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_IN),
651+
priv->rx_pipe,
656652
buf, MCBA_USB_RX_BUFF_SIZE,
657653
mcba_usb_read_bulk_callback, priv);
658654
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
@@ -806,6 +802,13 @@ static int mcba_usb_probe(struct usb_interface *intf,
806802
struct mcba_priv *priv;
807803
int err;
808804
struct usb_device *usbdev = interface_to_usbdev(intf);
805+
struct usb_endpoint_descriptor *in, *out;
806+
807+
err = usb_find_common_endpoints(intf->cur_altsetting, &in, &out, NULL, NULL);
808+
if (err) {
809+
dev_err(&intf->dev, "Can't find endpoints\n");
810+
return err;
811+
}
809812

810813
netdev = alloc_candev(sizeof(struct mcba_priv), MCBA_MAX_TX_URBS);
811814
if (!netdev) {
@@ -851,6 +854,9 @@ static int mcba_usb_probe(struct usb_interface *intf,
851854
goto cleanup_free_candev;
852855
}
853856

857+
priv->rx_pipe = usb_rcvbulkpipe(priv->udev, in->bEndpointAddress);
858+
priv->tx_pipe = usb_sndbulkpipe(priv->udev, out->bEndpointAddress);
859+
854860
devm_can_led_init(netdev);
855861

856862
/* Start USB dev only if we have successfully registered CAN device */

0 commit comments

Comments
 (0)