Skip to content

Commit 7d21e0b

Browse files
Shigeru YoshidaHans Verkuil
authored andcommitted
media: si470x: Fix use-after-free in si470x_int_in_callback()
syzbot reported use-after-free in si470x_int_in_callback() [1]. This indicates that urb->context, which contains struct si470x_device object, is freed when si470x_int_in_callback() is called. The cause of this issue is that si470x_int_in_callback() is called for freed urb. si470x_usb_driver_probe() calls si470x_start_usb(), which then calls usb_submit_urb() and si470x_start(). If si470x_start_usb() fails, si470x_usb_driver_probe() doesn't kill urb, but it just frees struct si470x_device object, as depicted below: si470x_usb_driver_probe() ... si470x_start_usb() ... usb_submit_urb() retval = si470x_start() return retval if (retval < 0) free struct si470x_device object, but don't kill urb This patch fixes this issue by killing urb when si470x_start_usb() fails and urb is submitted. If si470x_start_usb() fails and urb is not submitted, i.e. submitting usb fails, it just frees struct si470x_device object. Reported-by: [email protected] Link: https://syzkaller.appspot.com/bug?id=94ed6dddd5a55e90fd4bab942aa4bb297741d977 [1] Signed-off-by: Shigeru Yoshida <[email protected]> Signed-off-by: Hans Verkuil <[email protected]>
1 parent faaf901 commit 7d21e0b

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

drivers/media/radio/si470x/radio-si470x-usb.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,8 +727,10 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
727727

728728
/* start radio */
729729
retval = si470x_start_usb(radio);
730-
if (retval < 0)
730+
if (retval < 0 && !radio->int_in_running)
731731
goto err_buf;
732+
else if (retval < 0) /* in case of radio->int_in_running == 1 */
733+
goto err_all;
732734

733735
/* set initial frequency */
734736
si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */

0 commit comments

Comments
 (0)