From 748af6eb5dfa1396074b92561317f5dede19bcd9 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 23 Feb 2023 17:24:01 +0100 Subject: [PATCH] unix: pass PROT_MPROTECT(PROT_READ|PROT_WRITE) to initial Mmap on netbsd On NetBSD PAX mprotect prohibits setting protection bits missing from the original mmap call unless explicitly requested with PROT_MPROTECT. Fixes golang/go#58660 Change-Id: I1e97e920bc617ed1674855adaae5047638a30394 Reviewed-on: https://go-review.googlesource.com/c/sys/+/470775 Run-TryBot: Tobias Klauser Auto-Submit: Tobias Klauser Reviewed-by: Than McIntosh TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills --- unix/mmap_unix_test.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/unix/mmap_unix_test.go b/unix/mmap_unix_test.go index a2ec6c817..d51f690e2 100644 --- a/unix/mmap_unix_test.go +++ b/unix/mmap_unix_test.go @@ -15,11 +15,21 @@ import ( ) func TestMmap(t *testing.T) { - b, err := unix.Mmap(-1, 0, unix.Getpagesize(), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_PRIVATE) + mmapProt := unix.PROT_NONE + mprotectProt := unix.PROT_READ | unix.PROT_WRITE + // On NetBSD PAX mprotect prohibits setting protection bits + // missing from the original mmap call unless explicitly + // requested with PROT_MPROTECT. + if runtime.GOOS == "netbsd" { + // PROT_MPROTECT(x) is defined as ((x) << 3): + // https://github.com/NetBSD/src/blob/aba449a55bf91b44bc68f542edd9afa341962b89/sys/sys/mman.h#L73 + mmapProt = mprotectProt << 3 + } + b, err := unix.Mmap(-1, 0, unix.Getpagesize(), mmapProt, unix.MAP_ANON|unix.MAP_PRIVATE) if err != nil { t.Fatalf("Mmap: %v", err) } - if err := unix.Mprotect(b, unix.PROT_READ|unix.PROT_WRITE); err != nil { + if err := unix.Mprotect(b, mprotectProt); err != nil { t.Fatalf("Mprotect: %v", err) }