Author: kib
Date: Fri Jun 15 10:38:14 2012
New Revision: 237134
URL: http://svn.freebsd.org/changeset/base/237134

Log:
  MFC r226342 (by marcel):
  In elf32_trans_prot() and when compiling for amd64 or ia64, add
  PROT_EXECUTE when PROT_READ is needed. By default i386 allows
  execution when reading is allowed and JDK 1.4.x depends on that.
  
  MFC r226343 (by marcel):
  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.
  
  MFC r226347 (by marcel):
  In freebsd32_mmap() and when compiling for amd64 or ia64, also
  ask for execute permissions when read permissions are wanted.
  This is needed for JDK 1.4.x on i386.
  
  MFC r226348 (by marcel):
  Wrap mprotect(2).
  
  MFC r226349 (by marcel):
  Wrap mprotect(2) so that we can add execute permissions when read
  permissions are requested. This is needed on amd64 and ia64 for
  JDK 1.4.x.
  
  MFC r226353 (by marcel):
  Use PTRIN().
  
  MFC r226388:
  Control the execution permission of the readable segments for
  i386 binaries on the amd64 and ia64 with the sysctl, instead of
  unconditionally enabling it.
  
  MFC note: the syscall tables were regenerated in r226349 and committed
  together with changes to non-generated files. The merge includes
  syscall tables regenerated after the merge, for stable/9.

Modified:
  stable/9/sys/compat/freebsd32/freebsd32_misc.c
  stable/9/sys/compat/freebsd32/freebsd32_proto.h
  stable/9/sys/compat/freebsd32/freebsd32_syscall.h
  stable/9/sys/compat/freebsd32/freebsd32_syscalls.c
  stable/9/sys/compat/freebsd32/freebsd32_sysent.c
  stable/9/sys/compat/freebsd32/freebsd32_systrace_args.c
  stable/9/sys/compat/freebsd32/syscalls.master
  stable/9/sys/kern/imgact_elf.c
  stable/9/sys/sys/sysent.h
  stable/9/sys/vm/vm_unix.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32_misc.c      Fri Jun 15 10:00:29 
