1
0
mirror of https://github.com/postgres/postgres.git synced 2026-10-23 13:29:09 +03:00

Fix local pgstat entry leak on OOM during entry creation

When pgstat_init_entry() fails due to an OOM in the DSA allocation,
pgstat_get_entry_ref() cleaned up the shared hashtable but forgot to
remove the local reference that pgstat_get_entry_ref_cached() had
already inserted into pgStatEntryRefHash.

Missing this cleanup would leave a backend with a stale local cache
entry whose entry_ref points to a NULL shared_stats.  If
pgstat_gc_entry_refs() runs with this reference still around, it would
crash due to a pointer dereference.

The local reference is now removed before removing the shared entry,
the order being sensitive to pending interrupts.

Oversight in 8191e0c16a.

Author: Niall Newman <nn@turacolabs.com>
Discussion: https://postgr.es/m/2FDAA194-9CF3-4FD7-A450-F1A4BEB125F6@turacolabs.com
Backpatch-through: 15
This commit is contained in:
Michael Paquier
2026-08-07 14:23:36 +09:00
parent 3df129b8d7
commit fc9283b215

View File

@@ -498,9 +498,12 @@ pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create,
if (shheader == NULL)
{
/*
* Failed the allocation of a new entry, so clean up the
* shared hashtable before giving up.
* Failed the allocation of a new entry, so clean up both the
* local reference and the shared hashtable before giving up.
* Clean the local state first, since releasing the dshash
* lock can process a pending interrupt.
*/
pgstat_release_entry_ref(key, entry_ref, false);
dshash_delete_entry(pgStatLocal.shared_hash, shhashent);
ereport(ERROR,