mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Ensure that all uses of strncpy in wifi component are safe. (#5636)
This commit is contained in:
		| @@ -261,8 +261,8 @@ void WiFiComponent::set_sta(const WiFiAP &ap) { | ||||
| void WiFiComponent::clear_sta() { this->sta_.clear(); } | ||||
| void WiFiComponent::save_wifi_sta(const std::string &ssid, const std::string &password) { | ||||
|   SavedWifiSettings save{}; | ||||
|   strncpy(save.ssid, ssid.c_str(), sizeof(save.ssid)); | ||||
|   strncpy(save.password, password.c_str(), sizeof(save.password)); | ||||
|   strncpy(save.ssid, ssid.c_str(), sizeof(save.ssid) - 1); | ||||
|   strncpy(save.password, password.c_str(), sizeof(save.password) - 1); | ||||
|   this->pref_.save(&save); | ||||
|   // ensure it's written immediately | ||||
|   global_preferences->sync(); | ||||
|   | ||||
| @@ -164,8 +164,8 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { | ||||
|   // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv417wifi_sta_config_t | ||||
|   wifi_config_t conf; | ||||
|   memset(&conf, 0, sizeof(conf)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), sizeof(conf.sta.ssid)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), sizeof(conf.sta.password)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), sizeof(conf.sta.ssid) - 1); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), sizeof(conf.sta.password) - 1); | ||||
|  | ||||
|   // The weakest authmode to accept in the fast scan mode | ||||
|   if (ap.get_password().empty()) { | ||||
| @@ -661,7 +661,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { | ||||
|  | ||||
|   wifi_config_t conf; | ||||
|   memset(&conf, 0, sizeof(conf)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid) - 1); | ||||
|   conf.ap.channel = ap.get_channel().value_or(1); | ||||
|   conf.ap.ssid_hidden = ap.get_ssid().size(); | ||||
|   conf.ap.max_connection = 5; | ||||
| @@ -672,7 +672,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { | ||||
|     *conf.ap.password = 0; | ||||
|   } else { | ||||
|     conf.ap.authmode = WIFI_AUTH_WPA2_PSK; | ||||
|     strncpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.ssid)); | ||||
|     strncpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.ssid) - 1); | ||||
|   } | ||||
|  | ||||
|   conf.ap.pairwise_cipher = WIFI_CIPHER_TYPE_CCMP; | ||||
|   | ||||
| @@ -230,8 +230,8 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { | ||||
|  | ||||
|   struct station_config conf {}; | ||||
|   memset(&conf, 0, sizeof(conf)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ssid), ap.get_ssid().c_str(), sizeof(conf.ssid)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.password), ap.get_password().c_str(), sizeof(conf.password)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ssid), ap.get_ssid().c_str(), sizeof(conf.ssid) - 1); | ||||
|   strncpy(reinterpret_cast<char *>(conf.password), ap.get_password().c_str(), sizeof(conf.password) - 1); | ||||
|  | ||||
|   if (ap.get_bssid().has_value()) { | ||||
|     conf.bssid_set = 1; | ||||
| @@ -759,7 +759,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { | ||||
|     return false; | ||||
|  | ||||
|   struct softap_config conf {}; | ||||
|   strncpy(reinterpret_cast<char *>(conf.ssid), ap.get_ssid().c_str(), sizeof(conf.ssid)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ssid), ap.get_ssid().c_str(), sizeof(conf.ssid) - 1); | ||||
|   conf.ssid_len = static_cast<uint8>(ap.get_ssid().size()); | ||||
|   conf.channel = ap.get_channel().value_or(1); | ||||
|   conf.ssid_hidden = ap.get_hidden(); | ||||
| @@ -771,7 +771,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { | ||||
|     *conf.password = 0; | ||||
|   } else { | ||||
|     conf.authmode = AUTH_WPA2_PSK; | ||||
|     strncpy(reinterpret_cast<char *>(conf.password), ap.get_password().c_str(), sizeof(conf.password)); | ||||
|     strncpy(reinterpret_cast<char *>(conf.password), ap.get_password().c_str(), sizeof(conf.password) - 1); | ||||
|   } | ||||
|  | ||||
|   ETS_UART_INTR_DISABLE(); | ||||
|   | ||||
| @@ -275,8 +275,8 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { | ||||
|   // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv417wifi_sta_config_t | ||||
|   wifi_config_t conf; | ||||
|   memset(&conf, 0, sizeof(conf)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), sizeof(conf.sta.ssid)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), sizeof(conf.sta.password)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), sizeof(conf.sta.ssid) - 1); | ||||
|   strncpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), sizeof(conf.sta.password) - 1); | ||||
|  | ||||
|   // The weakest authmode to accept in the fast scan mode | ||||
|   if (ap.get_password().empty()) { | ||||
| @@ -823,7 +823,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { | ||||
|  | ||||
|   wifi_config_t conf; | ||||
|   memset(&conf, 0, sizeof(conf)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid)); | ||||
|   strncpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid) - 1); | ||||
|   conf.ap.channel = ap.get_channel().value_or(1); | ||||
|   conf.ap.ssid_hidden = ap.get_ssid().size(); | ||||
|   conf.ap.max_connection = 5; | ||||
| @@ -834,7 +834,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { | ||||
|     *conf.ap.password = 0; | ||||
|   } else { | ||||
|     conf.ap.authmode = WIFI_AUTH_WPA2_PSK; | ||||
|     strncpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.password)); | ||||
|     strncpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.password) - 1); | ||||
|   } | ||||
|  | ||||
|   // pairwise cipher of SoftAP, group cipher will be derived using this. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user