From ff79fbcf109c9a481ba5c7ecefb9fc78912715a6 Mon Sep 17 00:00:00 2001 From: Pavel Borisov Date: Wed, 7 Apr 2021 15:49:26 +0400 Subject: [PATCH v1] Ensure same treatment of page header and page special size alignment during page init. Both are now just checked for proper alignment with asserts not MAXALIGNing anything silently. Caller should give properly maxalinged values into page init function. In all callers except fill_seq_with_data() it was already done in this manner. I've also corrected the last calls accordingly. Author: Pavel Borisov --- src/backend/commands/sequence.c | 4 ++-- src/backend/storage/page/bufpage.c | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 0415df9ccb..0bf172d7bb 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -354,7 +354,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) page = BufferGetPage(buf); - PageInit(page, BufferGetPageSize(buf), sizeof(sequence_magic)); + PageInit(page, BufferGetPageSize(buf), MAXALIGN(sizeof(sequence_magic))); sm = (sequence_magic *) PageGetSpecialPointer(page); sm->magic = SEQ_MAGIC; @@ -1908,7 +1908,7 @@ seq_redo(XLogReaderState *record) */ localpage = (Page) palloc(BufferGetPageSize(buffer)); - PageInit(localpage, BufferGetPageSize(buffer), sizeof(sequence_magic)); + PageInit(localpage, BufferGetPageSize(buffer), MAXALIGN(sizeof(sequence_magic))); sm = (sequence_magic *) PageGetSpecialPointer(localpage); sm->magic = SEQ_MAGIC; diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 5d5989c2f5..490b5cd48f 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -36,15 +36,17 @@ bool ignore_checksum_failure = false; * PageInit * Initializes the contents of a page. * Note that we don't calculate an initial checksum here; that's not done - * until it's time to write. + * until it's time to write. Caller should care specialSize is + * MAXALIGNed. */ void PageInit(Page page, Size pageSize, Size specialSize) { PageHeader p = (PageHeader) page; - specialSize = MAXALIGN(specialSize); + Assert(specialSize == MAXALIGN(specialSize)); + Assert(SizeOfPageHeaderData == MAXALIGN(SizeOfPageHeaderData)); Assert(pageSize == BLCKSZ); Assert(pageSize > specialSize + SizeOfPageHeaderData); -- 2.28.0