summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2020-09-27 10:18:52 -0400
committerDrew DeVault <sir@cmpwn.com>2020-09-27 10:18:52 -0400
commit7fed84898befefa9f535969ba3da24df44ebe8be (patch)
treedbf8b51a2b24f790bcb23de7a4d6d61d383add4f /src
parent1f229ba123a4342418d3af1d485aa34ab6e036db (diff)
downloadgmnisrv-7fed84898befefa9f535969ba3da24df44ebe8be.tar.gz
gmnisrv-7fed84898befefa9f535969ba3da24df44ebe8be.tar.xz
gmnisrv-7fed84898befefa9f535969ba3da24df44ebe8be.zip
Only handle one client per poll iteration
This is a bit of a hack but it avoids some problems with invalid reads when a client gets disconnected
Diffstat (limited to 'src')
-rw-r--r--src/server.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/server.c b/src/server.c
index a896e6a..488f2eb 100644
--- a/src/server.c
+++ b/src/server.c
@@ -322,8 +322,8 @@ client_writable(struct gmnisrv_server *server, struct gmnisrv_client *client)
break;
case RESPOND_BODY:
if (client->bufix >= client->bufln) {
- n = fread(client->buf, 1,
- sizeof(client->buf), client->body);
+ n = fread(client->buf, 1, sizeof(client->buf),
+ client->body);
if (n == -1) {
client_error(&client->addr,
"Error reading response body: %s",
@@ -443,13 +443,9 @@ server_run(struct gmnisrv_server *server)
for (size_t i = 0; i < server->nclients; ++i) {
if ((server->fds[server->nlisten + i].revents & (POLLHUP | POLLERR))) {
disconnect_client(server, &server->clients[i]);
- --i;
- continue;
- }
- if ((server->fds[server->nlisten + i].revents & POLLIN)) {
+ } else if ((server->fds[server->nlisten + i].revents & POLLIN)) {
client_readable(server, &server->clients[i]);
- }
- if ((server->fds[server->nlisten + i].revents & POLLOUT)) {
+ } else if ((server->fds[server->nlisten + i].revents & POLLOUT)) {
client_writable(server, &server->clients[i]);
}
}