diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2024-03-28 09:40:50 +0300 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2024-03-29 00:32:46 +0100 |
commit | df19628b2b6665468e698e290dfd1568720ba042 (patch) | |
tree | f021003706eb8cd45f95e7be96953a230e246334 /kern/elf-load.c | |
parent | ced537ad297754e08b19536102712c692c949f44 (diff) | |
download | gnumach-df19628b2b6665468e698e290dfd1568720ba042.tar.gz gnumach-df19628b2b6665468e698e290dfd1568720ba042.tar.bz2 gnumach-df19628b2b6665468e698e290dfd1568720ba042.zip |
elf-load: Respect PT_GNU_STACK
If a bootstrap ELF contains a PT_GNU_STACK phdr, take stack protection
from there. Otherwise, default to VM_PROT_ALL.
Diffstat (limited to 'kern/elf-load.c')
-rw-r--r-- | kern/elf-load.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/kern/elf-load.c b/kern/elf-load.c index ce86327c..596233a8 100644 --- a/kern/elf-load.c +++ b/kern/elf-load.c @@ -73,6 +73,8 @@ int exec_load(exec_read_func_t *read, exec_read_exec_func_t *read_exec, if (actual < phsize) return EX_CORRUPT; + out_info->stack_prot = VM_PROT_ALL; + for (i = 0; i < x.e_phnum; i++) { ph = (Elf_Phdr *)((vm_offset_t)phdr + i * x.e_phentsize); @@ -89,6 +91,11 @@ int exec_load(exec_read_func_t *read, exec_read_exec_func_t *read_exec, ph->p_vaddr + loadbase, ph->p_memsz, type); if (result) return result; + } else if (ph->p_type == PT_GNU_STACK) { + out_info->stack_prot = 0; + if (ph->p_flags & PF_R) out_info->stack_prot |= VM_PROT_READ; + if (ph->p_flags & PF_W) out_info->stack_prot |= VM_PROT_WRITE; + if (ph->p_flags & PF_X) out_info->stack_prot |= VM_PROT_EXECUTE; } } |