From: Emeric Brun Date: Fri, 1 Dec 2017 10:37:36 +0000 (+0100) Subject: BUG/MAJOR: thread/peers: fix deadlock on peers sync. X-Git-Tag: v1.9-dev1~637 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=088c9b73cab9a1958dceaa1ce6f8a76541f8d344;p=thirdparty%2Fhaproxy.git BUG/MAJOR: thread/peers: fix deadlock on peers sync. Table lock was not released on an error path (if there is no enough room to write table switch message). [wt: needs to be backported to 1.8] --- diff --git a/src/peers.c b/src/peers.c index 7580742f7d..155f3342a3 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1474,6 +1474,7 @@ incomplete: msglen = peer_prepare_switchmsg(st, trash.str, trash.size); if (!msglen) { + HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); /* internal error: message does not fit in trash */ appctx->st0 = PEER_SESS_ST_END; goto switchstate; @@ -1482,6 +1483,7 @@ incomplete: /* message to buffer */ repl = ci_putblk(si_ic(si), trash.str, msglen); if (repl <= 0) { + HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); /* no more write possible */ if (repl == -1) { goto full;