[PATCH 1/1] Fix NAN USD state machine stall seen with listen failure.

Jouni Malinen j at w1.fi
Thu Jun 19 02:04:18 PDT 2025


On Tue, Apr 29, 2025 at 01:48:41PM +0530, Ajay Davanageri wrote:
> If driver returns -EBUSY for remain_on_channel operation, NAN USD state-machine gets stuck and no further listen is configured from supplicant.
> This patch clears the states and re-triggers the nan_de_timer to restart the listen operation.

> diff --git a/src/common/nan_de.c b/src/common/nan_de.c
> @@ -165,7 +165,6 @@ void nan_de_flush(struct nan_de *de)
>  	nan_de_clear_pending(de);
>  }
>  
> -
>  static void nan_de_pause_state(struct nan_de_service *srv, const u8 *peer_addr,

Please do not include these unrelated whitespace changes in nan_de.c.

> diff --git a/wpa_supplicant/nan_usd.c b/wpa_supplicant/nan_usd.c

> +static void wpas_nan_usd_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx)
> +{
> +	struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)eloop_ctx;
> +	struct wpas_nan_usd_listen_work *lwork = (struct wpas_nan_usd_listen_work *)timeout_ctx;
> +
> +	wpas_nan_usd_cancel_remain_on_channel_cb(wpa_s, lwork->freq);
> +	return;
> +}

No need for those explicit typecasts from void pointers or that
"return;" at the end of the function.

> @@ -209,6 +218,9 @@ static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
>  		wpas_nan_usd_listen_work_done(wpa_s);
> +                eloop_cancel_timeout(wpas_nan_usd_remain_on_channel_timeout, wpa_s, NULL);
> +		/* restart the listen state after a delay */
> +		eloop_register_timeout(0, 500, wpas_nan_usd_remain_on_channel_timeout, wpa_s, lwork)

wpas_nan_usd_listen_work_done() frees lwork. That would seem to result
in the callback function dereferencing freed memory (lwork->freq).

-- 
Jouni Malinen                                            PGP id EFC895FA



More information about the Hostap mailing list