COMPAT_LINUX/powerpc used the native stack setup routine, but now the
native version does non executable mappings on the stack. This is a showstopper for Linux binaries. To fix that we supply a copy f the native stack setup function for Linux binaries, with the executable bit set.
This commit is contained in:
parent
39cf7788fc
commit
6b1a152604
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: linux_exec.h,v 1.16 2003/08/14 02:17:10 christos Exp $ */
|
||||
/* $NetBSD: linux_exec.h,v 1.17 2004/06/16 00:03:25 manu Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
|
||||
@ -103,6 +103,6 @@
|
||||
/* we have special powerpc ELF copyargs */
|
||||
#define LINUX_MACHDEP_ELF_COPYARGS
|
||||
|
||||
#define linux_exec_setup_stack exec_setup_stack
|
||||
int linux_exec_setup_stack(struct proc *, struct exec_package *);
|
||||
|
||||
#endif /* !_POWERPC_LINUX_EXEC_H */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: linux_exec_powerpc.c,v 1.12 2003/06/29 22:29:25 fvdl Exp $ */
|
||||
/* $NetBSD: linux_exec_powerpc.c,v 1.13 2004/06/16 00:03:25 manu Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||
@ -48,7 +48,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: linux_exec_powerpc.c,v 1.12 2003/06/29 22:29:25 fvdl Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: linux_exec_powerpc.c,v 1.13 2004/06/16 00:03:25 manu Exp $");
|
||||
|
||||
#if defined (__alpha__)
|
||||
#define ELFSIZE 64
|
||||
@ -230,3 +230,58 @@ ELFNAME2(linux,copyargs)(p, pack, arginfo, stackp, argp)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is copied from sys/kern/exec_subr.c:exec_setup_stack()
|
||||
* We need a Linux version only to avoid the non executable
|
||||
* mappings. They will probably break signal delivery on Linux,
|
||||
* and they surely break the stack fixup hack.
|
||||
*/
|
||||
int
|
||||
linux_exec_setup_stack(p, epp)
|
||||
struct proc *p;
|
||||
struct exec_package *epp;
|
||||
{
|
||||
u_long max_stack_size;
|
||||
u_long access_linear_min, access_size;
|
||||
u_long noaccess_linear_min, noaccess_size;
|
||||
|
||||
#ifndef USRSTACK32
|
||||
#define USRSTACK32 (0x00000000ffffffffL&~PGOFSET)
|
||||
#endif
|
||||
|
||||
if (epp->ep_flags & EXEC_32) {
|
||||
epp->ep_minsaddr = USRSTACK32;
|
||||
max_stack_size = MAXSSIZ;
|
||||
} else {
|
||||
epp->ep_minsaddr = USRSTACK;
|
||||
max_stack_size = MAXSSIZ;
|
||||
}
|
||||
epp->ep_maxsaddr = (u_long)STACK_GROW(epp->ep_minsaddr,
|
||||
max_stack_size);
|
||||
epp->ep_ssize = p->p_rlimit[RLIMIT_STACK].rlim_cur;
|
||||
|
||||
/*
|
||||
* set up commands for stack. note that this takes *two*, one to
|
||||
* map the part of the stack which we can access, and one to map
|
||||
* the part which we can't.
|
||||
*
|
||||
* arguably, it could be made into one, but that would require the
|
||||
* addition of another mapping proc, which is unnecessary
|
||||
*/
|
||||
access_size = epp->ep_ssize;
|
||||
access_linear_min = (u_long)STACK_ALLOC(epp->ep_minsaddr, access_size);
|
||||
noaccess_size = max_stack_size - access_size;
|
||||
noaccess_linear_min = (u_long)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
|
||||
access_size), noaccess_size);
|
||||
if (noaccess_size > 0) {
|
||||
NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
|
||||
noaccess_linear_min, NULL, 0, VM_PROT_NONE);
|
||||
}
|
||||
KASSERT(access_size > 0);
|
||||
NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
|
||||
access_linear_min, NULL, 0,
|
||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user