Skip to contentSkip to conversation

brcmsmac: NULL dereferences in brcms_c_detach_mfree()

PATCH In review Dan Carpenter 2 participants 2 messages Nov 28, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 brcmsmac: NULL dereferences in brcms_c_detach_mfree()

The brcms_c_attach_malloc() function can call this with a NULL "wlc->corestate" or "wlc->hw".

Also I threw in a bonus cleanup by deleting an obvious comment and a no-op NULL assignment. :)

drivers/net/wireless/brcm80211/brcmsmac/main.c +4 -4
index 738cfac..a104d7a 100644
@@ -445,18 +445,18 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc)
 	kfree(wlc->protection);
 	kfree(wlc->stf);
 	kfree(wlc->bandstate[0]);
-	kfree(wlc->corestate->macstat_snapshot);
+	if (wlc->corestate)
+		kfree(wlc->corestate->macstat_snapshot);
 	kfree(wlc->corestate);
-	kfree(wlc->hw->bandstate[0]);
+	if (wlc->hw)
+		kfree(wlc->hw->bandstate[0]);
 	kfree(wlc->hw);
 	if (wlc->beacon)
 		dev_kfree_skb_any(wlc->beacon);
 	if (wlc->probe_resp)
 		dev_kfree_skb_any(wlc->probe_resp);
 
-	/* free the wlc */
 	kfree(wlc);
-	wlc = NULL;
 }
 
 static struct brcms_bss_cfg *brcms_c_bsscfg_malloc(uint unit)
Acked-by on v1 1/1
#1 lore raw
Quoted 5 lines · Dan Carpenter

The brcms_c_attach_malloc() function can call this with a NULL "wlc->corestate" or "wlc->hw".

Also I threw in a bonus cleanup by deleting an obvious comment and a no-op NULL assignment. :)

Thanks for the patch+bonus

Quoted 30 lines
drivers/net/wireless/brcm80211/brcmsmac/main.c +4 -4
index 738cfac..a104d7a 100644
@@ -445,18 +445,18 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc)
 	kfree(wlc->protection);
 	kfree(wlc->stf);
 	kfree(wlc->bandstate[0]);
-	kfree(wlc->corestate->macstat_snapshot);
+	if (wlc->corestate)
+		kfree(wlc->corestate->macstat_snapshot);
 	kfree(wlc->corestate);
-	kfree(wlc->hw->bandstate[0]);
+	if (wlc->hw)
+		kfree(wlc->hw->bandstate[0]);
 	kfree(wlc->hw);
 	if (wlc->beacon)
 		dev_kfree_skb_any(wlc->beacon);
 	if (wlc->probe_resp)
 		dev_kfree_skb_any(wlc->probe_resp);
 
-	/* free the wlc */
 	kfree(wlc);
-	wlc = NULL;
 }
 
 static struct brcms_bss_cfg *brcms_c_bsscfg_malloc(uint unit)