summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2007-12-07 10:37:25 +0000
committerthompsa <thompsa@FreeBSD.org>2007-12-07 10:37:25 +0000
commite4ece2b010a0c9e738d80d1af6a226475140e7f9 (patch)
treea23041cdb9ecea263977500c309121c53aa8d62a /sys
parentfcb44f0caf35d29b93da56e9edea6712ffc1f7b3 (diff)
downloadFreeBSD-src-e4ece2b010a0c9e738d80d1af6a226475140e7f9.zip
FreeBSD-src-e4ece2b010a0c9e738d80d1af6a226475140e7f9.tar.gz
Preallocate some space to return the scan results, some drivers do not properly
pass back the desired buffer length. This fixes scanning with the Marvell 88W8335 and BCM4328 wireless cards. PR: kern/118370 Submitted by: Weongyo Jeong Tested by: Ed Schouten
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/if_ndis/if_ndis.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index 4752793..c5bde2e 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -2514,13 +2514,20 @@ ndis_get_assoc(sc, assoc)
return(ENOENT);
}
- len = 4;
- error = ndis_get_info(sc, OID_802_11_BSSID_LIST, NULL, &len);
- if (error != ENOSPC)
- len = 65536;
+ len = sizeof(uint32_t) + (sizeof(ndis_wlan_bssid_ex) * 16);
+ bl = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
+ if (bl == NULL)
+ return (ENOMEM);
- bl = malloc(len, M_TEMP, M_NOWAIT|M_ZERO);
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+ if (error == ENOSPC) {
+ free(bl, M_TEMP);
+ bl = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
+ if (bl == NULL)
+ return (ENOMEM);
+
+ error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+ }
if (error) {
free(bl, M_TEMP);
device_printf(sc->ndis_dev, "bssid_list failed\n");
@@ -3279,13 +3286,22 @@ ndis_scan_results(struct ndis_softc *sc)
uint8_t rates[2+IEEE80211_RATE_MAXSIZE];
uint8_t *frm, *efrm;
- len = 0;
noise = -96;
- error = ndis_get_info(sc, OID_802_11_BSSID_LIST, NULL, &len);
- if (error != ENOSPC)
- len = 65536;
+
+ len = sizeof(uint32_t) + (sizeof(ndis_wlan_bssid_ex) * 16);
bl = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (bl == NULL)
+ return;
+
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+ if (error == ENOSPC) {
+ free(bl, M_DEVBUF);
+ bl = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (bl == NULL)
+ return;
+
+ error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
+ }
if (error) {
DPRINTF(("%s: failed to read\n", __func__));
free(bl, M_DEVBUF);
OpenPOWER on IntegriCloud