From: Andres Freund Date: Tue, 25 Jul 2023 02:07:52 +0000 (-0700) Subject: Fix off-by-one in LimitAdditionalPins() X-Git-Tag: REL_17_BETA1~2091 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f3bc5192889f6f02aa10ca9f24df4eab1f1493c1;p=thirdparty%2Fpostgresql.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 a7e3b9bb1d3..df22aaa1c52 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)