From 717d877a44056c51e4a3ab777c4279c3d7a2e220 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 5 Aug 2021 15:42:52 +0200 Subject: [PATCH] fixed 32/64 chars limits in ssid/key --- src/espwifistack.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/espwifistack.cpp b/src/espwifistack.cpp index 94393cb..b178e69 100644 --- a/src/espwifistack.cpp +++ b/src/espwifistack.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include // esp-idf includes @@ -395,6 +394,16 @@ esp_err_t goe_wifi_enable_ap(bool enable, const config &config) return result; } +template +size_t copyStrToBuf(uint8_t (&buf)[LENGTH], std::string_view str) +{ + size_t cutLength = std::min(LENGTH, str.size()); + std::copy(std::begin(str), std::begin(str) + cutLength, buf); + if (str.size() < LENGTH) + buf[str.size()] = '\0'; + return cutLength; +} + wifi_config_t make_ap_config(const ap_config &ap_config) { wifi_config_t wifi_config; @@ -408,13 +417,13 @@ wifi_config_t make_ap_config(const ap_config &ap_config) wifi_config.ap.password[0] = 0; if (!ap_config.ssid.empty()) { - std::snprintf((char*)wifi_config.ap.ssid, sizeof(wifi_config.ap.ssid), "%s", ap_config.ssid.c_str()); - wifi_config.ap.ssid_len = ap_config.ssid.size(); + auto ssidCutLength = copyStrToBuf(wifi_config.ap.ssid, ap_config.ssid); + wifi_config.ap.ssid_len = ssidCutLength; if (!ap_config.key.empty()) { wifi_config.ap.authmode = ap_config.authmode; - std::snprintf((char*)wifi_config.ap.password, sizeof(wifi_config.ap.password), "%s", ap_config.key.c_str()); + copyStrToBuf(wifi_config.ap.password, ap_config.key); } } return wifi_config; @@ -428,6 +437,12 @@ esp_err_t goe_wifi_set_ap_config(const config &config, const ap_config &ap_confi return ESP_FAIL; } + if (ap_config.ssid.size() > 32) + { + ESP_LOGE(TAG, "SSID too long! (size=%zd)", ap_config.ssid.size()); + return ESP_FAIL; + } + if (!ap_config.key.empty()) { if (ap_config.key.size() < 8) @@ -435,7 +450,7 @@ esp_err_t goe_wifi_set_ap_config(const config &config, const ap_config &ap_confi ESP_LOGE(TAG, "passphrase too short! (size=%zd)", ap_config.key.size()); return ESP_FAIL; } - if (ap_config.key.size() > 63) + if (ap_config.key.size() > 64) { ESP_LOGE(TAG, "passphrase too long! (size=%zd)", ap_config.key.size()); return ESP_FAIL; @@ -1296,12 +1311,12 @@ wifi_config_t make_sta_config(std::string_view ssid, std::string_view password, if (!ssid.empty()) { - std::snprintf((char*)wifi_config.sta.ssid, sizeof(wifi_config.sta.ssid), "%s", ssid.data()); + copyStrToBuf(wifi_config.sta.ssid, ssid); if (!password.empty()) { wifi_config.sta.threshold.authmode = WIFI_AUTH_WEP; - std::snprintf((char*)wifi_config.sta.password, sizeof(wifi_config.sta.password), "%s", password.data()); + copyStrToBuf(wifi_config.sta.password, password); } if (bssid) @@ -1329,7 +1344,7 @@ esp_err_t goe_wifi_sta_begin(const config &config, const wifi_entry &sta_config, return ESP_FAIL; } - if (sta_config.ssid.size() > 31) + if (sta_config.ssid.size() > 32) { ESP_LOGE(TAG, "SSID too long! (size=%zd)", sta_config.ssid.size()); return ESP_FAIL; @@ -1343,7 +1358,7 @@ esp_err_t goe_wifi_sta_begin(const config &config, const wifi_entry &sta_config, return ESP_FAIL; } - if (sta_config.key.size() > 63) + if (sta_config.key.size() > 64) { ESP_LOGE(TAG, "key too long! (size=%zd)", sta_config.key.size()); return ESP_FAIL;