BUG/MEDIUM: lb_fas: Don't test the server's lb_tree from outside the lock

In the function fas_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 fas_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.
This commit is contained in:
Christopher Faulet 2019-07-04 11:59:42 +02:00
parent 8f1aa77b42
commit 16b2be93ad

View File

@ -70,12 +70,11 @@ static inline void fas_queue_srv(struct server *s)
*/ */
static void fas_srv_reposition(struct server *s) static void fas_srv_reposition(struct server *s)
{ {
if (!s->lb_tree)
return;
HA_SPIN_LOCK(LBPRM_LOCK, &s->proxy->lbprm.lock); HA_SPIN_LOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
fas_dequeue_srv(s); if (s->lb_tree) {
fas_queue_srv(s); fas_dequeue_srv(s);
fas_queue_srv(s);
}
HA_SPIN_UNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock); HA_SPIN_UNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
} }