diff --git a/src/cfgparse.c b/src/cfgparse.c index d01b4754a..2d226baf0 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -1638,6 +1638,11 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv) file, linenum, *err, newsrv->id); return -1; } + if (val <= 0) { + Alert("parsing [%s:%d]: invalid value %d for argument '%s' of server %s.\n", + file, linenum, val, args[cur_arg], newsrv->id); + return -1; + } newsrv->inter = val; cur_arg += 2; } @@ -1648,6 +1653,11 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv) file, linenum, *err, newsrv->id); return -1; } + if (val <= 0) { + Alert("parsing [%s:%d]: invalid value %d for argument '%s' of server %s.\n", + file, linenum, val, args[cur_arg], newsrv->id); + return -1; + } newsrv->fastinter = val; cur_arg += 2; } @@ -1658,6 +1668,11 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv) file, linenum, *err, newsrv->id); return -1; } + if (val <= 0) { + Alert("parsing [%s:%d]: invalid value %d for argument '%s' of server %s.\n", + file, linenum, val, args[cur_arg], newsrv->id); + return -1; + } newsrv->downinter = val; cur_arg += 2; } @@ -1704,6 +1719,11 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv) file, linenum, *err, newsrv->id); return -1; } + if (val <= 0) { + Alert("parsing [%s:%d]: invalid value %d for argument '%s' of server %s.\n", + file, linenum, val, args[cur_arg], newsrv->id); + return -1; + } newsrv->slowstart = (val + 999) / 1000; cur_arg += 2; } diff --git a/src/checks.c b/src/checks.c index 82de26037..a0bca95ca 100644 --- a/src/checks.c +++ b/src/checks.c @@ -529,6 +529,7 @@ static int event_srv_chk_r(int fd) void process_chk(struct task *t, struct timeval *next) { __label__ new_chk, out; + int attempts = 0; struct server *s = t->context; struct sockaddr_in sa; int fd; @@ -537,6 +538,14 @@ void process_chk(struct task *t, struct timeval *next) //fprintf(stderr, "process_chk: task=%p\n", t); new_chk: + if (attempts++ > 0) { + /* we always fail to create a server, let's stop insisting... */ + while (tv_isle(&t->expire, &now)) + tv_ms_add(&t->expire, &t->expire, s->inter); + task_queue(t); /* restore t to its place in the task list */ + *next = t->expire; + goto out; + } fd = s->curfd; if (fd < 0) { /* no check currently running */ //fprintf(stderr, "process_chk: 2\n");