zd1211rw: fix potential use-after-free bug
zd_mac_tx_to_dev() could potentially free the skb, or hand it off to mac80211 which might free it. Hence, this code needs to get the usb pointer out of skb->cb before handing it off to that function. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
6d6936e2ea
commit
dbabad0c9c
|
@ -889,9 +889,13 @@ static void tx_urb_complete(struct urb *urb)
|
||||||
}
|
}
|
||||||
free_urb:
|
free_urb:
|
||||||
skb = (struct sk_buff *)urb->context;
|
skb = (struct sk_buff *)urb->context;
|
||||||
zd_mac_tx_to_dev(skb, urb->status);
|
/*
|
||||||
|
* grab 'usb' pointer before handing off the skb (since
|
||||||
|
* it might be freed by zd_mac_tx_to_dev or mac80211)
|
||||||
|
*/
|
||||||
cb = (struct zd_tx_skb_control_block *)skb->cb;
|
cb = (struct zd_tx_skb_control_block *)skb->cb;
|
||||||
usb = &zd_hw_mac(cb->hw)->chip.usb;
|
usb = &zd_hw_mac(cb->hw)->chip.usb;
|
||||||
|
zd_mac_tx_to_dev(skb, urb->status);
|
||||||
free_tx_urb(usb, urb);
|
free_tx_urb(usb, urb);
|
||||||
tx_dec_submitted_urbs(usb);
|
tx_dec_submitted_urbs(usb);
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue