diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c new file mode 100644 index 3a86f34..764a579 *** a/src/backend/access/transam/xlogreader.c --- b/src/backend/access/transam/xlogreader.c *************** XLogReadRecord(XLogReaderState *state, X *** 345,351 **** goto err; } ! len = XLOG_BLCKSZ - RecPtr % XLOG_BLCKSZ; if (total_len > len) { /* Need to reassemble record */ --- 345,365 ---- goto err; } ! /* Bytes of the current record residing on the current page. */ ! len = Min(XLOG_BLCKSZ - targetRecOff, total_len); ! ! /* ! * Nothing beyond the record header is guaranteed to be in state->readBuf ! * so far. ! */ ! if (readOff < targetRecOff + len) ! { ! readOff = ReadPageInternal(state, targetPagePtr, targetRecOff + len); ! ! if (readOff < 0) ! goto err; ! } ! if (total_len > len) { /* Need to reassemble record */ *************** XLogReadRecord(XLogReaderState *state, X *** 354,362 **** char *buffer; uint32 gotlen; /* Copy the first fragment of the record from the first page. */ ! memcpy(state->readRecordBuf, ! state->readBuf + RecPtr % XLOG_BLCKSZ, len); buffer = state->readRecordBuf + len; gotlen = len; --- 368,378 ---- char *buffer; uint32 gotlen; + Assert(readOff == targetRecOff + len); + Assert(readOff == XLOG_BLCKSZ); + /* Copy the first fragment of the record from the first page. */ ! memcpy(state->readRecordBuf, state->readBuf + targetRecOff, len); buffer = state->readRecordBuf + len; gotlen = len; *************** XLogReadRecord(XLogReaderState *state, X *** 445,464 **** } else { ! /* Wait for the record data to become available */ ! readOff = ReadPageInternal(state, targetPagePtr, ! Min(targetRecOff + total_len, XLOG_BLCKSZ)); ! if (readOff < 0) ! goto err; /* Record does not cross a page boundary */ if (!ValidXLogRecord(state, record, RecPtr)) goto err; ! state->EndRecPtr = RecPtr + MAXALIGN(total_len); state->ReadRecPtr = RecPtr; ! memcpy(state->readRecordBuf, record, total_len); } /* --- 461,480 ---- } else { ! /* ! * The whole record is on the current page and should have been ! * fetched into readBuf. ! */ ! Assert(readOff >= targetRecOff + len); /* Record does not cross a page boundary */ if (!ValidXLogRecord(state, record, RecPtr)) goto err; ! state->EndRecPtr = RecPtr + MAXALIGN(len); state->ReadRecPtr = RecPtr; ! memcpy(state->readRecordBuf, record, len); } /*