In PCuABI, the permissions of a mapping cannot be expanded by default (using mprotect()). To allow this, PROT_MAX() with the full set of allowed permissions must be passed.
This is a no-op on other ABIs.
Signed-off-by: Kevin Brodsky kevin.brodsky@arm.com --- testcases/kernel/syscalls/memfd_create/memfd_create_common.c | 3 ++- testcases/kernel/syscalls/mprotect/mprotect01.c | 4 +++- testcases/kernel/syscalls/mprotect/mprotect02.c | 3 ++- testcases/kernel/syscalls/mprotect/mprotect04.c | 5 +++-- testcases/kernel/syscalls/mprotect/mprotect05.c | 4 +++- 5 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/testcases/kernel/syscalls/memfd_create/memfd_create_common.c b/testcases/kernel/syscalls/memfd_create/memfd_create_common.c index a52b02a567f5..619ecb157384 100644 --- a/testcases/kernel/syscalls/memfd_create/memfd_create_common.c +++ b/testcases/kernel/syscalls/memfd_create/memfd_create_common.c @@ -346,7 +346,8 @@ void check_mfd_writeable(const char *filename, const int lineno, int fd) * mprotect(PROT_WRITE) allows writing */ p = check_mmap(filename, lineno, NULL, MFD_DEF_SIZE, - PROT_READ, MAP_SHARED, fd, 0); + PROT_READ | PROT_MAX(PROT_READ | PROT_WRITE), + MAP_SHARED, fd, 0);
check_mprotect(filename, lineno, p, MFD_DEF_SIZE, PROT_READ | PROT_WRITE); diff --git a/testcases/kernel/syscalls/mprotect/mprotect01.c b/testcases/kernel/syscalls/mprotect/mprotect01.c index aa46852583ed..354b078b903f 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect01.c +++ b/testcases/kernel/syscalls/mprotect/mprotect01.c @@ -145,7 +145,9 @@ static void setup3(struct test_case *self) /* * mmap the PAGESIZE bytes as read only. */ - self->addr = mmap(0, self->len, PROT_READ, MAP_SHARED, fd, 0); + self->addr = mmap(0, self->len, + PROT_READ | PROT_MAX(PROT_READ | PROT_WRITE), + MAP_SHARED, fd, 0); if (self->addr == MAP_FAILED) tst_brkm(TBROK, cleanup, "mmap failed");
diff --git a/testcases/kernel/syscalls/mprotect/mprotect02.c b/testcases/kernel/syscalls/mprotect/mprotect02.c index af282bba7b03..3643d67fbec0 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect02.c +++ b/testcases/kernel/syscalls/mprotect/mprotect02.c @@ -86,7 +86,8 @@ int main(int ac, char **av) } while (0 < num_bytes);
/* mmap the PAGESIZE bytes as read only. */ - addr = SAFE_MMAP(cleanup, 0, sizeof(buf), PROT_READ, + addr = SAFE_MMAP(cleanup, 0, sizeof(buf), + PROT_READ | PROT_MAX(PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
if ((pid = FORK_OR_VFORK()) == -1) diff --git a/testcases/kernel/syscalls/mprotect/mprotect04.c b/testcases/kernel/syscalls/mprotect/mprotect04.c index db99bc531f8e..e6e7063b0a3b 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect04.c +++ b/testcases/kernel/syscalls/mprotect/mprotect04.c @@ -240,8 +240,9 @@ static void testfunc_protexec(void)
sig_caught = 0;
- p = SAFE_MMAP(cleanup, 0, page_sz, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + p = SAFE_MMAP(cleanup, 0, page_sz, + PROT_READ | PROT_WRITE | PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC), + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
#ifdef USE_FUNCTION_DESCRIPTORS func_descr_t opd; diff --git a/testcases/kernel/syscalls/mprotect/mprotect05.c b/testcases/kernel/syscalls/mprotect/mprotect05.c index 2b15f5bebbaa..5efcf32bf00f 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect05.c +++ b/testcases/kernel/syscalls/mprotect/mprotect05.c @@ -31,7 +31,9 @@ static void setup(void) static void run(void) { fd = SAFE_OPEN(TEST_FILE, O_RDWR | O_CREAT, 0777); - addr = SAFE_MMAP(0, fullsize, PROT_READ, MAP_SHARED, fd, 0); + addr = SAFE_MMAP(0, fullsize, + PROT_READ | PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC), + MAP_SHARED, fd, 0);
if (mprotect(addr + pagesize, pagesize, PROT_EXEC)) tst_res(TFAIL | TERRNO, "mprotect failed to exec");