]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: fd: properly wait for !running_mask in fd_set_running_excl()
authorWilly Tarreau <w@1wt.eu>
Wed, 24 Feb 2021 18:40:49 +0000 (19:40 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 24 Feb 2021 18:40:49 +0000 (19:40 +0100)
In fd_set_running_excl() we don't reset the old mask in the CAS loop,
so if we fail on the first round, we'll forcefully take the FD on the
next one.

In practice it's used bu fd_insert() and fd_delete() only, none of which
is supposed to be passed an FD which is still in use since in practice,
given that for now only listeners may be enabled on multiple threads at
once.

This can be backported to 2.2 but shouldn't result in fixing any user
visible bug for now.

include/haproxy/fd.h

index c741eb39e66c8645db6bf7e4f62d684ff2a05e0c..20e4d754fad1a9701213b50cdc90a293a07f816b 100644 (file)
@@ -343,7 +343,8 @@ static inline int fd_set_running(int fd)
 static inline void fd_set_running_excl(int fd)
 {
        unsigned long old_mask = 0;
-       while (!_HA_ATOMIC_CAS(&fdtab[fd].running_mask, &old_mask, tid_bit));
+       while (!_HA_ATOMIC_CAS(&fdtab[fd].running_mask, &old_mask, tid_bit))
+               old_mask = 0;
 }