dodge-gcc-bug-2.patch
text/x-patch
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 0 | 0 |
| src/include/access/xlog_internal.h | 0 | 0 |
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 5c3ca479fb33fff646e3a7b08b53efea92b9a97f..aa0b0291ee1c7781a36c62e3d89abbc98d3b8499 100644
*** a/src/backend/access/transam/xlog.c
--- b/src/backend/access/transam/xlog.c
*************** ReadRecord(XLogRecPtr *RecPtr, int emode
*** 3728,3750 ****
RecPtr = &tmpRecPtr;
/*
! * Align recptr to next page if no more records can fit on the current
! * page.
*/
if (XLOG_BLCKSZ - (RecPtr->xrecoff % XLOG_BLCKSZ) < SizeOfXLogRecord)
! {
! NextLogPage(tmpRecPtr);
! /* We will account for page header size below */
! }
! if (tmpRecPtr.xrecoff >= XLogFileSize)
{
! (tmpRecPtr.xlogid)++;
! tmpRecPtr.xrecoff = 0;
}
}
else
{
if (!XRecOffIsValid(RecPtr->xrecoff))
ereport(PANIC,
(errmsg("invalid record offset at %X/%X",
--- 3728,3759 ----
RecPtr = &tmpRecPtr;
/*
! * RecPtr is pointing to end+1 of the previous WAL record. We must
! * advance it if necessary to where the next record starts. First,
! * align to next page if no more records can fit on the current page.
*/
if (XLOG_BLCKSZ - (RecPtr->xrecoff % XLOG_BLCKSZ) < SizeOfXLogRecord)
! NextLogPage(*RecPtr);
! /* Check for crossing of xlog segment boundary */
! if (RecPtr->xrecoff >= XLogFileSize)
{
! (RecPtr->xlogid)++;
! RecPtr->xrecoff = 0;
}
+
+ /*
+ * If at page start, we must skip over the page header. But we can't
+ * do that until we've read in the page, since the header size is
+ * variable.
+ */
}
else
{
+ /*
+ * In this case, the passed-in record pointer should already be
+ * pointing to a valid record starting position.
+ */
if (!XRecOffIsValid(RecPtr->xrecoff))
ereport(PANIC,
(errmsg("invalid record offset at %X/%X",
*************** retry:
*** 3773,3783 ****
if (targetRecOff == 0)
{
/*
! * Can only get here in the continuing-from-prev-page case, because
! * XRecOffIsValid eliminated the zero-page-offset case otherwise. Need
! * to skip over the new page's header.
*/
! tmpRecPtr.xrecoff += pageHeaderSize;
targetRecOff = pageHeaderSize;
}
else if (targetRecOff < pageHeaderSize)
--- 3782,3794 ----
if (targetRecOff == 0)
{
/*
! * At page start, so skip over page header. The Assert checks that
! * we're not scribbling on caller's record pointer; it's OK because we
! * can only get here in the continuing-from-prev-record case, since
! * XRecOffIsValid rejected the zero-page-offset case otherwise.
*/
! Assert(RecPtr == &tmpRecPtr);
! RecPtr->xrecoff += pageHeaderSize;
targetRecOff = pageHeaderSize;
}
else if (targetRecOff < pageHeaderSize)
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index eeccdce31d076322cc5431117c6705b839b1b162..7e39630c1bf5d7cbf1a721b641a9481069e92816 100644
*** a/src/include/access/xlog_internal.h
--- b/src/include/access/xlog_internal.h
*************** typedef XLogLongPageHeaderData *XLogLong
*** 154,166 ****
/* Align a record pointer to next page */
#define NextLogPage(recptr) \
do { \
! if (recptr.xrecoff % XLOG_BLCKSZ != 0) \
! recptr.xrecoff += \
! (XLOG_BLCKSZ - recptr.xrecoff % XLOG_BLCKSZ); \
! if (recptr.xrecoff >= XLogFileSize) \
{ \
! (recptr.xlogid)++; \
! recptr.xrecoff = 0; \
} \
} while (0)
--- 154,166 ----
/* Align a record pointer to next page */
#define NextLogPage(recptr) \
do { \
! if ((recptr).xrecoff % XLOG_BLCKSZ != 0) \
! (recptr).xrecoff += \
! (XLOG_BLCKSZ - (recptr).xrecoff % XLOG_BLCKSZ); \
! if ((recptr).xrecoff >= XLogFileSize) \
{ \
! ((recptr).xlogid)++; \
! (recptr).xrecoff = 0; \
} \
} while (0)