commit 3f0b1de623d09f8668db34c1be696f7245de7d50 Author: Christopher Faulet Date: Wed Jun 19 10:50:38 2019 +0200 BUG/MEDIUM: lb_fwlc: Don't test the server's lb_tree from outside the lock In the function fwlc_srv_reposition(), the server's lb_tree is tested from outside the lock. So it is possible to remove it after the test and then call eb32_insert() in fwlc_queue_srv() with a NULL root pointer, which is invalid. Moving the test in the scope of the lock fixes the bug. This issue was reported on Github, issue #126. This patch must be backported to 2.0, 1.9 and 1.8. (cherry picked from commit 1ae2a8878170ded922f2c4d32b6704af7689bbfd) Signed-off-by: Christopher Faulet diff --git a/src/lb_fwlc.c b/src/lb_fwlc.c index 174dc67e..5fa81739 100644 --- a/src/lb_fwlc.c +++ b/src/lb_fwlc.c @@ -66,12 +66,11 @@ static inline void fwlc_queue_srv(struct server *s) */ static void fwlc_srv_reposition(struct server *s) { - if (!s->lb_tree) - return; - HA_SPIN_LOCK(LBPRM_LOCK, &s->proxy->lbprm.lock); - fwlc_dequeue_srv(s); - fwlc_queue_srv(s); + if (s->lb_tree) { + fwlc_dequeue_srv(s); + fwlc_queue_srv(s); + } HA_SPIN_UNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock); }