From f3bc5192889f6f02aa10ca9f24df4eab1f1493c1 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 24 Jul 2023 19:07:52 -0700 Subject: [PATCH] Fix off-by-one in LimitAdditionalPins() Due to the bug LimitAdditionalPins() could return 0, violating LimitAdditionalPins()'s API ("One additional pin is always allowed"). This could be hit when setting shared_buffers very low and using a fair amount of concurrency. This bug was introduced in 31966b151e6a. Author: "Anton A. Melnikov" Reported-by: "Anton A. Melnikov" Reported-by: Victoria Shepard Discussion: https://postgr.es/m/ae46f2fb-5586-3de0-b54b-1bb0f6410ebd@inbox.ru Backpatch: 16- --- src/backend/storage/buffer/bufmgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index a7e3b9bb1d..df22aaa1c5 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1767,7 +1767,7 @@ LimitAdditionalPins(uint32 *additional_pins) */ max_proportional_pins -= PrivateRefCountOverflowed + REFCOUNT_ARRAY_ENTRIES; - if (max_proportional_pins < 0) + if (max_proportional_pins <= 0) max_proportional_pins = 1; if (*additional_pins > max_proportional_pins) -- 2.39.5