diff options
author | Axel Lin <axel.lin@gmail.com> | 2010-11-18 02:59:34 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-11-18 03:16:44 -0500 |
commit | e3f0f0a6c11b049f1be603dcfec82d2a8643f5fd (patch) | |
tree | f77ff559fb6c1af542217627678af719fdc32dce /drivers/input | |
parent | 20a4c261ad9cec39942257b1f91765a4b238db05 (diff) |
Input: xpad - ensure xpad->bulk_out is initialized before submitting urb
As pointed out by Oliver Neukum:
xpad->irq_in is currently submitted before xpad->bulk_out is allocated.
That however is a race, because the callback for irq_in can call
xpad360w_process_packet(), which will in turn submit the bulk URB.
This patch moves initialization for xpad->bulk_out earlier, so we can
ensure xpad->bulk_out is initialized before submitting urb.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/joystick/xpad.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 4875de9a3f88..56abf3d0e911 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
@@ -921,19 +921,7 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
921 | 921 | ||
922 | usb_set_intfdata(intf, xpad); | 922 | usb_set_intfdata(intf, xpad); |
923 | 923 | ||
924 | /* | ||
925 | * Submit the int URB immediately rather than waiting for open | ||
926 | * because we get status messages from the device whether | ||
927 | * or not any controllers are attached. In fact, it's | ||
928 | * exactly the message that a controller has arrived that | ||
929 | * we're waiting for. | ||
930 | */ | ||
931 | if (xpad->xtype == XTYPE_XBOX360W) { | 924 | if (xpad->xtype == XTYPE_XBOX360W) { |
932 | xpad->irq_in->dev = xpad->udev; | ||
933 | error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); | ||
934 | if (error) | ||
935 | goto fail7; | ||
936 | |||
937 | /* | 925 | /* |
938 | * Setup the message to set the LEDs on the | 926 | * Setup the message to set the LEDs on the |
939 | * controller when it shows up | 927 | * controller when it shows up |
@@ -941,13 +929,13 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
941 | xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL); | 929 | xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL); |
942 | if (!xpad->bulk_out) { | 930 | if (!xpad->bulk_out) { |
943 | error = -ENOMEM; | 931 | error = -ENOMEM; |
944 | goto fail8; | 932 | goto fail7; |
945 | } | 933 | } |
946 | 934 | ||
947 | xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL); | 935 | xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL); |
948 | if (!xpad->bdata) { | 936 | if (!xpad->bdata) { |
949 | error = -ENOMEM; | 937 | error = -ENOMEM; |
950 | goto fail9; | 938 | goto fail8; |
951 | } | 939 | } |
952 | 940 | ||
953 | xpad->bdata[2] = 0x08; | 941 | xpad->bdata[2] = 0x08; |
@@ -969,12 +957,24 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
969 | usb_fill_bulk_urb(xpad->bulk_out, udev, | 957 | usb_fill_bulk_urb(xpad->bulk_out, udev, |
970 | usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), | 958 | usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), |
971 | xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); | 959 | xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); |
960 | |||
961 | /* | ||
962 | * Submit the int URB immediately rather than waiting for open | ||
963 | * because we get status messages from the device whether | ||
964 | * or not any controllers are attached. In fact, it's | ||
965 | * exactly the message that a controller has arrived that | ||
966 | * we're waiting for. | ||
967 | */ | ||
968 | xpad->irq_in->dev = xpad->udev; | ||
969 | error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); | ||
970 | if (error) | ||
971 | goto fail9; | ||
972 | } | 972 | } |
973 | 973 | ||
974 | return 0; | 974 | return 0; |
975 | 975 | ||
976 | fail9: usb_free_urb(xpad->bulk_out); | 976 | fail9: kfree(xpad->bdata); |
977 | fail8: usb_kill_urb(xpad->irq_in); | 977 | fail8: usb_free_urb(xpad->bulk_out); |
978 | fail7: input_unregister_device(input_dev); | 978 | fail7: input_unregister_device(input_dev); |
979 | input_dev = NULL; | 979 | input_dev = NULL; |
980 | fail6: xpad_led_disconnect(xpad); | 980 | fail6: xpad_led_disconnect(xpad); |