When we fail to allocate a new tree element, we're still holding the
write lock, so we should do an write unlock, not a read unlock, or the
lock will get corrupted and most likely this will end in a deadlock.
This should be backported up to 3.2.
tree_elt = fwlc_alloc_tree_elt(s->proxy, allocated_elt);
if (tree_elt == NULL) {
/* We failed to allocate memory, just try again later */
- HA_RWLOCK_RDUNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
+ HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
_HA_ATOMIC_STORE(&s->lb_lock, 0);
if (s->requeue_tasklet)
tasklet_wakeup(s->requeue_tasklet);