From: Andres Freund Date: Tue, 25 Jul 2023 02:07:52 +0000 (-0700) Subject: Fix off-by-one in LimitAdditionalPins() X-Git-Tag: REL_16_BETA3~17 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=bd2f46c6559ddcafe7bae5015ac45b69bc014067;p=postgresql.git 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- --- diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 3c59bbd04ea..bd203c21913 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)