From 6384dde85bb0729137c4de3c1c994edc5d7c8091 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 4 Jan 2013 01:15:08 +0100 Subject: [PATCH] fix resuming accept() calls after exceeding client limit --- client.c | 5 +++-- listen.c | 11 +++++++++-- uhttpd.h | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/client.c b/client.c index 7920102..dd3f912 100644 --- a/client.c +++ b/client.c @@ -438,7 +438,7 @@ static void set_addr(struct uh_addr *addr, void *src) } } -void uh_accept_client(int fd) +bool uh_accept_client(int fd) { static struct client *next_client; struct client *cl; @@ -455,7 +455,7 @@ void uh_accept_client(int fd) sl = sizeof(addr); sfd = accept(fd, (struct sockaddr *) &addr, &sl); if (sfd < 0) - return; + return false; set_addr(&cl->peer_addr, &addr); sl = sizeof(addr); @@ -476,6 +476,7 @@ void uh_accept_client(int fd) next_client = NULL; n_clients++; cl->id = client_id++; + return true; } void uh_close_fds(void) diff --git a/listen.c b/listen.c index c4b6b2b..f11768a 100644 --- a/listen.c +++ b/listen.c @@ -56,7 +56,7 @@ void uh_unblock_listeners(void) { struct listener *l; - if (!n_blocked && conf.max_requests && + if ((!n_blocked && conf.max_requests) || n_clients >= conf.max_requests) return; @@ -64,6 +64,10 @@ void uh_unblock_listeners(void) if (!l->blocked) continue; + l->fd.cb(&l->fd, ULOOP_READ); + if (n_clients >= conf.max_requests) + break; + n_blocked--; l->blocked = false; uloop_fd_add(&l->fd, ULOOP_READ); @@ -74,7 +78,10 @@ static void listener_cb(struct uloop_fd *fd, unsigned int events) { struct listener *l = container_of(fd, struct listener, fd); - uh_accept_client(fd->fd); + while (1) { + if (!uh_accept_client(fd->fd)) + break; + } if (conf.max_requests && n_clients >= conf.max_requests) uh_block_listener(l); diff --git a/uhttpd.h b/uhttpd.h index a9777e8..d67e48c 100644 --- a/uhttpd.h +++ b/uhttpd.h @@ -192,7 +192,7 @@ extern struct dispatch_handler cgi_dispatch; void uh_index_add(const char *filename); -void uh_accept_client(int fd); +bool uh_accept_client(int fd); void uh_unblock_listeners(void); void uh_setup_listeners(void); -- 2.11.0