Skip to content

Commit

Permalink
Merge branch 'fix/wifi_netif_null_deref_v5.3' into 'release/v5.3'
Browse files Browse the repository at this point in the history
esp_wifi: Add null pointer checks to WiFi-netif APIs (v5.3)

See merge request espressif/esp-idf!34158
  • Loading branch information
Jiang Jiang Jian committed Oct 25, 2024
2 parents 1a9959b + 5438287 commit e071521
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,21 @@ TEST(esp_netif, dhcp_server_state_transitions_mesh)
#endif // CONFIG_ESP_WIFI_ENABLED && CONFIG_ESP_WIFI_SOFTAP_SUPPORT

#ifdef CONFIG_ESP_WIFI_ENABLED
/*
* This checks some semi-public API for null dereference
*/
TEST(esp_netif, wifi_netif_api_null_deref)
{
esp_wifi_destroy_if_driver(NULL); // returns void: just checking if won't crash
TEST_ASSERT_NOT_EQUAL(ESP_OK, esp_wifi_get_if_mac(NULL, NULL));
TEST_ASSERT_NOT_EQUAL(true, esp_wifi_is_if_ready_when_started(NULL));
TEST_ASSERT_NOT_EQUAL(ESP_OK, esp_wifi_register_if_rxcb(NULL, NULL, NULL));
}

/*
* This test validates convenience API esp_netif_create_wifi() which creates WiFi station
* or API with the specified inherent network config.
*/
TEST(esp_netif, create_custom_wifi_interfaces)
{
esp_netif_t *ap = NULL;
Expand Down Expand Up @@ -591,6 +606,7 @@ TEST_GROUP_RUNNER(esp_netif)
RUN_TEST_CASE(esp_netif, create_delete_multiple_netifs)
RUN_TEST_CASE(esp_netif, find_netifs)
#ifdef CONFIG_ESP_WIFI_ENABLED
RUN_TEST_CASE(esp_netif, wifi_netif_api_null_deref)
RUN_TEST_CASE(esp_netif, create_custom_wifi_interfaces)
RUN_TEST_CASE(esp_netif, create_destroy_default_wifi)
#endif
Expand Down
8 changes: 7 additions & 1 deletion components/esp_wifi/src/wifi_netif.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ wifi_netif_driver_t esp_wifi_create_if_driver(wifi_interface_t wifi_if)

esp_err_t esp_wifi_get_if_mac(wifi_netif_driver_t ifx, uint8_t mac[6])
{
if (ifx == NULL || mac == NULL) {
return ESP_ERR_INVALID_ARG;
}
wifi_interface_t wifi_interface = ifx->wifi_if;

return esp_wifi_get_mac(wifi_interface, mac);
Expand All @@ -123,14 +126,17 @@ bool esp_wifi_is_if_ready_when_started(wifi_netif_driver_t ifx)
{
#ifdef CONFIG_ESP_WIFI_SOFTAP_SUPPORT
// WiFi rxcb to be register wifi rxcb on start for AP only, station gets it registered on connect event
return (ifx->wifi_if == WIFI_IF_AP);
return (ifx && ifx->wifi_if == WIFI_IF_AP);
#else
return false;
#endif
}

esp_err_t esp_wifi_register_if_rxcb(wifi_netif_driver_t ifx, esp_netif_receive_t fn, void * arg)
{
if (ifx == NULL || fn == NULL || arg == NULL) {
return ESP_ERR_INVALID_ARG;
}
if (ifx->base.netif != arg) {
ESP_LOGE(TAG, "Invalid argument: supplied netif=%p does not equal to interface netif=%p", arg, ifx->base.netif);
return ESP_ERR_INVALID_ARG;
Expand Down

0 comments on commit e071521

Please sign in to comment.