]> granicus.if.org Git - postgresql/commit
Fix core dump in ReorderBufferRestoreChange on alignment-picky platforms.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 14 Apr 2016 23:42:21 +0000 (19:42 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 14 Apr 2016 23:42:21 +0000 (19:42 -0400)
commit6a3d3965d6d5eec30e1c36b3ffa3355ee9201933
treeb0fdbc84c19974634c338edf2b240126e61c3ec2
parentc2dc194bdbf5f84ceb433ed416eb389c1234ebc9
Fix core dump in ReorderBufferRestoreChange on alignment-picky platforms.

When re-reading an update involving both an old tuple and a new tuple from
disk, reorderbuffer.c was careless about whether the new tuple is suitably
aligned for direct access --- in general, it isn't.  We'd missed seeing
this in the buildfarm because the contrib/test_decoding tests exercise this
code path only a few times, and by chance all of those cases have old
tuples with length a multiple of 4, which is usually enough to make the
access to the new tuple's t_len safe.  For some still-not-entirely-clear
reason, however, Debian's sparc build gets a bus error, as reported by
Christoph Berg; perhaps it's assuming 8-byte alignment of the pointer?

The lack of previous field reports is probably because you need all of
these conditions to trigger a crash: an alignment-picky platform (not
Intel), a transaction large enough to spill to disk, an update within
that xact that changes a primary-key field and has an odd-length old tuple,
and of course logical decoding tracing the transaction.

Avoid the alignment assumption by using memcpy instead of fetching t_len
directly, and add a test case that exposes the crash on picky platforms.
Back-patch to 9.4 where the bug was introduced.

Discussion: <20160413094117.GC21485@msg.credativ.de>
contrib/test_decoding/expected/ddl.out
contrib/test_decoding/sql/ddl.sql
src/backend/replication/logical/reorderbuffer.c