]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MAJOR: memory: Don't forget to unlock the rwlock if the pool is empty.
authorOlivier Houchard <ohouchard@haproxy.com>
Mon, 3 Feb 2020 12:03:30 +0000 (13:03 +0100)
committerOlivier Houchard <cognet@ci0.org>
Mon, 3 Feb 2020 12:05:31 +0000 (13:05 +0100)
In __pool_get_first(), don't forget to unlock the pool lock if the pool is
empty, otherwise no writer will be able to take the lock, and as it is done
when reloading, it leads to an infinite loop on reload.

This should be backported with commit 04f5fe87d3d3a222b89420f8c1231461f55ebdeb

include/common/memory.h

index cafe03aca46296b4e15f93d92e81d492b1f648a7..507198966b2f0b293ace077c7061f9259aab9384 100644 (file)
@@ -225,8 +225,10 @@ static inline void *__pool_get_first(struct pool_head *pool)
        HA_RWLOCK_RDLOCK(POOL_LOCK, &pool->flush_lock);
        cmp.free_list = pool->free_list;
        do {
-               if (cmp.free_list == NULL)
+               if (cmp.free_list == NULL) {
+                       HA_RWLOCK_RDUNLOCK(POOL_LOCK, &pool->flush_lock);
                        return NULL;
+               }
                new.seq = cmp.seq + 1;
                __ha_barrier_load();
                new.free_list = *POOL_LINK(pool, cmp.free_list);