diff options
| author | Kenny Levinsen <kl@kl.wtf> | 2020-11-08 23:59:41 +0100 |
|---|---|---|
| committer | Drew DeVault <sir@cmpwn.com> | 2020-11-08 21:34:34 -0500 |
| commit | fdd27bb4c1f1fb05481368c214e0f0f30a81b0ca (patch) | |
| tree | d1e2c59447c09a27e97062936c695c18679e4d43 | |
| parent | 74077b6f951865420a78345d5e793bba08fc0edc (diff) | |
| download | gmnisrv-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.
| -rw-r--r-- | src/server.c | 4 |
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 |
