From: Christopher Faulet Date: Wed, 24 Jan 2018 20:49:41 +0000 (+0100) Subject: BUG/MEDIUM: threads/server: Fix deadlock in srv_set_stopping/srv_set_admin_flag X-Git-Tag: v1.9-dev1~497 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8d01fd6b3caf7fd97a21aa24bb946b12484ce1a3;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: threads/server: Fix deadlock in srv_set_stopping/srv_set_admin_flag Because of a typo (HA_SPIN_LOCK instead of HA_SPIN_UNLOCK), there is a deadlock in srv_set_stopping and srv_set_admin_flag when there is at least one trackers. This patch must be backported in 1.8. --- diff --git a/src/server.c b/src/server.c index 3901e7d8b6..07a6603a35 100644 --- a/src/server.c +++ b/src/server.c @@ -976,7 +976,7 @@ void srv_set_stopping(struct server *s, const char *reason, struct check *check) for (srv = s->trackers; srv; srv = srv->tracknext) { HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); srv_set_stopping(srv, NULL, NULL); - HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); + HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock); } } @@ -1019,7 +1019,7 @@ void srv_set_admin_flag(struct server *s, enum srv_admin mode, const char *cause for (srv = s->trackers; srv; srv = srv->tracknext) { HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); srv_set_admin_flag(srv, mode, cause); - HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); + HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock); } }