From abe473443ed5db97c2cd441b55844b0fb450dd71 Mon Sep 17 00:00:00 2001 From: usualtree <1340399194@qq.com> Date: Thu, 29 Oct 2026 19:20:34 +0800 Subject: [PATCH 1/4] [dhcp] fix unbounded client allocation on pool exhaustion --- components/net/lwip-dhcpd/dhcp_server_raw.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/components/net/lwip-dhcpd/dhcp_server_raw.c b/components/net/lwip-dhcpd/dhcp_server_raw.c index e43eb7fd4ca..75033bc7702 100644 --- a/components/net/lwip-dhcpd/dhcp_server_raw.c +++ b/components/net/lwip-dhcpd/dhcp_server_raw.c @@ -232,6 +232,7 @@ dhcp_client_alloc(struct dhcp_server *dhcpserver, struct dhcp_msg *msg, { u8_t *opt; u32_t ipaddr; + u32_t first_candidate; struct dhcp_client_node *node; node = dhcp_client_find_by_mac(dhcpserver, msg->chaddr, msg->hlen); @@ -250,18 +251,30 @@ dhcp_client_alloc(struct dhcp_server *dhcpserver, struct dhcp_msg *msg, } } -dhcp_alloc_again: - node = dhcp_client_find_by_ip(dhcpserver, &dhcpserver->current); - if (node != NULL) + /* Check each pool address at most once. */ + first_candidate = dhcpserver->current.addr; + do { + node = dhcp_client_find_by_ip(dhcpserver, &dhcpserver->current); + if (node == NULL) + { + break; + } + ipaddr = (ntohl(dhcpserver->current.addr) + 1); if (ipaddr > ntohl(dhcpserver->end.addr)) { ipaddr = ntohl(dhcpserver->start.addr); } dhcpserver->current.addr = htonl(ipaddr); - goto dhcp_alloc_again; } + while (dhcpserver->current.addr != first_candidate); + + if (node != NULL) + { + return NULL; + } + node = (struct dhcp_client_node *)mem_malloc(sizeof(struct dhcp_client_node)); if (node == NULL) { From 7eb386faa15e4727cb92f7a6f3192fa50b13a777 Mon Sep 17 00:00:00 2001 From: usualtree <1340399194@qq.com> Date: Mon, 2 Nov 2026 16:48:58 +0800 Subject: [PATCH 2/4] [dhcp] suppress known old-lwIP preprocessor diagnostic Suppress the intentional old-lwIP #error for Cppcheck and keep the directive at column zero for clang-format. --- components/net/lwip-dhcpd/dhcp_server_raw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/net/lwip-dhcpd/dhcp_server_raw.c b/components/net/lwip-dhcpd/dhcp_server_raw.c index 75033bc7702..515a636a2a8 100644 --- a/components/net/lwip-dhcpd/dhcp_server_raw.c +++ b/components/net/lwip-dhcpd/dhcp_server_raw.c @@ -48,7 +48,8 @@ #include #if (LWIP_VERSION) < 0x02000000U - #error "not support old LWIP" +// cppcheck-suppress preprocessorErrorDirective +#error "not support old LWIP" #endif #if !LWIP_IPV4 From dbc5f36b64372a3a08449787f28c1f2685111d24 Mon Sep 17 00:00:00 2001 From: usualtreee <1340399194@qq.com> Date: Tue, 3 Nov 2026 10:26:49 +0800 Subject: [PATCH 3/4] [dhcp] Fix do-while formatting --- components/net/lwip-dhcpd/dhcp_server_raw.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/components/net/lwip-dhcpd/dhcp_server_raw.c b/components/net/lwip-dhcpd/dhcp_server_raw.c index 515a636a2a8..ccf13831e0e 100644 --- a/components/net/lwip-dhcpd/dhcp_server_raw.c +++ b/components/net/lwip-dhcpd/dhcp_server_raw.c @@ -268,8 +268,7 @@ dhcp_client_alloc(struct dhcp_server *dhcpserver, struct dhcp_msg *msg, ipaddr = ntohl(dhcpserver->start.addr); } dhcpserver->current.addr = htonl(ipaddr); - } - while (dhcpserver->current.addr != first_candidate); + } while (dhcpserver->current.addr != first_candidate); if (node != NULL) { @@ -455,7 +454,7 @@ dhcp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t } #else /* default use gatewary dns server */ - SMEMCPY(opt_buf, &(dhcp_server->netif->ip_addr), 4); + SMEMCPY(opt_buf, &ip_2_ip4(&dhcp_server->netif->ip_addr), 4); #endif /* DHCP_DNS_SERVER_IP */ opt_buf += 4; @@ -532,7 +531,7 @@ dhcp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t } #else /* default use gatewary dns server */ - SMEMCPY(opt_buf, &(dhcp_server->netif->ip_addr), 4); + SMEMCPY(opt_buf, &ip_2_ip4(&dhcp_server->netif->ip_addr), 4); #endif /* DHCP_DNS_SERVER_IP */ opt_buf += 4; From e4ef5cd0424c385c64949b3f0a88558076c9c907 Mon Sep 17 00:00:00 2001 From: usualtreee <1340399194@qq.com> Date: Tue, 3 Nov 2026 10:35:42 +0800 Subject: [PATCH 4/4] [dhcp] Restore unrelated address expressions --- components/net/lwip-dhcpd/dhcp_server_raw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/net/lwip-dhcpd/dhcp_server_raw.c b/components/net/lwip-dhcpd/dhcp_server_raw.c index ccf13831e0e..f0d7b4aaedc 100644 --- a/components/net/lwip-dhcpd/dhcp_server_raw.c +++ b/components/net/lwip-dhcpd/dhcp_server_raw.c @@ -454,7 +454,7 @@ dhcp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t } #else /* default use gatewary dns server */ - SMEMCPY(opt_buf, &ip_2_ip4(&dhcp_server->netif->ip_addr), 4); + SMEMCPY(opt_buf, &(dhcp_server->netif->ip_addr), 4); #endif /* DHCP_DNS_SERVER_IP */ opt_buf += 4; @@ -531,7 +531,7 @@ dhcp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t } #else /* default use gatewary dns server */ - SMEMCPY(opt_buf, &ip_2_ip4(&dhcp_server->netif->ip_addr), 4); + SMEMCPY(opt_buf, &(dhcp_server->netif->ip_addr), 4); #endif /* DHCP_DNS_SERVER_IP */ opt_buf += 4;