From 7a9664872e248344f14aec3ad2a34a11acf60ae8 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 15 Apr 2007 10:58:02 +0200 Subject: [PATCH] [MINOR] recompute maxfd before touching fdtab It may be dangerous to play with fdtab before doing fd_insert() because this last one is responsible for growing maxfd as needed. Call fd_insert() before instead. --- src/checks.c | 2 +- src/client.c | 3 +-- src/proxy.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/checks.c b/src/checks.c index 0a272018d..099692579 100644 --- a/src/checks.c +++ b/src/checks.c @@ -329,6 +329,7 @@ int process_chk(struct task *t) //fprintf(stderr, "process_chk: 4\n"); s->curfd = fd; /* that's how we know a test is in progress ;-) */ + fd_insert(fd); fdtab[fd].owner = t; fdtab[fd].cb[DIR_RD].f = &event_srv_chk_r; fdtab[fd].cb[DIR_RD].b = NULL; @@ -339,7 +340,6 @@ int process_chk(struct task *t) #ifdef DEBUG_FULL assert (!EV_FD_ISSET(fd, DIR_RD)); #endif - fd_insert(fd); /* FIXME: we allow up to for a connection to establish, but we should use another parameter */ tv_delayfrom(&t->expire, &now, s->inter); task_queue(t); /* restore t to its place in the task list */ diff --git a/src/client.c b/src/client.c index 6b27df60f..46cf43e4f 100644 --- a/src/client.c +++ b/src/client.c @@ -378,6 +378,7 @@ int event_accept(int fd) { s->rep->wto = s->fe->clitimeout; s->rep->cto = 0; + fd_insert(cfd); fdtab[cfd].owner = t; fdtab[cfd].state = FD_STREADY; fdtab[cfd].cb[DIR_RD].f = &stream_sock_read; @@ -402,8 +403,6 @@ int event_accept(int fd) { EV_FD_SET(cfd, DIR_RD); } - fd_insert(cfd); - tv_eternity(&s->req->rex); tv_eternity(&s->req->wex); tv_eternity(&s->req->cex); diff --git a/src/proxy.c b/src/proxy.c index a5431c2b3..93eab162c 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -147,12 +147,12 @@ int start_proxies(int verbose) listener->fd = fd; /* the function for the accept() event */ + fd_insert(fd); fdtab[fd].cb[DIR_RD].f = &event_accept; fdtab[fd].cb[DIR_WR].f = NULL; /* never called */ fdtab[fd].cb[DIR_RD].b = fdtab[fd].cb[DIR_WR].b = NULL; fdtab[fd].owner = (struct task *)curproxy; /* reference the proxy instead of a task */ fdtab[fd].state = FD_STLISTEN; - fd_insert(fd); listeners++; }