From 1830bc4d296f101b04333bb93404c14e147ae511 Mon Sep 17 00:00:00 2001 From: jgujarathi Date: Mon, 4 Mar 2024 12:08:51 +0530 Subject: [PATCH] fix(wpa_supplicant): Ensure dpp auth structure is deinited in dpp task context - Ensure that the dpp auth data gets deinited only in DPP task context to ensure that there are no concurrency issues in usage of DPP auth data. --- .../esp_supplicant/src/esp_dpp.c | 30 ++++++++++++++----- .../esp_supplicant/src/esp_dpp_i.h | 1 + 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_dpp.c b/components/wpa_supplicant/esp_supplicant/src/esp_dpp.c index 83ef62caa2..3ece743f01 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_dpp.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_dpp.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -63,20 +63,31 @@ static int esp_dpp_post_evt(uint32_t evt_id, uint32_t data) if (evt_id != SIG_DPP_DEL_TASK) { DPP_API_UNLOCK(); } + wpa_printf(MSG_DEBUG,"DPP: Sent event %d to DPP task", evt_id); return ret; end: if (evt) { os_free(evt); } + wpa_printf(MSG_ERROR,"DPP: Failed to send event %d to DPP task", evt_id); return ret; } +static uint8_t esp_dpp_deinit_auth(void) +{ + esp_err_t ret = esp_dpp_post_evt(SIG_DPP_DEINIT_AUTH, 0); + if (ESP_OK != ret) { + wpa_printf(MSG_ERROR, "Failed to post DPP auth deinit to DPP Task(status=%d)", ret); + return ret; + } + return ESP_OK; +} + static void esp_dpp_call_cb(esp_supp_dpp_event_t evt, void *data) { if ( evt == ESP_SUPP_DPP_FAIL && s_dpp_ctx.dpp_auth) { - dpp_auth_deinit(s_dpp_ctx.dpp_auth); - s_dpp_ctx.dpp_auth = NULL; + esp_dpp_deinit_auth(); } s_dpp_ctx.dpp_event_cb(evt, data); } @@ -88,10 +99,6 @@ static void esp_dpp_auth_conf_wait_timeout(void *eloop_ctx, void *timeout_ctx) wpa_printf(MSG_DEBUG, "DPP: Terminate authentication exchange due to Auth Confirm timeout"); - if (s_dpp_ctx.dpp_auth) { - dpp_auth_deinit(s_dpp_ctx.dpp_auth); - s_dpp_ctx.dpp_auth = NULL; - } esp_dpp_call_cb(ESP_SUPP_DPP_FAIL, (void *)ESP_ERR_DPP_AUTH_TIMEOUT); } @@ -438,6 +445,15 @@ static void esp_dpp_task(void *pvParameters ) } break; + case SIG_DPP_DEINIT_AUTH: { + if (s_dpp_ctx.dpp_auth) { + dpp_auth_deinit(s_dpp_ctx.dpp_auth); + s_dpp_ctx.dpp_auth = NULL; + } + wpa_printf(MSG_DEBUG, "DPP auth deinintialized"); + } + break; + default: break; } diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_dpp_i.h b/components/wpa_supplicant/esp_supplicant/src/esp_dpp_i.h index 2e97d1aa39..1208eba63a 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_dpp_i.h +++ b/components/wpa_supplicant/esp_supplicant/src/esp_dpp_i.h @@ -23,6 +23,7 @@ enum SIG_DPP { SIG_DPP_RX_ACTION, SIG_DPP_LISTEN_NEXT_CHANNEL, SIG_DPP_DEL_TASK, + SIG_DPP_DEINIT_AUTH, SIG_DPP_MAX, };