>From 17ad2d379c395b7be592633335468ac4f515ce57 Mon Sep 17 00:00:00 2001
From: Krzysztof Piotr Oledzki <o...@ans.pl>
Date: Sun, 27 Sep 2009 16:17:31 +0200
Subject: [BUG] check if rise/fall has an argument and it is > 0

Check if rise/fall has an argument and it is > 0  or bad things may happen
in the health checks. ;)

Now it is verified and the code no longer allows for such condition:

backend bad
        (...)
        server o-f0 192.168.129.27:80 check inter 4000 source 0.0.0.0 rise 0
        server o-r0 192.168.129.27:80 check inter 4000 source 0.0.0.0 fall 0
        server o-f1 192.168.129.27:80 check inter 4000 source 0.0.0.0 rise
        server o-r1 192.168.129.27:80 check inter 4000 source 0.0.0.0 fall

[ALERT] 269/161830 (24136) : parsing [../git/haproxy.cfg:98]: 'rise' has to be 
> 0.
[ALERT] 269/161830 (24136) : parsing [../git/haproxy.cfg:99]: 'fall' has to be 
> 0.
[ALERT] 269/161830 (24136) : parsing [../git/haproxy.cfg:100]: 'rise' expects 
an integer argument.
[ALERT] 269/161830 (24136) : parsing [../git/haproxy.cfg:101]: 'fall' expects 
an integer argument.

Also add endline in the custom id checking code.

---
 src/cfgparse.c |   33 +++++++++++++++++++++++++++++++--
 1 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/cfgparse.c b/src/cfgparse.c
index a86ed0e..7a277f1 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -1162,7 +1162,7 @@ int cfg_parse_listen(const char *file, int linenum, char 
**args, int kwm)
                curproxy->uuid = atol(args[1]);
 
                if (curproxy->uuid < 1001) {
-                       Alert("parsing [%s:%d]: custom id has to be > 1000",
+                       Alert("parsing [%s:%d]: custom id has to be > 1000.\n",
                                file, linenum);
                        err_code |= ERR_ALERT | ERR_FATAL;
                        goto out;
@@ -2339,7 +2339,7 @@ int cfg_parse_listen(const char *file, int linenum, char 
**args, int kwm)
                                newsrv->puid = atol(args[cur_arg + 1]);
 
                                if (newsrv->puid< 1001) {
-                                       Alert("parsing [%s:%d]: custom id has 
to be > 1000",
+                                       Alert("parsing [%s:%d]: custom id has 
to be > 1000.\n",
                                                file, linenum);
                                        err_code |= ERR_ALERT | ERR_FATAL;
                                        goto out;
@@ -2365,12 +2365,41 @@ int cfg_parse_listen(const char *file, int linenum, 
char **args, int kwm)
                                cur_arg += 2;
                        }
                        else if (!strcmp(args[cur_arg], "rise")) {
+                               if (!*args[cur_arg + 1]) {
+                                       Alert("parsing [%s:%d]: '%s' expects an 
integer argument.\n",
+                                               file, linenum, args[cur_arg]);
+                                       err_code |= ERR_ALERT | ERR_FATAL;
+                                       goto out;
+                               }
+
                                newsrv->rise = atol(args[cur_arg + 1]);
+                               if (newsrv->rise <= 0) {
+                                       Alert("parsing [%s:%d]: '%s' has to be 
> 0.\n",
+                                               file, linenum, args[cur_arg]);
+                                       err_code |= ERR_ALERT | ERR_FATAL;
+                                       goto out;
+                               }
+
                                newsrv->health = newsrv->rise;
                                cur_arg += 2;
                        }
                        else if (!strcmp(args[cur_arg], "fall")) {
                                newsrv->fall = atol(args[cur_arg + 1]);
+
+                               if (!*args[cur_arg + 1]) {
+                                       Alert("parsing [%s:%d]: '%s' expects an 
integer argument.\n",
+                                               file, linenum, args[cur_arg]);
+                                       err_code |= ERR_ALERT | ERR_FATAL;
+                                       goto out;
+                               }
+
+                               if (newsrv->fall <= 0) {
+                                       Alert("parsing [%s:%d]: '%s' has to be 
> 0.\n",
+                                               file, linenum, args[cur_arg]);
+                                       err_code |= ERR_ALERT | ERR_FATAL;
+                                       goto out;
+                               }
+
                                cur_arg += 2;
                        }
                        else if (!strcmp(args[cur_arg], "inter")) {
-- 
1.6.4.2


Reply via email to