From 9d5e5c61d4c954a71acca07ec37066b8ca5b4822 Mon Sep 17 00:00:00 2001 From: Asim R P Date: Wed, 18 Jul 2018 18:30:41 -0700 Subject: [PATCH 2/2] Fix known but not problematic buffer access violations This is needed to make regression tests pass with CFLAGS=-DMPROTECT_BUFFERS. --- src/backend/commands/sequence.c | 3 ++- src/backend/storage/freespace/freespace.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 89122d4ad7..f44fb8c563 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -348,13 +348,14 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) page = BufferGetPage(buf); + LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); + PageInit(page, BufferGetPageSize(buf), sizeof(sequence_magic)); sm = (sequence_magic *) PageGetSpecialPointer(page); sm->magic = SEQ_MAGIC; /* Now insert sequence tuple */ - LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); /* * Since VACUUM does not process sequences, we have to force the tuple to diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 8d0ee7fc93..df813d7416 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -901,8 +901,17 @@ fsm_vacuum_page(Relation rel, FSMAddress addr, * relation. We don't bother with a lock here, nor with marking the page * dirty if it wasn't already, since this is just a hint. */ +#ifdef MPROTECT_BUFFERS + /* + * When mprotect() is used to detect shared buffer access violations, lock + * must be acquired so that write access is allowed on this buffer. + */ + LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); +#endif ((FSMPage) PageGetContents(page))->fp_next_slot = 0; - +#ifdef MPROTECT_BUFFERS + LockBuffer(buf, BUFFER_LOCK_UNLOCK); +#endif ReleaseBuffer(buf); return max_avail; -- 2.17.1