Let linuxulator mprotect mask unsupported bits before calling kern_mprotect.

After r349240 kern_mprotect returns EINVAL for unsupported bits in the prot
argument.  Linux rtld uses PROT_GROWSDOWN and PROT_GROWS_UP when marking the
stack executable.  Mask these bits like kern_mprotect used to do.  For other
unsupported bits EINVAL is returned like Linux does.

Reviewed by:	trasz, brooks
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D20864
This commit is contained in:
Tijl Coosemans 2019-07-10 08:19:33 +00:00
parent 128c495e50
commit e2fba140a8
2 changed files with 7 additions and 0 deletions

View File

@ -228,6 +228,11 @@ int
linux_mprotect_common(struct thread *td, uintptr_t addr, size_t len, int prot)
{
/* XXX Ignore PROT_GROWSDOWN and PROT_GROWSUP for now. */
prot &= ~(LINUX_PROT_GROWSDOWN | LINUX_PROT_GROWSUP);
if ((prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) != 0)
return (EINVAL);
#if defined(__amd64__)
linux_fixup_prot(td, &prot);
#endif

View File

@ -41,6 +41,8 @@
#define LINUX_MAP_ANON 0x0020
#define LINUX_MAP_GROWSDOWN 0x0100
#define LINUX_PROT_GROWSDOWN 0x01000000
#define LINUX_PROT_GROWSUP 0x02000000
int linux_mmap_common(struct thread *, uintptr_t, size_t, int, int,
int, off_t);