summaryrefslogtreecommitdiff
path: root/src/backend/access
diff options
context:
space:
mode:
authorAndres Freund2015-05-01 09:36:14 +0000
committerAndres Freund2015-05-01 09:36:14 +0000
commit1db12da85bee7a01abfbbf2798904347e4d9515a (patch)
tree936b45c70ff684b02d16d9aac6a500deb6b78dbf /src/backend/access
parent484a848a73fc5a76c16bc73626b290154b6a57b4 (diff)
Fix unaligned memory access in xlog parsing due to replication origin patch.
ParseCommitRecord() accessed xl_xact_origin directly. But the chunks in the commit record's data only have 4 byte alignment, whereas xl_xact_origin's members require 8 byte alignment on some platforms. Update comments to make not of that and copy the record to stack local storage before reading. With help from Stefan Kaltenbrunner in pinning down the buildfarm and verifying the fix.
Diffstat (limited to 'src/backend/access')
-rw-r--r--src/backend/access/rmgrdesc/xactdesc.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c
index 3297e1d3790..cac1df8e07a 100644
--- a/src/backend/access/rmgrdesc/xactdesc.c
+++ b/src/backend/access/rmgrdesc/xactdesc.c
@@ -104,10 +104,13 @@ ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *pars
if (parsed->xinfo & XACT_XINFO_HAS_ORIGIN)
{
- xl_xact_origin *xl_origin = (xl_xact_origin *) data;
+ xl_xact_origin xl_origin;
- parsed->origin_lsn = xl_origin->origin_lsn;
- parsed->origin_timestamp = xl_origin->origin_timestamp;
+ /* we're only guaranteed 4 byte alignment, so copy onto stack */
+ memcpy(&xl_origin, data, sizeof(xl_origin));
+
+ parsed->origin_lsn = xl_origin.origin_lsn;
+ parsed->origin_timestamp = xl_origin.origin_timestamp;
data += sizeof(xl_xact_origin);
}