Port-powerpc archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

siginfo & no-exec permission - please test



Hi -
I don't have a ppc box to test with atm, but I've done
related fixes to other architectures, and from code
inspection it appears to me that a little fix should be
applied to the powerpc port as well:
Desired behaviour is that a SIGSEGV is delivered to a
process, with a siginfo si_code of SEGV_ACCERR if code
execution is attempted from virtual memory mapped without
execution permission (especially the stack).
The appended patched should implement this.

Unfortunately I don't have a test program ready to verify
this -- the regression test in regress/sys/uvm/stack_noexec
probably doesn't work because gcc's ppc target doesn't
use stack trampolines afaics.
Perhaps you've got another idea;-)

While we are here, 2 observations:
-powerpc/ibm4xx/trap.c appears to leave ksi.ksi_code
 uninitialized at a number of places
-it also calls trapsignal() directly, without the
 emulation hook

best regards
Matthias


Index: powerpc/ibm4xx/trap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/ibm4xx/trap.c,v
retrieving revision 1.20
diff -u -r1.20 trap.c
--- powerpc/ibm4xx/trap.c       31 Oct 2003 16:44:35 -0000      1.20
+++ powerpc/ibm4xx/trap.c       19 Feb 2004 17:28:14 -0000
@@ -293,6 +293,7 @@
                ksi.ksi_signo = SIGSEGV;
                ksi.ksi_trap = EXC_ISI;
                ksi.ksi_addr = (void *)frame->srr0;
+               ksi.ksi_code = (rv == EACCES ? SEGV_ACC : SEGV_MAP);
                trapsignal(l, &ksi);
                l->l_flag &= ~L_SA_PAGEFAULT;
                KERNEL_PROC_UNLOCK(l);
Index: powerpc/powerpc/trap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/trap.c,v
retrieving revision 1.96
diff -u -r1.96 trap.c
--- powerpc/powerpc/trap.c      21 Nov 2003 22:57:14 -0000      1.96
+++ powerpc/powerpc/trap.c      19 Feb 2004 17:28:14 -0000
@@ -334,7 +334,7 @@
                ksi.ksi_signo = SIGSEGV;
                ksi.ksi_trap = EXC_ISI;
                ksi.ksi_addr = (void *)frame->srr0;
-               ksi.ksi_code = SEGV_MAPERR;
+               ksi.ksi_code = (rv == EACCES ? SEGV_ACCERR : SEGV_MAPERR);
                (*p->p_emul->e_trapsignal)(l, &ksi);
                l->l_flag &= ~L_SA_PAGEFAULT;
                KERNEL_PROC_UNLOCK(l);


Home | Main Index | Thread Index | Old Index