From 6b1ecbc6e533eb7f2395623dccb2f80d94dae764 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 10 Feb 2004 21:42:05 +0000 Subject: 2004-01-15 Roland McGrath * priv.h (struct execdata.info.elf): Add `execstack' flag. * exec.c (check_elf_phdr): Set it according to PT_GNU_STACK's PF_X flag bit. If no PT_GNU_STACK, default to set. (do_exec): If flag is clear, remove execute permission from stack. --- exec/exec.c | 22 +++++++++++++++++++++- exec/priv.h | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'exec') diff --git a/exec/exec.c b/exec/exec.c index d96ce8e9..6ffacbde 100644 --- a/exec/exec.c +++ b/exec/exec.c @@ -1,5 +1,5 @@ /* GNU Hurd standard exec server. - Copyright (C) 1992,93,94,95,96,98,99,2000,01,02 + Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04 Free Software Foundation, Inc. Written by Roland McGrath. @@ -902,6 +902,12 @@ check_elf_phdr (struct execdata *e, const ElfW(Phdr) *mapped_phdr, memcpy (e->info.elf.phdr, mapped_phdr, e->info.elf.phnum * sizeof (ElfW(Phdr))); + /* Default state if we do not see PT_GNU_STACK telling us what to do. + Executable stack is the compatible default. + (XXX should be machine-dependent??) + */ + e->info.elf.execstack = 1; + for (phdr = e->info.elf.phdr; phdr < &e->info.elf.phdr[e->info.elf.phnum]; ++phdr) @@ -922,6 +928,9 @@ check_elf_phdr (struct execdata *e, const ElfW(Phdr) *mapped_phdr, phdr->p_filesz)) e->error = ENOEXEC; break; + case PT_GNU_STACK: + e->info.elf.execstack = phdr->p_flags & PF_X; + break; } } @@ -1822,6 +1831,17 @@ do_exec (file_t file, &boot->stack_base, &boot->stack_size); if (e.error) goto out; +#ifdef BFD + if (!e.bfd) +#endif + { + /* It would probably be better to change mach_setup_thread so + it does a vm_map with the right permissions to start with. */ + if (!e.info.elf.execstack) + e.error = vm_protect (newtask, boot->stack_base, boot->stack_size, + 0, VM_PROT_READ | VM_PROT_WRITE); + } + if (oldtask != newtask && oldtask != MACH_PORT_NULL) { diff --git a/exec/priv.h b/exec/priv.h index 46cc919e..625ea477 100644 --- a/exec/priv.h +++ b/exec/priv.h @@ -1,5 +1,5 @@ /* GNU Hurd standard exec server, private declarations. - Copyright (C) 1992,93,94,95,96,99,2000,02 Free Software Foundation, Inc. + Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc. Written by Roland McGrath. This file is part of the GNU Hurd. @@ -151,6 +151,7 @@ struct execdata ElfW(Word) phnum; /* Number of program header table elements. */ int anywhere; /* Nonzero if image can go anywhere. */ vm_address_t loadbase; /* Actual mapping location. */ + int execstack; /* Zero if stack can be nonexecutable. */ } elf; } info; }; -- cgit v1.2.3