From 8d01fd6b3caf7fd97a21aa24bb946b12484ce1a3 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 24 Jan 2018 21:49:41 +0100 Subject: [PATCH] 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. --- src/server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); } } -- 2.47.3