From: Daniel Gustafsson Date: Tue, 4 Aug 2026 10:16:55 +0000 (+0200) Subject: Do not reuse rd_smgr in fork loop when enabling data checksums X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ab918a4fab0a6a8855b230d140bbf89fb090ad3e;p=thirdparty%2Fpostgresql.git Do not reuse rd_smgr in fork loop when enabling data checksums ProcessSingleRelationByOid called RelationGetSmgr(rel), discarded the result, and then read rel->rd_smgr directly when looping over forks. Only RelationGetSmgr is authorized to read that field since a relcache invalidation resets rd_smgr to NULL. Backpatch to v19 where online checksums were introduced. Author: Mihail Nikalayeu Reviewed-by: ChangAo Chen Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/CADzfLwXGvb4Y-mqy8T+O0f_tkXR1sTDBGzP5Z=V_qcGnZ46rWg@mail.gmail.com Backpatch-through: 19 --- diff --git a/src/backend/postmaster/datachecksum_state.c b/src/backend/postmaster/datachecksum_state.c index 569399fb2b1..be308a282d5 100644 --- a/src/backend/postmaster/datachecksum_state.c +++ b/src/backend/postmaster/datachecksum_state.c @@ -841,11 +841,10 @@ ProcessSingleRelationByOid(Oid relationId, BufferAccessStrategy strategy) pgstat_report_activity(STATE_IDLE, NULL); return true; } - RelationGetSmgr(rel); for (ForkNumber fnum = 0; fnum <= MAX_FORKNUM; fnum++) { - if (smgrexists(rel->rd_smgr, fnum)) + if (smgrexists(RelationGetSmgr(rel), fnum)) { if (!ProcessSingleRelationFork(rel, fnum, strategy)) {