aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Neukum <oneukum@suse.de>2014-03-28 06:29:25 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-04-16 17:04:59 -0400
commitc637f1fa7b0452b71eebd35d00906d371c04714e (patch)
treee99bb91252f43a54926e3461f552be50a5e0ab38
parente7eda9329372f5e436e5a9291eb115eab0feae02 (diff)
uas: fix error handling during scsi_scan()
intfdata is set only after scsi_scan(). uas_pre_reset() however needs intfdata to be valid and will follow the NULL pointer killing khubd. intfdata must be preemptively set before the host is registered and undone in the error case. Signed-off-by: Oliver Neukum <oliver@neukum.org> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/storage/uas.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 8f4222640bd6..fcab9b79d9fb 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -1096,16 +1096,17 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
1096 if (result) 1096 if (result)
1097 goto free_streams; 1097 goto free_streams;
1098 1098
1099 usb_set_intfdata(intf, shost);
1099 result = scsi_add_host(shost, &intf->dev); 1100 result = scsi_add_host(shost, &intf->dev);
1100 if (result) 1101 if (result)
1101 goto free_streams; 1102 goto free_streams;
1102 1103
1103 scsi_scan_host(shost); 1104 scsi_scan_host(shost);
1104 usb_set_intfdata(intf, shost);
1105 return result; 1105 return result;
1106 1106
1107free_streams: 1107free_streams:
1108 uas_free_streams(devinfo); 1108 uas_free_streams(devinfo);
1109 usb_set_intfdata(intf, NULL);
1109set_alt0: 1110set_alt0:
1110 usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0); 1111 usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
1111 if (shost) 1112 if (shost)