diff options
author | thompsa <thompsa@FreeBSD.org> | 2007-12-07 10:37:25 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2007-12-07 10:37:25 +0000 |
commit | e4ece2b010a0c9e738d80d1af6a226475140e7f9 (patch) | |
tree | a23041cdb9ecea263977500c309121c53aa8d62a /sys/dev | |
parent | fcb44f0caf35d29b93da56e9edea6712ffc1f7b3 (diff) | |
download | FreeBSD-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/dev')
-rw-r--r-- | sys/dev/if_ndis/if_ndis.c | 34 |
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); |