2012        (r237133)
+++ stable/9/sys/compat/freebsd32/freebsd32_misc.c      Fri Jun 15 10:38:14 
2012        (r237134)
@@ -437,6 +437,21 @@ freebsd32_mmap_partial(struct thread *td
 #endif
 
 int
+freebsd32_mprotect(struct thread *td, struct freebsd32_mprotect_args *uap)
+{
+       struct mprotect_args ap;
+
+       ap.addr = PTRIN(uap->addr);
+       ap.len = uap->len;
+       ap.prot = uap->prot;
+#if defined(__amd64__) || defined(__ia64__)
+       if (i386_read_exec && (ap.prot & PROT_READ) != 0)
+               ap.prot |= PROT_EXEC;
+#endif
+       return (sys_mprotect(td, &ap));
+}
+
+int
 freebsd32_mmap(struct thread *td, struct freebsd32_mmap_args *uap)
 {
        struct mmap_args ap;
@@ -520,6 +535,11 @@ freebsd32_mmap(struct thread *td, struct
        }
 #endif
 
+#if defined(__amd64__) || defined(__ia64__)
+       if (i386_read_exec && (prot & PROT_READ))
+               prot |= PROT_EXEC;
+#endif
+
        ap.addr = (void *) addr;
        ap.len = len;
        ap.prot = prot;

Modified: stable/9/sys/compat/freebsd32/freebsd32_proto.h
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32_proto.h     Fri Jun 15 10:00:29 
2012        (r237133)
+++ stable/9/sys/compat/freebsd32/freebsd32_proto.h     Fri Jun 15 10:38:14 
2012        (r237134)
@@ -76,6 +76,11 @@ struct freebsd32_execve_args {
        char argv_l_[PADL_(u_int32_t *)]; u_int32_t * argv; char 
argv_r_[PADR_(u_int32_t *)];
        char envv_l_[PADL_(u_int32_t *)]; u_int32_t * envv; char 
envv_r_[PADR_(u_int32_t *)];
 };
+struct freebsd32_mprotect_args {
+       char addr_l_[PADL_(const void *)]; const void * addr; char 
addr_r_[PADR_(const void *)];
+       char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+       char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)];
+};
 struct freebsd32_setitimer_args {
        char which_l_[PADL_(u_int)]; u_int which; char which_r_[PADR_(u_int)];
        char itv_l_[PADL_(struct itimerval32 *)]; struct itimerval32 * itv; 
char itv_r_[PADR_(struct itimerval32 *)];
@@ -593,6 +598,7 @@ int freebsd32_recvfrom(struct thread *, 
 int    freebsd32_sigaltstack(struct thread *, struct 
freebsd32_sigaltstack_args *);
 int    freebsd32_ioctl(struct thread *, struct freebsd32_ioctl_args *);
 int    freebsd32_execve(struct thread *, struct freebsd32_execve_args *);
+int    freebsd32_mprotect(struct thread *, struct freebsd32_mprotect_args *);
 int    freebsd32_setitimer(struct thread *, struct freebsd32_setitimer_args *);
 int    freebsd32_getitimer(struct thread *, struct freebsd32_getitimer_args *);
 int    freebsd32_select(struct thread *, struct freebsd32_select_args *);
@@ -952,6 +958,7 @@ int freebsd7_freebsd32_shmctl(struct thr
 #define        FREEBSD32_SYS_AUE_freebsd32_execve      AUE_EXECVE
 #define        FREEBSD32_SYS_AUE_ofreebsd32_fstat      AUE_FSTAT
 #define        FREEBSD32_SYS_AUE_ofreebsd32_getpagesize        AUE_NULL
+#define        FREEBSD32_SYS_AUE_freebsd32_mprotect    AUE_MPROTECT
 #define        FREEBSD32_SYS_AUE_freebsd32_setitimer   AUE_SETITIMER
 #define        FREEBSD32_SYS_AUE_freebsd32_getitimer   AUE_GETITIMER
 #define        FREEBSD32_SYS_AUE_freebsd32_select      AUE_SELECT

Modified: stable/9/sys/compat/freebsd32/freebsd32_syscall.h
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32_syscall.h   Fri Jun 15 10:00:29 
2012        (r237133)
+++ stable/9/sys/compat/freebsd32/freebsd32_syscall.h   Fri Jun 15 10:38:14 
2012        (r237134)
@@ -80,7 +80,7 @@
                                /* 71 is obsolete ommap */
 #define        FREEBSD32_SYS_vadvise   72
 #define        FREEBSD32_SYS_munmap    73
-#define        FREEBSD32_SYS_mprotect  74
+#define        FREEBSD32_SYS_freebsd32_mprotect        74
 #define        FREEBSD32_SYS_madvise   75
                                /* 76 is obsolete vhangup */
                                /* 77 is obsolete vlimit */

Modified: stable/9/sys/compat/freebsd32/freebsd32_syscalls.c
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32_syscalls.c  Fri Jun 15 10:00:29 
2012        (r237133)
+++ stable/9/sys/compat/freebsd32/freebsd32_syscalls.c  Fri Jun 15 10:38:14 
2012        (r237134)
@@ -84,7 +84,7 @@ const char *freebsd32_syscallnames[] = {
        "obs_ommap",                    /* 71 = obsolete ommap */
        "vadvise",                      /* 72 = vadvise */
        "munmap",                       /* 73 = munmap */
-       "mprotect",                     /* 74 = mprotect */
+       "freebsd32_mprotect",                   /* 74 = freebsd32_mprotect */
        "madvise",                      /* 75 = madvise */
        "obs_vhangup",                  /* 76 = obsolete vhangup */
        "obs_vlimit",                   /* 77 = obsolete vlimit */

Modified: stable/9/sys/compat/freebsd32/freebsd32_sysent.c
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32_sysent.c    Fri Jun 15 10:00:29 
2012        (r237133)
+++ stable/9/sys/compat/freebsd32/freebsd32_sysent.c    Fri Jun 15 10:38:14 
2012        (r237134)
@@ -121,7 +121,7 @@ struct sysent freebsd32_sysent[] = {
        { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },      
                /* 71 = obsolete ommap */
        { AS(ovadvise_args), (sy_call_t *)sys_ovadvise, AUE_O_VADVISE, NULL, 0, 
0, 0, SY_THR_STATIC },  /* 72 = vadvise */
        { AS(munmap_args), (sy_call_t *)sys_munmap, AUE_MUNMAP, NULL, 0, 0, 0, 
SY_THR_STATIC }, /* 73 = munmap */
-       { AS(mprotect_args), (sy_call_t *)sys_mprotect, AUE_MPROTECT, NULL, 0, 
0, 0, SY_THR_STATIC },   /* 74 = mprotect */
+       { AS(freebsd32_mprotect_args), (sy_call_t *)freebsd32_mprotect, 
AUE_MPROTECT, NULL, 0, 0, 0, SY_THR_STATIC },   /* 74 = freebsd32_mprotect */
        { AS(madvise_args), (sy_call_t *)sys_madvise, AUE_MADVISE, NULL, 0, 0, 
0, SY_THR_STATIC },      /* 75 = madvise */
        { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },      
                /* 76 = obsolete vhangup */
        { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },      
                /* 77 = obsolete vlimit */

Modified: stable/9/sys/compat/freebsd32/freebsd32_systrace_args.c
==============================================================================
--- stable/9/sys/compat/freebsd32/freebsd32_systrace_args.c     Fri Jun 15 
10:00:29 2012        (r237133)
+++ stable/9/sys/compat/freebsd32/freebsd32_systrace_args.c     Fri Jun 15 
10:38:14 2012        (r237134)
@@ -464,9 +464,9 @@ systrace_args(int sysnum, void *params, 
                *n_args = 2;
                break;
        }
-       /* mprotect */
+       /* freebsd32_mprotect */
        case 74: {
-               struct mprotect_args *p = params;
+               struct freebsd32_mprotect_args *p = params;
                uarg[0] = (intptr_t) p->addr; /* const void * */
                uarg[1] = p->len; /* size_t */
                iarg[2] = p->prot; /* int */
@@ -3749,7 +3749,7 @@ systrace_setargdesc(int sysnum, int ndx,
                        break;
                };
                break;
-       /* mprotect */
+       /* freebsd32_mprotect */
        case 74:
                switch(ndx) {
                case 0:

Modified: stable/9/sys/compat/freebsd32/syscalls.master
==============================================================================
--- stable/9/sys/compat/freebsd32/syscalls.master       Fri Jun 15 10:00:29 
2012        (r237133)
+++ stable/9/sys/compat/freebsd32/syscalls.master       Fri Jun 15 10:38:14 
2012        (r237134)
@@ -172,7 +172,7 @@
 72     AUE_O_VADVISE   NOPROTO { int ovadvise(int anom); } vadvise \
                                    ovadvise_args int
 73     AUE_MUNMAP      NOPROTO { int munmap(void *addr, size_t len); }
-74     AUE_MPROTECT    NOPROTO { int mprotect(const void *addr, \
+74     AUE_MPROTECT    STD     { int freebsd32_mprotect(const void *addr, \
                                    size_t len, int prot); }
 75     AUE_MADVISE     NOPROTO { int madvise(void *addr, size_t len, \
                                    int behav); }

Modified: stable/9/sys/kern/imgact_elf.c
==============================================================================
--- stable/9/sys/kern/imgact_elf.c      Fri Jun 15 10:00:29 2012        
(r237133)
+++ stable/9/sys/kern/imgact_elf.c      Fri Jun 15 10:38:14 2012        
(r237134)
@@ -123,6 +123,14 @@ SYSCTL_INT(__CONCAT(_kern_elf, __ELF_WOR
     nxstack, CTLFLAG_RW, &__elfN(nxstack), 0,
     __XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) ": enable non-executable stack");
 
+#if __ELF_WORD_SIZE == 32
+#if defined(__amd64__) || defined(__ia64__)
+int i386_read_exec = 0;
+SYSCTL_INT(_kern_elf32, OID_AUTO, read_exec, CTLFLAG_RW, &i386_read_exec, 0,
+    "enable execution from readable segments");
+#endif
+#endif
+
 static Elf_Brandinfo *elf_brand_list[MAX_BRANDS];
 
 #define        trunc_page_ps(va, ps)   ((va) & ~(ps - 1))
@@ -1671,6 +1679,12 @@ __elfN(trans_prot)(Elf_Word flags)
                prot |= VM_PROT_WRITE;
        if (flags & PF_R)
                prot |= VM_PROT_READ;
+#if __ELF_WORD_SIZE == 32
+#if defined(__amd64__) || defined(__ia64__)
+       if (i386_read_exec && (flags & PF_R))
+               prot |= VM_PROT_EXECUTE;
+#endif
+#endif
        return (prot);
 }
 

Modified: stable/9/sys/sys/sysent.h
==============================================================================
--- stable/9/sys/sys/sysent.h   Fri Jun 15 10:00:29 2012        (r237133)
+++ stable/9/sys/sys/sysent.h   Fri Jun 15 10:38:14 2012        (r237134)
@@ -151,6 +151,10 @@ extern struct sysentvec null_sysvec;
 extern struct sysent sysent[];
 extern const char *syscallnames[];
 
+#if defined(__amd64__) || defined(__ia64__)
+extern int i386_read_exec;
+#endif
+
 #define        NO_SYSCALL (-1)
 
 struct module;

Modified: stable/9/sys/vm/vm_unix.c
==============================================================================
--- stable/9/sys/vm/vm_unix.c   Fri Jun 15 10:00:29 2012        (r237133)
+++ stable/9/sys/vm/vm_unix.c   Fri Jun 15 10:38:14 2012        (r237134)
@@ -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 (i386_read_exec && 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);
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to