rtlwifi: rtl8192cu: Fix NULL dereference BUG when using new_id

When the new_id entry in /sysfs is used for a foreign USB device, rtlwifi
BUGS with a NULL pointer dereference because the per-driver configuration
data is not available. The probe function has been restructured as
suggested by Ben Hutchings <bhutchings@solarflare.com>.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Stable <stable@vger.kernel.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Larry Finger 2013-02-06 12:54:17 -06:00 committed by John W. Linville
parent cbb1ec9491
commit 957f4aca5f
3 changed files with 12 additions and 4 deletions

View File

@ -363,9 +363,15 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
MODULE_DEVICE_TABLE(usb, rtl8192c_usb_ids); MODULE_DEVICE_TABLE(usb, rtl8192c_usb_ids);
static int rtl8192cu_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
return rtl_usb_probe(intf, id, &rtl92cu_hal_cfg);
}
static struct usb_driver rtl8192cu_driver = { static struct usb_driver rtl8192cu_driver = {
.name = "rtl8192cu", .name = "rtl8192cu",
.probe = rtl_usb_probe, .probe = rtl8192cu_probe,
.disconnect = rtl_usb_disconnect, .disconnect = rtl_usb_disconnect,
.id_table = rtl8192c_usb_ids, .id_table = rtl8192c_usb_ids,

View File

@ -937,7 +937,8 @@ static struct rtl_intf_ops rtl_usb_ops = {
}; };
int rtl_usb_probe(struct usb_interface *intf, int rtl_usb_probe(struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id,
struct rtl_hal_cfg *rtl_hal_cfg)
{ {
int err; int err;
struct ieee80211_hw *hw = NULL; struct ieee80211_hw *hw = NULL;
@ -972,7 +973,7 @@ int rtl_usb_probe(struct usb_interface *intf,
usb_set_intfdata(intf, hw); usb_set_intfdata(intf, hw);
/* init cfg & intf_ops */ /* init cfg & intf_ops */
rtlpriv->rtlhal.interface = INTF_USB; rtlpriv->rtlhal.interface = INTF_USB;
rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_info); rtlpriv->cfg = rtl_hal_cfg;
rtlpriv->intf_ops = &rtl_usb_ops; rtlpriv->intf_ops = &rtl_usb_ops;
rtl_dbgp_flag_init(hw); rtl_dbgp_flag_init(hw);
/* Init IO handler */ /* Init IO handler */

View File

@ -157,7 +157,8 @@ struct rtl_usb_priv {
int rtl_usb_probe(struct usb_interface *intf, int rtl_usb_probe(struct usb_interface *intf,
const struct usb_device_id *id); const struct usb_device_id *id,
struct rtl_hal_cfg *rtl92cu_hal_cfg);
void rtl_usb_disconnect(struct usb_interface *intf); void rtl_usb_disconnect(struct usb_interface *intf);
int rtl_usb_suspend(struct usb_interface *pusb_intf, pm_message_t message); int rtl_usb_suspend(struct usb_interface *pusb_intf, pm_message_t message);
int rtl_usb_resume(struct usb_interface *pusb_intf); int rtl_usb_resume(struct usb_interface *pusb_intf);