]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Do not reuse rd_smgr in fork loop when enabling data checksums
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 4 Aug 2026 10:16:55 +0000 (12:16 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 4 Aug 2026 10:16:55 +0000 (12:16 +0200)
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 <mihailnikalayeu@gmail.com>
Reviewed-by: ChangAo Chen <cca5507@qq.com>
Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
Discussion: https://postgr.es/m/CADzfLwXGvb4Y-mqy8T+O0f_tkXR1sTDBGzP5Z=V_qcGnZ46rWg@mail.gmail.com
Backpatch-through: 19

src/backend/postmaster/datachecksum_state.c

index 569399fb2b1b3781facf686065fcc35b033d0e1e..be308a282d57ad39ac9317b122a5534eaf4eb6dc 100644 (file)
@@ -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))
                        {