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 <[email protected]>
Author: Bertrand Drouvot <
[email protected]>
Discussion: https://postgr.es/m/
f1788cc0-253a-4a3a-aee0-
1b8ab9538736@gmail.com
if (!pgstat_tracks_backend_bktype(beentry->st_backendType))
return NULL;
- backend_stats = pgstat_fetch_stat_backend(procNumber);
- if (!backend_stats)
- return NULL;
-
/* if PID does not match, leave */
if (beentry->st_procpid != pid)
return NULL;
if (bktype)
*bktype = beentry->st_backendType;
+ /*
+ * Retrieve the entry. Note that "beentry" may be freed depending on the
+ * value of stats_fetch_consistency, so do not access it from this point.
+ */
+ backend_stats = pgstat_fetch_stat_backend(procNumber);
+ if (!backend_stats)
+ {
+ if (bktype)
+ *bktype = B_INVALID;
+ return NULL;
+ }
+
return backend_stats;
}