From 3e785b3aad244fb68caafc18eee059ff9f0c5718 Mon Sep 17 00:00:00 2001 From: reshke Date: Tue, 27 Oct 2026 14:37:16 +0500 Subject: [PATCH] Fix misaligned xl_xact_distrib read in ParseCommitRecord UBSan reported a misaligned member access when decoding the distributed-transaction field of commit WAL records during crash-recovery redo. The WAL record payload has no alignment guarantee; the neighboring xl_origin branch already copies onto the stack for exactly this reason. Do the same for xl_xact_distrib. Sanitizer report (UBSan, instrumented build, crash recovery): xactdesc.c:155:34: runtime error: member access within misaligned address 0x7b39d104de44 for type 'struct xl_xact_distrib', which requires 8 byte alignment #0 ParseCommitRecord xactdesc.c:155 #1 xact_redo xactdesc.c:... #2 ApplyWalRecord xlogrecovery.c:2023 #3 PerformWalRecovery xlogrecovery.c:1845 Undefined behavior at recovery time; harmless on x86_64 but incorrect on strictly aligned targets. --- src/backend/access/rmgrdesc/xactdesc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c index 19df1db24dc..ac312add952 100644 --- a/src/backend/access/rmgrdesc/xactdesc.c +++ b/src/backend/access/rmgrdesc/xactdesc.c @@ -150,9 +150,12 @@ ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *pars if (parsed->xinfo & XACT_XINFO_HAS_DISTRIB) { - xl_xact_distrib *xl_distrib = (xl_xact_distrib *) data; + xl_xact_distrib xl_distrib; - parsed->distribXid = xl_distrib->distrib_xid; + /* no alignment is guaranteed, so copy onto stack */ + memcpy(&xl_distrib, data, sizeof(xl_distrib)); + + parsed->distribXid = xl_distrib.distrib_xid; data += sizeof(xl_xact_distrib); } }