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:
parent
128c495e50
commit
e2fba140a8
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user