[BUG] server check intervals must not be null

[cherry-picked from commit e38388033f3df181ff6a2ee227789cd743d17dc1]

If server check interval is null, we might end up looping in
process_srv_chk().

Prevent those values from being zero and add some control in
process_srv_chk() against infinite loops.
This commit is contained in:
Willy Tarreau 2009-03-21 18:58:32 +01:00
parent dad07a8612
commit ea3caccc0f
2 changed files with 29 additions and 0 deletions

View File

@ -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;
}

View File

@ -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");