For old mmap syscall, when executing on amd64 or ia64, enforce the

PROT_EXEC if prot is non-zero, process is 32bit and
kern.elf32.i386_read_exec syscal is enabled. This workaround is needed
for old i386 a.out binaries, where dynamic linker did not specified
PROT_EXEC for mapping of the text.

The kern.elf32.i386_read_exec MIB name looks weird for a.out binaries,
but I reused the existing knob which already has the needed semantic.

MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2012-08-14 12:11:48 +00:00
parent a8d4becf02
commit ee4116b8f7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=239250

View File

@ -453,6 +453,13 @@ ommap(td, uap)
nargs.addr = uap->addr;
nargs.len = uap->len;
nargs.prot = cvtbsdprot[uap->prot & 0x7];
#ifdef COMPAT_FREEBSD32
#if defined(__amd64__) || defined(__ia64__)
if (i386_read_exec && SV_PROC_FLAG(td->td_proc, SV_ILP32) &&
nargs.prot != 0)
nargs.prot |= PROT_EXEC;
#endif
#endif
nargs.flags = 0;
if (uap->flags & OMAP_ANON)
nargs.flags |= MAP_ANON;