From 896b3c746f72b074f0636e69889f6cc1decbc5f8 Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Fri, 5 Jul 2024 16:52:15 +0200 Subject: [PATCH] net: sockets: services: Don't modify pollfd array from other threads pollfd array used with zsock_poll() should not be modified while inside zsock_poll() function as this could lead to unexpected results. For instance, k_poll already monitoring some kernel primitive could report an event, but it will not be processed if the monitored socket file descriptor in the pollfd array was set to -1. In result, zsock_poll() may unexpectedly quit prematurely, returning 0 events, even if it was requested to wait infinitely. The pollfd arrays used by zsock_poll() (ctx.events) is reinitialized when the service thread is restarted so modifying it directly when registering/unregistering service is not really needed. It's enough if those functions notify the eventfd socket used to restart the services thread. Signed-off-by: Robert Lubos --- subsys/net/lib/sockets/sockets_service.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/subsys/net/lib/sockets/sockets_service.c b/subsys/net/lib/sockets/sockets_service.c index 15f662f866a81a..0e720f5de5e28b 100644 --- a/subsys/net/lib/sockets/sockets_service.c +++ b/subsys/net/lib/sockets/sockets_service.c @@ -44,7 +44,6 @@ void net_socket_service_foreach(net_socket_service_cb_t cb, void *user_data) static void cleanup_svc_events(const struct net_socket_service_desc *svc) { for (int i = 0; i < svc->pev_len; i++) { - ctx.events[get_idx(svc) + i].fd = -1; svc->pev[i].event.fd = -1; svc->pev[i].event.events = 0; } @@ -85,10 +84,6 @@ int z_impl_net_socket_service_register(const struct net_socket_service_desc *svc svc->pev[i].event = fds[i]; svc->pev[i].user_data = user_data; } - - for (i = 0; i < svc->pev_len; i++) { - ctx.events[get_idx(svc) + i] = svc->pev[i].event; - } } /* Tell the thread to re-read the variables */