Prevent crash when calling pgstat functions with unregistered stats kind
Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
To: pgsql-hackers@lists.postgresql.org
Cc: Michael Paquier <michael@paquier.xyz>
Date: 2026-07-01T07:19:49Z
Lists: pgsql-hackers
Attachments
Hi hackers, While reviewing [1], I got segfault(s) because I created a custom statistics extension that I forgot to add to shared_preload_libraries. Then using one of its function produced: " Core was generated by `postgres: postgres postgres [local] SELECT '. Program terminated with signal SIGSEGV, Segmentation fault. #0 pgstat_init_entry (kind=kind@entry=24, shhashent=shhashent@entry=0x73f6c341a740) at pgstat_shmem.c:335 335 chunk = dsa_allocate_extended(pgStatLocal.dsa, " Indeed, if a custom statistics extension is loaded via CREATE EXTENSION without being listed in shared_preload_libraries, its _PG_init() skips the call to pgstat_register_kind(). The SQL functions are still created, and calling them invokes pgstat functions with a kind that was never registered. pgstat_get_kind_info() returns NULL in this case. The existing code only checked this via Assert() in some paths, so non-assert builds would dereference NULL and segfault. The attached patch adds runtime checks in all public-facing pgstat functions that accept a PgStat_Kind and dereference the returned kind info: - pgstat_prep_pending_entry() - pgstat_fetch_entry() - pgstat_reset() - pgstat_reset_of_kind() - pgstat_have_entry() - pgstat_snapshot_fixed() - pgstat_init_entry() - pgstat_reset_entry() Each now raises ERROR with ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE when the kind is not known or registered. [1]: https://postgr.es/m/akSi2txzLZWQL31Q%40bdtpg Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
Commits
-
test_custom_stats: Fail if loading module outside shared_preload_libraries
- 7838efe9a2d1 19 (unreleased) landed
- 5045d9ff3b5a master landed