summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenny Levinsen <kl@kl.wtf>2020-11-08 23:59:41 +0100
committerDrew DeVault <sir@cmpwn.com>2020-11-08 21:34:34 -0500
commitfdd27bb4c1f1fb05481368c214e0f0f30a81b0ca (patch)
treed1e2c59447c09a27e97062936c695c18679e4d43 /src
parent74077b6f951865420a78345d5e793bba08fc0edc (diff)
downloadgmnisrv-fdd27bb4c1f1fb05481368c214e0f0f30a81b0ca.tar.gz
gmnisrv-fdd27bb4c1f1fb05481368c214e0f0f30a81b0ca.tar.xz
gmnisrv-fdd27bb4c1f1fb05481368c214e0f0f30a81b0ca.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/server.c4
1 files changed, 4 insertions, 0 deletions
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