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
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))
{