From: Willy Tarreau Date: Wed, 9 Feb 2022 15:23:55 +0000 (+0100) Subject: DEBUG: pools: add extra sanity checks when picking objects from a local cache X-Git-Tag: v2.6-dev2~158 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2830addda9baf42c682d7c1856a53e2875deea4;p=thirdparty%2Fhaproxy.git DEBUG: pools: add extra sanity checks when picking objects from a local cache These few checks are added to make sure we never try to pick an object from an empty list, which would have a devastating effect. --- diff --git a/include/haproxy/pool.h b/include/haproxy/pool.h index de41fa1fe9..9b80842051 100644 --- a/include/haproxy/pool.h +++ b/include/haproxy/pool.h @@ -289,6 +289,7 @@ static inline void *pool_get_from_cache(struct pool_head *pool, const void *call /* allocate hottest objects first */ item = LIST_NEXT(&ph->list, typeof(item), by_pool); #endif + BUG_ON(&item->by_pool == &ph->list); LIST_DELETE(&item->by_pool); LIST_DELETE(&item->by_lru); diff --git a/src/pool.c b/src/pool.c index 0bb79d0253..554d1cbb8a 100644 --- a/src/pool.c +++ b/src/pool.c @@ -329,6 +329,7 @@ static void pool_evict_last_items(struct pool_head *pool, struct pool_cache_head while (released < count && !LIST_ISEMPTY(&ph->list)) { item = LIST_PREV(&ph->list, typeof(item), by_pool); + BUG_ON(&item->by_pool == &ph->list); pool_check_pattern(ph, item, pool->size); LIST_DELETE(&item->by_pool); LIST_DELETE(&item->by_lru); @@ -389,6 +390,7 @@ void pool_evict_from_local_caches() do { item = LIST_PREV(&th_ctx->pool_lru_head, struct pool_cache_item *, by_lru); + BUG_ON(&item->by_lru == &th_ctx->pool_lru_head); /* note: by definition we remove oldest objects so they also are the * oldest in their own pools, thus their next is the pool's head. */