Re: Unsafe access BufferDescriptors array in BufferGetLSNAtomic() - Mailing list pgsql-hackers

From Tender Wang
Subject Re: Unsafe access BufferDescriptors array in BufferGetLSNAtomic()
Date
Msg-id CAHewXNmZQOvHqMgpSYtTmiQ99nBMfx+56VO=-Hc=G3J=e4tEcg@mail.gmail.com
Whole thread Raw
In response to Re: Unsafe access BufferDescriptors array in BufferGetLSNAtomic()  (Xuneng Zhou <xunengzhou@gmail.com>)
List pgsql-hackers


Xuneng Zhou <xunengzhou@gmail.com> 于2025年1月8日周三 13:35写道:
Hi Tender,

I’ve looked through the patch, and I believe there is a potential issue. The default size for BufferDescriptors appears to be 16,384. Passing and casting a negative buffer ID to a large unsigned integer in GetBufferDescriptor, and then using it as an array subscript, could potentially lead to an overflow.

void
BufferManagerShmemInit(void)
{
        bool            foundBufs,
                                foundDescs,
                                foundIOCV,
                                foundBufCkpt;

        /* Align descriptors to a cacheline boundary. */
        BufferDescriptors = (BufferDescPadded *)
                ShmemInitStruct("Buffer Descriptors",
                                                NBuffers * sizeof(BufferDescPadded),
                                                &foundDescs);

int                     NBuffers = 16384;

The changes proposed in the patch seem reasonable to me, but it might be helpful to include an explanation of the error case and how it’s handled.

Thanks for reviewing. 
The  BufferGetLSNAtomic() with this patch looks not complex. I think no need more explanation here.


Best regards,
[Xuneng]

The new status of this patch is: Waiting on Author

I change the status to Ready for commiter
--
Thanks,
Tender Wang

pgsql-hackers by date:

Previous
From: Antonin Houska
Date:
Subject: Re: why there is not VACUUM FULL CONCURRENTLY?
Next
From: Tom Lane
Date:
Subject: Re: SQLFunctionCache and generic plans