From fdd27bb4c1f1fb05481368c214e0f0f30a81b0ca Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Sun, 8 Nov 2020 23:59:41 +0100 Subject: [PATCH] Update pollfd pointers when destroying a client The client pollfd pointer would go stale when the server pollfd array was moved to compensate for a destroyed client, which in turn led to poll breakage. Refresh the pollfd pointers after memmove. --- src/server.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/server.c b/src/server.c index 7fad522..e7566bf 100644 --- a/src/server.c +++ b/src/server.c @@ -209,6 +209,10 @@ disconnect_client(struct gmnisrv_server *server, struct gmnisrv_client *client) (server->fdsz - (server->nlisten + index + 1)) * sizeof(struct pollfd)); --server->nfds; --server->nclients; + + for (size_t idx = index; idx < server->nclients; idx++) { + server->clients[idx].pollfd = &server->fds[server->nlisten + index]; + } } static int