embassy-net: dns: bound the dns_servers slice

`smoltcp::socket::dns::Socket::update_servers()` will
panic if a slice exceeding a fixed length is passed
to it. This is can be especially inconvenient when
using DHCP config.

Avoid panicking by using at most `DNS_MAX_SERVER_COUNT`
DNS servers from the config.
This commit is contained in:
Gasper Stukelj 2024-07-28 21:50:52 +02:00
parent e54c753537
commit c5d077a2c6

View File

@ -34,6 +34,8 @@ use embassy_sync::waitqueue::WakerRegistration;
use embassy_time::{Instant, Timer}; use embassy_time::{Instant, Timer};
#[allow(unused_imports)] #[allow(unused_imports)]
use heapless::Vec; use heapless::Vec;
#[cfg(feature = "dns")]
pub use smoltcp::config::DNS_MAX_SERVER_COUNT;
#[cfg(feature = "igmp")] #[cfg(feature = "igmp")]
pub use smoltcp::iface::MulticastError; pub use smoltcp::iface::MulticastError;
#[allow(unused_imports)] #[allow(unused_imports)]
@ -823,9 +825,17 @@ impl<D: Driver> Inner<D> {
// Apply DNS servers // Apply DNS servers
#[cfg(feature = "dns")] #[cfg(feature = "dns")]
s.sockets if !dns_servers.is_empty() {
.get_mut::<smoltcp::socket::dns::Socket>(self.dns_socket) let count = if dns_servers.len() > DNS_MAX_SERVER_COUNT {
.update_servers(&dns_servers[..]); warn!("Number of DNS servers exceeds DNS_MAX_SERVER_COUNT, truncating list.");
DNS_MAX_SERVER_COUNT
} else {
dns_servers.len()
};
s.sockets
.get_mut::<smoltcp::socket::dns::Socket>(self.dns_socket)
.update_servers(&dns_servers[..count]);
}
self.config_waker.wake(); self.config_waker.wake();
} }