aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRami Rosen <ramirose@gmail.com>2008-10-22 03:58:39 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-10-31 19:00:51 -0400
commite2ef12d3fdb771002e7c7b6bd8f19902b1934e03 (patch)
tree5699a939cc61cc6c140f3b822e285e6e9f661cc1
parent72118015271e6d3852cb9f647efe0987d131adaa (diff)
mac80211: check return value of dev_alloc_skb() in ieee80211_sta_join_ibss().
This patch add a check on the return value of dev_alloc_skb() in ieee80211_sta_join_ibss() in net/mac80211/mlme.c. Signed-off-by: Rami Rosen <ramirose@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/mlme.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 026f07a173b6..29fafbe440b7 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1379,6 +1379,13 @@ static int ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
1379 struct ieee80211_supported_band *sband; 1379 struct ieee80211_supported_band *sband;
1380 union iwreq_data wrqu; 1380 union iwreq_data wrqu;
1381 1381
1382 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
1383 if (!skb) {
1384 printk(KERN_DEBUG "%s: failed to allocate buffer for probe "
1385 "response\n", sdata->dev->name);
1386 return -ENOMEM;
1387 }
1388
1382 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1389 sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
1383 1390
1384 /* Remove possible STA entries from other IBSS networks. */ 1391 /* Remove possible STA entries from other IBSS networks. */
@@ -1404,63 +1411,62 @@ static int ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
1404 return res; 1411 return res;
1405 1412
1406 /* Build IBSS probe response */ 1413 /* Build IBSS probe response */
1407 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
1408 if (skb) {
1409 skb_reserve(skb, local->hw.extra_tx_headroom);
1410 1414
1411 mgmt = (struct ieee80211_mgmt *) 1415 skb_reserve(skb, local->hw.extra_tx_headroom);
1412 skb_put(skb, 24 + sizeof(mgmt->u.beacon));
1413 memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
1414 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1415 IEEE80211_STYPE_PROBE_RESP);
1416 memset(mgmt->da, 0xff, ETH_ALEN);
1417 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
1418 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
1419 mgmt->u.beacon.beacon_int =
1420 cpu_to_le16(local->hw.conf.beacon_int);
1421 mgmt->u.beacon.timestamp = cpu_to_le64(bss->timestamp);
1422 mgmt->u.beacon.capab_info = cpu_to_le16(bss->capability);
1423
1424 pos = skb_put(skb, 2 + ifsta->ssid_len);
1425 *pos++ = WLAN_EID_SSID;
1426 *pos++ = ifsta->ssid_len;
1427 memcpy(pos, ifsta->ssid, ifsta->ssid_len);
1428
1429 rates = bss->supp_rates_len;
1430 if (rates > 8)
1431 rates = 8;
1432 pos = skb_put(skb, 2 + rates);
1433 *pos++ = WLAN_EID_SUPP_RATES;
1434 *pos++ = rates;
1435 memcpy(pos, bss->supp_rates, rates);
1436 1416
1437 if (bss->band == IEEE80211_BAND_2GHZ) { 1417 mgmt = (struct ieee80211_mgmt *)
1438 pos = skb_put(skb, 2 + 1); 1418 skb_put(skb, 24 + sizeof(mgmt->u.beacon));
1439 *pos++ = WLAN_EID_DS_PARAMS; 1419 memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
1440 *pos++ = 1; 1420 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1441 *pos++ = ieee80211_frequency_to_channel(bss->freq); 1421 IEEE80211_STYPE_PROBE_RESP);
1442 } 1422 memset(mgmt->da, 0xff, ETH_ALEN);
1423 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
1424 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
1425 mgmt->u.beacon.beacon_int =
1426 cpu_to_le16(local->hw.conf.beacon_int);
1427 mgmt->u.beacon.timestamp = cpu_to_le64(bss->timestamp);
1428 mgmt->u.beacon.capab_info = cpu_to_le16(bss->capability);
1443 1429
1444 pos = skb_put(skb, 2 + 2); 1430 pos = skb_put(skb, 2 + ifsta->ssid_len);
1445 *pos++ = WLAN_EID_IBSS_PARAMS; 1431 *pos++ = WLAN_EID_SSID;
1446 *pos++ = 2; 1432 *pos++ = ifsta->ssid_len;
1447 /* FIX: set ATIM window based on scan results */ 1433 memcpy(pos, ifsta->ssid, ifsta->ssid_len);
1448 *pos++ = 0;
1449 *pos++ = 0;
1450 1434
1451 if (bss->supp_rates_len > 8) { 1435 rates = bss->supp_rates_len;
1452 rates = bss->supp_rates_len - 8; 1436 if (rates > 8)
1453 pos = skb_put(skb, 2 + rates); 1437 rates = 8;
1454 *pos++ = WLAN_EID_EXT_SUPP_RATES; 1438 pos = skb_put(skb, 2 + rates);
1455 *pos++ = rates; 1439 *pos++ = WLAN_EID_SUPP_RATES;
1456 memcpy(pos, &bss->supp_rates[8], rates); 1440 *pos++ = rates;
1457 } 1441 memcpy(pos, bss->supp_rates, rates);
1458 1442
1459 ifsta->probe_resp = skb; 1443 if (bss->band == IEEE80211_BAND_2GHZ) {
1444 pos = skb_put(skb, 2 + 1);
1445 *pos++ = WLAN_EID_DS_PARAMS;
1446 *pos++ = 1;
1447 *pos++ = ieee80211_frequency_to_channel(bss->freq);
1448 }
1449
1450 pos = skb_put(skb, 2 + 2);
1451 *pos++ = WLAN_EID_IBSS_PARAMS;
1452 *pos++ = 2;
1453 /* FIX: set ATIM window based on scan results */
1454 *pos++ = 0;
1455 *pos++ = 0;
1460 1456
1461 ieee80211_if_config(sdata, IEEE80211_IFCC_BEACON); 1457 if (bss->supp_rates_len > 8) {
1458 rates = bss->supp_rates_len - 8;
1459 pos = skb_put(skb, 2 + rates);
1460 *pos++ = WLAN_EID_EXT_SUPP_RATES;
1461 *pos++ = rates;
1462 memcpy(pos, &bss->supp_rates[8], rates);
1462 } 1463 }
1463 1464
1465 ifsta->probe_resp = skb;
1466
1467 ieee80211_if_config(sdata, IEEE80211_IFCC_BEACON);
1468
1469
1464 rates = 0; 1470 rates = 0;
1465 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 1471 sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
1466 for (i = 0; i < bss->supp_rates_len; i++) { 1472 for (i = 0; i < bss->supp_rates_len; i++) {