On Thu, Oct 13, 2011 at 04:20:10PM +0000, Marcel Moolenaar wrote: > Author: marcel > Date: Thu Oct 13 16:20:10 2011 > New Revision: 226343 > URL: http://svn.freebsd.org/changeset/base/226343 > > Log: > In sys_obreak() and when compiling for amd64 or ia64, when the process > is ILP32 (i.e. i386) grant execute permissions by default. The JDK 1.4.x > depends on being able to execute from the heap on i386. > > Modified: > head/sys/vm/vm_unix.c > > Modified: head/sys/vm/vm_unix.c > ============================================================================== > --- head/sys/vm/vm_unix.c Thu Oct 13 16:16:46 2011 (r226342) > +++ head/sys/vm/vm_unix.c Thu Oct 13 16:20:10 2011 (r226343) > @@ -36,6 +36,8 @@ > * @(#)vm_unix.c 8.1 (Berkeley) 6/11/93 > */ > > +#include "opt_compat.h" > + > /* > * Traditional sbrk/grow interface to VM > */ > @@ -49,6 +51,7 @@ __FBSDID("$FreeBSD$"); > #include <sys/proc.h> > #include <sys/racct.h> > #include <sys/resourcevar.h> > +#include <sys/sysent.h> > #include <sys/sysproto.h> > #include <sys/systm.h> > > @@ -75,7 +78,7 @@ sys_obreak(td, uap) > struct vmspace *vm = td->td_proc->p_vmspace; > vm_offset_t new, old, base; > rlim_t datalim, vmemlim; > - int rv; > + int prot, rv; > int error = 0; > boolean_t do_map_wirefuture; > > @@ -135,8 +138,15 @@ sys_obreak(td, uap) > } > PROC_UNLOCK(td->td_proc); > #endif > + prot = VM_PROT_RW; > +#ifdef COMPAT_FREEBSD32 > +#if defined(__amd64__) || defined(__ia64__) > + if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) > + prot |= VM_PROT_EXECUTE; > +#endif > +#endif > rv = vm_map_insert(&vm->vm_map, NULL, 0, old, new, > - VM_PROT_RW, VM_PROT_ALL, 0); > + prot, VM_PROT_ALL, 0); > if (rv != KERN_SUCCESS) { > #ifdef RACCT > PROC_LOCK(td->td_proc); The two commits removed NX support for .data/.bss for 32bit binaries on amd64. This is too unfortunate. Can we claim that only old binaries need this hack ?
If yes, could you, please, conditionalize the hack on curproc->p_osrel being, say, 4.x ?
pgpJQZj87yPZz.pgp
Description: PGP signature
