]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: threads/server: Fix deadlock in srv_set_stopping/srv_set_admin_flag
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 24 Jan 2018 20:49:41 +0000 (21:49 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 25 Jan 2018 12:51:23 +0000 (13:51 +0100)
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

index 3901e7d8b6c466822055e1e6c018e4bf597a6691..07a6603a35096f4f88f484ae3557430e5e88169c 100644 (file)
@@ -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);
        }
 }