support execute disabled stack
This commit is contained in:
@@ -65,6 +65,7 @@ struct program_load_desc {
|
|||||||
int cpu;
|
int cpu;
|
||||||
int pid;
|
int pid;
|
||||||
int err;
|
int err;
|
||||||
|
int stack_prot;
|
||||||
unsigned long entry;
|
unsigned long entry;
|
||||||
unsigned long user_start;
|
unsigned long user_start;
|
||||||
unsigned long user_end;
|
unsigned long user_end;
|
||||||
|
|||||||
@@ -159,6 +159,7 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
|||||||
fseek(fp, hdr.e_phoff, SEEK_SET);
|
fseek(fp, hdr.e_phoff, SEEK_SET);
|
||||||
j = 0;
|
j = 0;
|
||||||
desc->num_sections = nhdrs;
|
desc->num_sections = nhdrs;
|
||||||
|
desc->stack_prot = PROT_READ | PROT_WRITE | PROT_EXEC; /* default */
|
||||||
for (i = 0; i < hdr.e_phnum; i++) {
|
for (i = 0; i < hdr.e_phnum; i++) {
|
||||||
if (fread(&phdr, sizeof(phdr), 1, fp) < 1) {
|
if (fread(&phdr, sizeof(phdr), 1, fp) < 1) {
|
||||||
__eprintf("Loading phdr failed (%d)\n", i);
|
__eprintf("Loading phdr failed (%d)\n", i);
|
||||||
@@ -205,6 +206,12 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
|||||||
load_addr = phdr.p_vaddr - phdr.p_offset;
|
load_addr = phdr.p_vaddr - phdr.p_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (phdr.p_type == PT_GNU_STACK) {
|
||||||
|
desc->stack_prot = PROT_NONE;
|
||||||
|
desc->stack_prot |= (phdr.p_flags & PF_R)? PROT_READ: 0;
|
||||||
|
desc->stack_prot |= (phdr.p_flags & PF_W)? PROT_WRITE: 0;
|
||||||
|
desc->stack_prot |= (phdr.p_flags & PF_X)? PROT_EXEC: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
desc->pid = getpid();
|
desc->pid = getpid();
|
||||||
desc->entry = hdr.e_entry;
|
desc->entry = hdr.e_entry;
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ struct program_load_desc {
|
|||||||
int cpu;
|
int cpu;
|
||||||
int pid;
|
int pid;
|
||||||
int err;
|
int err;
|
||||||
|
int stack_prot;
|
||||||
unsigned long entry;
|
unsigned long entry;
|
||||||
unsigned long user_start;
|
unsigned long user_start;
|
||||||
unsigned long user_end;
|
unsigned long user_end;
|
||||||
|
|||||||
@@ -1333,8 +1333,8 @@ int init_process_stack(struct process *process, struct program_load_desc *pn,
|
|||||||
start = end - size;
|
start = end - size;
|
||||||
|
|
||||||
vrflag = VR_STACK | VR_DEMAND_PAGING;
|
vrflag = VR_STACK | VR_DEMAND_PAGING;
|
||||||
vrflag |= VR_PROT_READ | VR_PROT_WRITE | VR_PROT_EXEC;
|
vrflag |= PROT_TO_VR_FLAG(pn->stack_prot);
|
||||||
vrflag |= VRFLAG_PROT_TO_MAXPROT(vrflag);
|
vrflag |= VR_MAXPROT_READ | VR_MAXPROT_WRITE | VR_MAXPROT_EXEC;
|
||||||
#define NOPHYS ((uintptr_t)-1)
|
#define NOPHYS ((uintptr_t)-1)
|
||||||
if ((rc = add_process_memory_range(process, start, end, NOPHYS,
|
if ((rc = add_process_memory_range(process, start, end, NOPHYS,
|
||||||
vrflag, NULL, 0)) != 0) {
|
vrflag, NULL, 0)) != 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user