Re: 回复: Fix segfault while accessing half-initialized hash table in pgstat_shmem.c
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Steven Niu <niushiji@gmail.com>
Cc: Mikhail Kot <mikhail.kot@databricks.com>, "pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>, "to@myrrc.dev" <to@myrrc.dev>
Date: 2025-09-03T09:43:20Z
Lists: pgsql-hackers
On Wed, Sep 03, 2025 at 07:22:00AM +0000, Steven Niu wrote: > So unless dsa_allocate() can ensure never returns InvalidDsaPointer, > there is risk of SegV. In fact the function dsa_allocate() does > return InvalidDsaPointer in some cases. > > So, maybe should we add pointer check in all places where dsa_get_address is called. Comments? dsa_allocate() calls dsa_allocate_extended() without DSA_ALLOC_NO_OOM, hence on allocation failure the code does a ereport(ERROR). It would be a problem to not check the result if DSA_ALLOC_NO_OOM is used. The problem dealt with here is different, as far as I understand: we set some data in shared memory without considering that the DSA allocation could fail, leaving shared memory in an inconsistent state when an allocation failure occurs. The problem is not in the allocation failure in itself, but in the dependency that we have between the state in shared memory and the allocation attempt for this pgstats code path. -- Michael
Commits
-
Fix corruption of pgstats shared hashtable due to OOM failures
- 1852ec5db5d8 15.15 landed
- 12f57681c79b 16.11 landed
- 3e6dfcfb0529 17.7 landed
- f256a7bba728 18.0 landed
- 8191e0c16a03 19 (unreleased) landed