BUG/MEDIUM: listener: Acquire proxy's lock in relax_listener() if necessary

Listener functions must follow a common locking pattern:

  1. Get the proxy's lock if necessary
  2. Get the protocol's lock if necessary
  3. Get the listener's lock if necessary

We must take care to respect this order to avoid any ABBA issue. However, an
issue was introduced in the commit bcad7e631 ("MINOR: listener: add
relax_listener() function"). relax_listener() gets the lisener's lock and if
resume_listener() is called, the proxy's lock is then acquired.

So to fix the issue, the proxy's lock is first acquired in relax_listener(),
if necessary.

This patch should fix the issue #2222. It must be backported as far as 2.4
because the above commit is marked to be backported there.

(cherry picked from commit ff1c803279cfc8bdee8f2e13798cd3e4d99762c0)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 6844af6f6b7136c7f426b78bebf55096a25ce4b1)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 68597906adcfacb11e73993118aeb07a7e1c609a)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit fbc1119934661ec8e69910022c8d836c7ed9c451)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
1 file changed