Fix use-after-free in pgstat_fetch_stat_backend_by_pid()
authorMichael Paquier <michael@paquier.xyz>
Mon, 7 Apr 2025 00:51:40 +0000 (09:51 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 7 Apr 2025 00:51:40 +0000 (09:51 +0900)
commit3191a593d6dea56def460d06adc779f2aca44976
treebe8c7ea02583a3acd214fd8ecf0c573025d848c2
parent173c97812ffcc48082355df71470974c33379d3f
Fix use-after-free in pgstat_fetch_stat_backend_by_pid()

stats_fetch_consistency set to "snapshot" causes the backend entry
"beentry" retrieved by pgstat_get_beentry_by_proc_number() to be reset
at the beginning of pgstat_fetch_stat_backend() when fetching the
backend pgstats entry.  As coded, "beentry" was being accessed after
being freed.  This commit moves all the accesses to "beentry" to happen
before calling pgstat_fetch_stat_backend(), fixing the problem.

This problem could be reached by calling the SQL functions
pg_stat_get_backend_io() or pg_stat_get_backend_wal().

Issue caught by valgrind.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Author: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Discussion: https://postgr.es/m/f1788cc0-253a-4a3a-aee0-1b8ab9538736@gmail.com
src/backend/utils/activity/pgstat_backend.c