Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] redrat3: fix error paths in probe

If redrat3_delete() is called, ensure ep_in and udev members are set
up so we don't dereference null in the error path. Also ensure that
rc dev device exists before we enable the receiver and that the
led urb exists before we create the led device.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Sean Young and committed by
Mauro Carvalho Chehab
8a21ec9b d6aca6ea

+23 -26
+23 -26
drivers/media/rc/redrat3.c
··· 980 980 goto no_endpoints; 981 981 982 982 rr3->dev = &intf->dev; 983 + rr3->ep_in = ep_in; 984 + rr3->ep_out = ep_out; 985 + rr3->udev = udev; 983 986 984 987 /* set up bulk-in endpoint */ 985 988 rr3->read_urb = usb_alloc_urb(0, GFP_KERNEL); 986 989 if (!rr3->read_urb) 987 - goto error; 990 + goto redrat_free; 988 991 989 - rr3->ep_in = ep_in; 990 992 rr3->bulk_in_buf = usb_alloc_coherent(udev, 991 993 le16_to_cpu(ep_in->wMaxPacketSize), GFP_KERNEL, &rr3->dma_in); 992 994 if (!rr3->bulk_in_buf) 993 - goto error; 995 + goto redrat_free; 994 996 995 997 pipe = usb_rcvbulkpipe(udev, ep_in->bEndpointAddress); 996 998 usb_fill_bulk_urb(rr3->read_urb, udev, pipe, rr3->bulk_in_buf, ··· 1000 998 rr3->read_urb->transfer_dma = rr3->dma_in; 1001 999 rr3->read_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1002 1000 1003 - rr3->ep_out = ep_out; 1004 - rr3->udev = udev; 1005 - 1006 1001 redrat3_reset(rr3); 1007 1002 redrat3_get_firmware_rev(rr3); 1008 - 1009 - /* might be all we need to do? */ 1010 - retval = redrat3_enable_detector(rr3); 1011 - if (retval < 0) 1012 - goto error; 1013 1003 1014 1004 /* default.. will get overridden by any sends with a freq defined */ 1015 1005 rr3->carrier = 38000; 1016 1006 1017 - /* led control */ 1018 - rr3->led.name = "redrat3:red:feedback"; 1019 - rr3->led.default_trigger = "rc-feedback"; 1020 - rr3->led.brightness_set = redrat3_brightness_set; 1021 - retval = led_classdev_register(&intf->dev, &rr3->led); 1022 - if (retval) 1023 - goto error; 1024 - 1025 1007 atomic_set(&rr3->flash, 0); 1026 1008 rr3->flash_urb = usb_alloc_urb(0, GFP_KERNEL); 1027 - if (!rr3->flash_urb) { 1028 - retval = -ENOMEM; 1029 - goto led_free_error; 1030 - } 1009 + if (!rr3->flash_urb) 1010 + goto redrat_free; 1031 1011 1032 1012 /* setup packet is 'c0 b9 0000 0000 0001' */ 1033 1013 rr3->flash_control.bRequestType = 0xc0; ··· 1021 1037 &rr3->flash_in_buf, sizeof(rr3->flash_in_buf), 1022 1038 redrat3_led_complete, rr3); 1023 1039 1040 + /* led control */ 1041 + rr3->led.name = "redrat3:red:feedback"; 1042 + rr3->led.default_trigger = "rc-feedback"; 1043 + rr3->led.brightness_set = redrat3_brightness_set; 1044 + retval = led_classdev_register(&intf->dev, &rr3->led); 1045 + if (retval) 1046 + goto redrat_free; 1047 + 1024 1048 rr3->rc = redrat3_init_rc_dev(rr3); 1025 1049 if (!rr3->rc) { 1026 1050 retval = -ENOMEM; 1027 - goto led_free_error; 1051 + goto led_free; 1028 1052 } 1053 + 1054 + /* might be all we need to do? */ 1055 + retval = redrat3_enable_detector(rr3); 1056 + if (retval < 0) 1057 + goto led_free; 1029 1058 1030 1059 /* we can register the device now, as it is ready */ 1031 1060 usb_set_intfdata(intf, rr3); 1032 1061 1033 1062 return 0; 1034 1063 1035 - led_free_error: 1064 + led_free: 1036 1065 led_classdev_unregister(&rr3->led); 1037 - error: 1066 + redrat_free: 1038 1067 redrat3_delete(rr3, rr3->udev); 1039 1068 1040 1069 no_endpoints: