diff --git a/esphome/components/socket/bsd_sockets_impl.h b/esphome/components/socket/bsd_sockets_impl.h index 6700227b1eb..6e2af08ab40 100644 --- a/esphome/components/socket/bsd_sockets_impl.h +++ b/esphome/components/socket/bsd_sockets_impl.h @@ -59,7 +59,7 @@ class BSDSocketImpl { #if defined(USE_LWIP_FAST_SELECT) && defined(CONFIG_LWIP_TCPIP_CORE_LOCKING) // Fast path for TCP_NODELAY: directly set the pcb flag under the TCPIP core lock, // bypassing lwip_setsockopt overhead (socket lookups, hook, switch cascade, refcounting). - if (level == IPPROTO_TCP && optname == TCP_NODELAY && optlen == sizeof(int)) { + if (level == IPPROTO_TCP && optname == TCP_NODELAY && optlen == sizeof(int) && optval != nullptr) { LwIPLock lock; if (esphome_lwip_set_nodelay(this->cached_sock_, *reinterpret_cast(optval) != 0)) return 0; diff --git a/esphome/components/socket/lwip_sockets_impl.h b/esphome/components/socket/lwip_sockets_impl.h index 94f4d29229c..6ab4ecf2ee5 100644 --- a/esphome/components/socket/lwip_sockets_impl.h +++ b/esphome/components/socket/lwip_sockets_impl.h @@ -55,7 +55,7 @@ class LwIPSocketImpl { #if defined(USE_LWIP_FAST_SELECT) && defined(CONFIG_LWIP_TCPIP_CORE_LOCKING) // Fast path for TCP_NODELAY: directly set the pcb flag under the TCPIP core lock, // bypassing lwip_setsockopt overhead (socket lookups, hook, switch cascade, refcounting). - if (level == IPPROTO_TCP && optname == TCP_NODELAY && optlen == sizeof(int)) { + if (level == IPPROTO_TCP && optname == TCP_NODELAY && optlen == sizeof(int) && optval != nullptr) { LwIPLock lock; if (esphome_lwip_set_nodelay(this->cached_sock_, *reinterpret_cast(optval) != 0)) return 0; diff --git a/esphome/core/lwip_fast_select.c b/esphome/core/lwip_fast_select.c index b1d54b01a6c..ca693494670 100644 --- a/esphome/core/lwip_fast_select.c +++ b/esphome/core/lwip_fast_select.c @@ -220,6 +220,8 @@ void esphome_lwip_hook_socket(struct lwip_sock *sock) { bool esphome_lwip_set_nodelay(struct lwip_sock *sock, bool enable) { if (sock == NULL || sock->conn == NULL || sock->conn->pcb.tcp == NULL) return false; + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) + return false; if (enable) { tcp_nagle_disable(sock->conn->pcb.tcp); } else { diff --git a/esphome/core/lwip_fast_select.h b/esphome/core/lwip_fast_select.h index bcb3dc04f78..50706ba9f69 100644 --- a/esphome/core/lwip_fast_select.h +++ b/esphome/core/lwip_fast_select.h @@ -70,7 +70,7 @@ void esphome_lwip_wake_main_loop_from_isr(int *px_higher_priority_task_woken); /// Must be called with the TCPIP core lock held (LwIPLock in C++). /// This bypasses lwip_setsockopt() overhead (socket lookups, switch cascade, /// hooks, refcounting) — just a direct pcb->flags bit set/clear. -/// Returns true if successful, false if sock/conn/pcb is NULL. +/// Returns true if successful, false if sock/conn/pcb is NULL or the socket is not TCP. bool esphome_lwip_set_nodelay(struct lwip_sock *sock, bool enable); /// Wake the main loop task from any context (ISR, thread, or main loop).