BUG/MINOR: cfgparse: loop in tracked servers lists not detected by check_config_valid...
authorFrédéric Lécaille <flecaille@haproxy.com>
Tue, 14 Mar 2017 13:32:17 +0000 (14:32 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 27 Mar 2017 10:04:20 +0000 (12:04 +0200)
commit2efc64944726cec78d87210cd5fba67b24d686b6
treed89726f2179dece0a1aad8e6f9f55e14a5973f5a
parentfc725905443dffd08a335b2a71a4f370118797d5
BUG/MINOR: cfgparse: loop in tracked servers lists not detected by check_config_validity().

There is a silly case where a loop is not detected in tracked servers lists:
when a server tracks itself.

Ex:
   server srv1 127.0.0.1:8000 track srv1

Well, this never happens and this does not prevent haproxy from working.

But with this next following configuration:

   server srv1 127.0.0.1:8000 track srv2
   server srv2 127.0.0.1:8000 track srv2
   server srv3 127.0.0.1:8000 track srv2

the code in charge of detecting such loops never returns (without any error message).
haproxy becomes stuck in an infinite loop because of this statement found
in check_config_validity():

for (loop = srv->track; loop && loop != newsrv; loop = loop->track);

Again, such a configuration is never accidentally used I guess.
This latter example seems silly, but as several 'default-server' directives may be used
in the same proxy section, and as 'default-server' settings are not resetted each a
new 'default-server' line is created, it will match the following configuration, in the future,
when 'track' setting will be supported by 'default-server':

   default-server track srv3
   server srv1 127.0.0.1:8000
   server srv2 127.0.0.1:8000
   .
   .
   .
   default-server check
   server srv3 127.0.0.1:8000
(cherry picked from commit 6528fc93d3c065fdac841f24e55cfe9674a67414)
src/cfgparse.c