Accessing an invalid pointer in BufferManagerRelation structure

From: Daniil Davydov <3danissimo(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Accessing an invalid pointer in BufferManagerRelation structure
Date: 2025-01-27 11:38:47
Message-ID: CAJDiXgj3FNzAhV+jjPqxMs3jz=OgPohsoXFj_fh-L+nS+13CKQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,
Postgres allows us to pass BufferManagerRelation structure to
functions in two ways : BMR_REL and BMR_SMGR.
In case we use BMR_REL, the "smgr" field of structure initialized this way :
***
if (bmr.smgr == NULL)
{
bmr.smgr = RelationGetSmgr(bmr.rel);
bmr.relpersistence = bmr.rel->rd_rel->relpersistence;
}
***
Thus, we set the "smgr" field only once. But in case of frequent cache
invalidation (for example with debug_discard_caches parameter
enabled),
this pointer may become invalid (because RelationCloseSmgr will be called).
I have not found any places in the current code where this could
happen. But if (just for example) we add acquiring of new lock into
ExtendBufferedRelLocal
or ExtendBufferedRelShared, relation cache will be invalidated (inside
AcceptInvalidationMessages).

I would suggest adding a special macro to access the "smgr" field
(check attached patch for REL_17_STABLE).
What do you think about this?

--
Best regards,
Daniil Davydov

Attachment Content-Type Size
0001-Add-marcos-for-safety-access-to-smgr-field-of-Buffer.patch text/x-patch 9.1 KB

Browse pgsql-hackers by date

  From Date Subject
Next Message Tatsuo Ishii 2025-01-27 11:51:15 Re: Add RESPECT/IGNORE NULLS and FROM FIRST/LAST options
Previous Message Peter Eisentraut 2025-01-27 11:10:17 Re: meson "experimental"?