0002-Fix-known-but-not-problematic-buffer-access-violatio.patch
text/x-patch
Filename: 0002-Fix-known-but-not-problematic-buffer-access-violatio.patch
Type: text/x-patch
Part: 1
Patch
Format: format-patch
Series: patch 0002
Subject: Fix known but not problematic buffer access violations
| File | + | − |
|---|---|---|
| src/backend/commands/sequence.c | 2 | 1 |
| src/backend/storage/freespace/freespace.c | 10 | 1 |
From 9d5e5c61d4c954a71acca07ec37066b8ca5b4822 Mon Sep 17 00:00:00 2001 From: Asim R P <apraveen@pivotal.io> 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