diff --git a/contrib/wpa/src/drivers/driver_bsd.c b/contrib/wpa/src/drivers/driver_bsd.c --- a/contrib/wpa/src/drivers/driver_bsd.c +++ b/contrib/wpa/src/drivers/driver_bsd.c @@ -1209,6 +1209,10 @@ int privacy; int ret = 0; + /* XXX woraround for PR/264238 until a better solution can be found */ + const u8 *wpa_ie_save; + size_t wpa_ie_len_save; + wpa_printf(MSG_DEBUG, "%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u" , __func__ @@ -1256,9 +1260,26 @@ ret = -1; if (wpa_driver_bsd_set_auth_alg(drv, params->auth_alg) < 0) ret = -1; + + /* XXX woraround for PR/264238 until a better solution can be found */ + if (params->pairwise_suite == WPA_CIPHER_NONE && + params->group_suite == WPA_CIPHER_NONE && + params->key_mgmt_suite == WPA_KEY_MGMT_NONE && + params->wpa_ie_len != 0) { + wpa_ie_save = params->wpa_ie; + wpa_ie_len_save = params->wpa_ie_len; + params->wpa_ie = NULL; + params->wpa_ie_len = 0; + } else { + wpa_ie_save = NULL; + wpa_ie_len_save = 0; + } + /* XXX error handling is wrong but unclear what to do... */ - if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0) - return -1; + if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0) { + ret = -1; + goto bsd_assoc_exit; + } privacy = !(params->pairwise_suite == WPA_CIPHER_NONE && params->group_suite == WPA_CIPHER_NONE && @@ -1266,20 +1287,26 @@ params->wpa_ie_len == 0); wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy); - if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) - return -1; + if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) { + ret = -1; + goto bsd_assoc_exit; + } if (params->wpa_ie_len && set80211param(drv, IEEE80211_IOC_WPA, - params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0) - return -1; + params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0) { + ret = -1; + goto bsd_assoc_exit; + } /* * NB: interface must be marked UP for association * or scanning (ap_scan=2) */ - if (bsd_get_iface_flags(drv) < 0) - return -1; + if (bsd_get_iface_flags(drv) < 0) { + ret = -1; + goto bsd_assoc_exit; + } os_memset(&mlme, 0, sizeof(mlme)); mlme.im_op = IEEE80211_MLME_ASSOC; @@ -1289,7 +1316,10 @@ if (params->bssid != NULL) os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0) - return -1; + ret = -1; +bsd_assoc_exit: + params->wpa_ie = wpa_ie_save; + params->wpa_ie_len = wpa_ie_len_save; return ret; }