aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Hughes <james.hughes@raspberrypi.org>2017-04-25 05:15:06 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-14 08:00:20 -0400
commit0b77c687d4e0bdc6db9bedace1e6886504ea43ef (patch)
tree97461b7cebcd2a792045b630c701f5f291aa0e26
parentf73dfc29afa6b366158a0f3cc0844bca5fd9ca8f (diff)
brcmfmac: Make skb header writable before use
commit 9cc4b7cb86cbcc6330a3faa8cd65268cd2d3c227 upstream. The driver was making changes to the skb_header without ensuring it was writable (i.e. uncloned). This patch also removes some boiler plate header size checking/adjustment code as that is also handled by the skb_cow_header function used to make header writable. Signed-off-by: James Hughes <james.hughes@raspberrypi.org> Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 9b7c19a508ac..f877301c9454 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -211,22 +211,13 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
211 goto done; 211 goto done;
212 } 212 }
213 213
214 /* Make sure there's enough room for any header */ 214 /* Make sure there's enough writable headroom*/
215 if (skb_headroom(skb) < drvr->hdrlen) { 215 ret = skb_cow_head(skb, drvr->hdrlen);
216 struct sk_buff *skb2; 216 if (ret < 0) {
217 217 brcmf_err("%s: skb_cow_head failed\n",
218 brcmf_dbg(INFO, "%s: insufficient headroom\n",
219 brcmf_ifname(ifp)); 218 brcmf_ifname(ifp));
220 drvr->bus_if->tx_realloc++;
221 skb2 = skb_realloc_headroom(skb, drvr->hdrlen);
222 dev_kfree_skb(skb); 219 dev_kfree_skb(skb);
223 skb = skb2; 220 goto done;
224 if (skb == NULL) {
225 brcmf_err("%s: skb_realloc_headroom failed\n",
226 brcmf_ifname(ifp));
227 ret = -ENOMEM;
228 goto done;
229 }
230 } 221 }
231 222
232 /* validate length for ether packet */ 223 /* validate length for ether packet */