]> git.ipfire.org Git - thirdparty/haproxy.git/commit
BUG/MAJOR: fix haproxy crash when using server tracking instead of checks
authorWilly Tarreau <w@1wt.eu>
Wed, 27 Nov 2013 15:52:23 +0000 (16:52 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 27 Nov 2013 16:10:07 +0000 (17:10 +0100)
commitbc16cd81c4a213a9bcd8915a7b1384abea1d7bee
treed08c91391552dea0de99cb3db44f9a484145bb80
parent86a446e685a50d952cdadbd98552c968028ba59f
BUG/MAJOR: fix haproxy crash when using server tracking instead of checks

Igor at owind reported a very recent bug (just present in latest snapshot).
Commit "4a741432 MEDIUM: Paramatise functions over the check of a server"
causes up/down to die with tracked servers due to a typo.

The following call in set_server_down causes the server to put itself
down recurseively because "check" is the current server's check, so once
fed to the function again, it will pass through the exact same path (note
we have the exact symmetry in set_server_up) :

for (srv = s->tracknext; srv; srv = srv->tracknext)
if (!(srv->state & SRV_MAINTAIN))
/* Only notify tracking servers that are not already in maintenance. */
set_server_down(check);

Instead we should stop the tracking server being visited in the loop :

for (srv = s->tracknext; srv; srv = srv->tracknext)
if (!(srv->state & SRV_MAINTAIN))
/* Only notify tracking servers that are not already in maintenance. */
set_server_down(&srv->check);

But that's not exactly enough because srv->check->server is only set when
checks are enabled, so ->server is NULL for tracking servers, still causing a
crash upon first iteration. The fix is easy and consists in always initializing
check->server when creating a new server, which is what was already done a few
patches later by 69d29f9 (MEDIUM: cfgparse: Factor out check initialisation).

With the fix above alone on top of current version or snapshot 20131122, the
problem disappears.

Thanks to Igor for testing and reporting the issue.
src/checks.c