diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 52c6986..4520708 100644
*** a/src/backend/replication/logical/reorderbuffer.c
--- b/src/backend/replication/logical/reorderbuffer.c
*************** ReorderBufferRestoreChanges(ReorderBuffe
*** 2444,2449 ****
--- 2444,2453 ----
  /*
   * Convert change from its on-disk format to in-memory format and queue it onto
   * the TXN's ->changes list.
+  *
+  * Note: although "data" is declared char*, at entry it points to a
+  * maxalign'd buffer, making it safe in most of this function to assume
+  * that the pointed-to data is suitably aligned for direct access.
   */
  static void
  ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
*************** ReorderBufferRestoreChange(ReorderBuffer
*** 2471,2477 ****
  		case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
  			if (change->data.tp.oldtuple)
  			{
! 				Size		tuplelen = ((HeapTuple) data)->t_len;
  
  				change->data.tp.oldtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
--- 2475,2481 ----
  		case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
  			if (change->data.tp.oldtuple)
  			{
! 				uint32		tuplelen = ((HeapTuple) data)->t_len;
  
  				change->data.tp.oldtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
*************** ReorderBufferRestoreChange(ReorderBuffer
*** 2492,2498 ****
  
  			if (change->data.tp.newtuple)
  			{
! 				Size		tuplelen = ((HeapTuple) data)->t_len;
  
  				change->data.tp.newtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
--- 2496,2506 ----
  
  			if (change->data.tp.newtuple)
  			{
! 				/* here, data might not be suitably aligned! */
! 				uint32		tuplelen;
! 
! 				memcpy(&tuplelen, data + offsetof(HeapTupleData, t_len),
! 					   sizeof(uint32));
  
  				change->data.tp.newtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
