This is an automated email from the ASF dual-hosted git repository. casaroli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 67efb114740350bd276c2a166670ac3814766367 Author: yangjianqing <[email protected]> AuthorDate: Wed Nov 26 16:40:08 2025 +0800 divers/net/wifi_sim: add app lock Add ap_lock protection to connect_ap to prevent access to a already released connect_ap if the Wi-Fi connection is started and then simultaneously disconnected. Signed-off-by: yangjianqing <[email protected]> --- drivers/net/wifi_sim.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/net/wifi_sim.c b/drivers/net/wifi_sim.c index 536320eb1fa..a0043f4e3fd 100644 --- a/drivers/net/wifi_sim.c +++ b/drivers/net/wifi_sim.c @@ -238,6 +238,7 @@ struct wifi_sim_s uint16_t error_code; /* connect error reason */ FAR struct wifi_sim_bss_s *connected_ap; /* for sta mode */ + mutex_t ap_lock; /* mutex to protect connected_ap */ }; /* for wireless event */ @@ -850,6 +851,7 @@ static int wifidriver_start_connect(FAR struct wifi_sim_s *wifidev) { union iwreq_data wrqu; + nxmutex_lock(&wifidev->ap_lock); wifidev->state = WLAN_STA_STATE_CONNECTED; wifidev->status_code = WLAN_STATUS_SUCCESS; wifidev->connected_ap = bss_info; @@ -865,6 +867,8 @@ static int wifidriver_start_connect(FAR struct wifi_sim_s *wifidev) memcpy(wifidev->ssid, bss_info->ssid, strlen(bss_info->ssid)); } + + nxmutex_unlock(&wifidev->ap_lock); } else { @@ -914,6 +918,7 @@ static int wifidriver_start_disconnect(FAR struct wifi_sim_s *wifidev) { case IW_MODE_INFRA: { + nxmutex_lock(&wifidev->ap_lock); if (wifidev->state == WLAN_STA_STATE_CONNECTED) { wifidev->state = WLAN_STA_STATE_DISCONNECTED; @@ -927,6 +932,7 @@ static int wifidriver_start_disconnect(FAR struct wifi_sim_s *wifidev) wifi_send_event(wifidev, SIOCGIWAP, &wrqu); } + nxmutex_unlock(&wifidev->ap_lock); netdev_lower_carrier_off(wifidev->lower); if (wifidev->psk_flag == 0) @@ -1041,11 +1047,13 @@ static int wifidriver_get_sensitivity(FAR struct wifi_sim_s *wifidev, case IW_MODE_INFRA: case IW_MODE_MASTER: { + nxmutex_lock(&wifidev->ap_lock); if (wifidriver_sta_is_connected(wifidev)) { pwrq->u.sens.value = -wifidev->connected_ap->RSSI; } + nxmutex_unlock(&wifidev->ap_lock); ninfo("get rssi is %" PRId32 "\n", pwrq->u.sens.value); } break; @@ -1092,6 +1100,7 @@ static int wifidriver_get_freq(FAR struct wifi_sim_s *wifidev, { case IW_MODE_INFRA: { + nxmutex_lock(&wifidev->ap_lock); if (wifidriver_sta_is_connected(wifidev)) { pwrq->u.freq.flags = IW_FREQ_FIXED; @@ -1104,6 +1113,8 @@ static int wifidriver_get_freq(FAR struct wifi_sim_s *wifidev, pwrq->u.freq.e = 0; pwrq->u.freq.m = 2412; } + + nxmutex_unlock(&wifidev->ap_lock); } break; @@ -1590,6 +1601,7 @@ static int wifidriver_get_bssid(FAR struct wifi_sim_s *wifidev, { case IW_MODE_INFRA: { + nxmutex_lock(&wifidev->ap_lock); if (wifidriver_sta_is_connected(wifidev)) { memcpy(pdata, wifidev->connected_ap->bssid, ETH_ALEN); @@ -1599,6 +1611,8 @@ static int wifidriver_get_bssid(FAR struct wifi_sim_s *wifidev, { ret = -ENOTTY; } + + nxmutex_unlock(&wifidev->ap_lock); } break; @@ -1979,6 +1993,8 @@ int wifi_sim_init(FAR struct wifi_sim_lowerhalf_s *netdev) priv->mode = IW_MODE_AUTO; + nxmutex_init(&priv->ap_lock); + return OK; } @@ -1995,6 +2011,7 @@ void wifi_sim_remove(FAR struct wifi_sim_lowerhalf_s *netdev) wifidriver_start_disconnect(sta); } + nxmutex_destroy(&sta->ap_lock); kmm_free(netdev->wifi); }
