From ba4134075a822e119e2ca6c2718ff08ae9464a37 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 3 Jul 2026 12:07:30 +0900 Subject: [PATCH] Switch Get[Local]BufferDescriptor() to use a signed value in input GetBufferDescriptor() and GetLocalBufferDescriptor() took a uint32 buffer index, but every real caller derives the index from a Buffer: - Unsigned value for shared buffers. - Signed value for local buffers. Both routines now take in input a signed number, GetBufferDescriptor() gaining an assertion checking that the input value is in the range allowed by the GUC shared_buffers. This work is a follow-up of e18b0cb7344c, where we found that passing down a value for a local buffer was undetected and finished outside the range of NBuffers. While monitoring all the existing callers of *BufferDescriptor(), the only consumer that passes does an unsigned value is ClockSweepTick(), whose result is always a module of NBuffers. Suggested-by: Andres Freund Author: Ayush Tiwari Reviewed-by: Ashutosh Bapat Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/CAExHW5uzRMYVZsXXS3HXXT0fG_sNrpUhUqwP4NorhaCqH9JDhA@mail.gmail.com --- src/include/storage/buf_internals.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index 89615a254a3..2a1ffcc6c5c 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -419,13 +419,15 @@ extern PGDLLIMPORT BufferDesc *LocalBufferDescriptors; static inline BufferDesc * -GetBufferDescriptor(uint32 id) +GetBufferDescriptor(int id) { + Assert(id >= 0 && id < NBuffers); + return &(BufferDescriptors[id]).bufferdesc; } static inline BufferDesc * -GetLocalBufferDescriptor(uint32 id) +GetLocalBufferDescriptor(int id) { return &LocalBufferDescriptors[id]; }