Bug #1672 » 2016-01-19-rtld_noexec.patch
| libexec/rtld-elf/rtld.c | ||
|---|---|---|
|
dbg("initializing thread locks");
|
||
|
lockdflt_init();
|
||
|
if (aux_info[AT_STACKPROT] != NULL &&
|
||
|
aux_info[AT_STACKPROT]->a_un.a_val != 0)
|
||
|
stack_prot = aux_info[AT_STACKPROT]->a_un.a_val;
|
||
|
/*
|
||
|
* Load the main program, or process its program header if it is
|
||
|
* already loaded.
|
||
| ... | ... | |
|
if (obj_main == NULL)
|
||
|
rtld_die();
|
||
|
max_stack_flags = obj->stack_flags;
|
||
|
if ((max_stack_flags & PF_X) == PF_X)
|
||
|
if ((stack_prot & PROT_EXEC) == 0)
|
||
|
max_stack_flags &= ~(PF_X);
|
||
|
} else { /* Main program already loaded. */
|
||
|
const Elf_Phdr *phdr;
|
||
|
int phnum;
|
||
| ... | ... | |
|
dbg("obj_main path %s", obj_main->path);
|
||
|
obj_main->mainprog = true;
|
||
|
if (aux_info[AT_STACKPROT] != NULL &&
|
||
|
aux_info[AT_STACKPROT]->a_un.a_val != 0)
|
||
|
stack_prot = aux_info[AT_STACKPROT]->a_un.a_val;
|
||
|
#ifndef COMPAT_32BIT
|
||
|
/*
|
||
|
* Get the actual dynamic linker pathname from the executable if
|
||
| ... | ... | |
|
break;
|
||
|
}
|
||
|
obj->stack_flags = PF_X | PF_R | PF_W;
|
||
|
obj->stack_flags = PF_R | PF_W;
|
||
|
for (ph = phdr; ph < phlimit; ph++) {
|
||
|
switch (ph->p_type) {
|
||
| ... | ... | |
|
obj_loads++;
|
||
|
linkmap_add(obj); /* for GDB & dlinfo() */
|
||
|
max_stack_flags |= obj->stack_flags;
|
||
|
if ((max_stack_flags & PF_X) == PF_X)
|
||
|
if ((stack_prot & PROT_EXEC) == 0)
|
||
|
max_stack_flags &= ~(PF_X);
|
||
|
dbg(" %p .. %p: %s", obj->mapbase,
|
||
|
obj->mapbase + obj->mapsize - 1, obj->path);
|
||