mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 22:51:37 +00:00
handle suicide on late failure exits in execve() in search_binary_handler()
... rather than doing that in the guts of ->load_binary(). [updated to fix the bug spotted by Shentino - for SIGSEGV we really need something stronger than send_sig_info(); again, better do that in one place] Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
2926620145
commit
19d860a140
5 changed files with 36 additions and 78 deletions
|
@ -738,10 +738,8 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
change some of these later */
|
||||
retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
|
||||
executable_stack);
|
||||
if (retval < 0) {
|
||||
send_sig(SIGKILL, current, 0);
|
||||
if (retval < 0)
|
||||
goto out_free_dentry;
|
||||
}
|
||||
|
||||
current->mm->start_stack = bprm->p;
|
||||
|
||||
|
@ -763,10 +761,8 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
and clear the area. */
|
||||
retval = set_brk(elf_bss + load_bias,
|
||||
elf_brk + load_bias);
|
||||
if (retval) {
|
||||
send_sig(SIGKILL, current, 0);
|
||||
if (retval)
|
||||
goto out_free_dentry;
|
||||
}
|
||||
nbyte = ELF_PAGEOFFSET(elf_bss);
|
||||
if (nbyte) {
|
||||
nbyte = ELF_MIN_ALIGN - nbyte;
|
||||
|
@ -820,7 +816,6 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
|
||||
elf_prot, elf_flags, 0);
|
||||
if (BAD_ADDR(error)) {
|
||||
send_sig(SIGKILL, current, 0);
|
||||
retval = IS_ERR((void *)error) ?
|
||||
PTR_ERR((void*)error) : -EINVAL;
|
||||
goto out_free_dentry;
|
||||
|
@ -851,7 +846,6 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
elf_ppnt->p_memsz > TASK_SIZE ||
|
||||
TASK_SIZE - elf_ppnt->p_memsz < k) {
|
||||
/* set_brk can never work. Avoid overflows. */
|
||||
send_sig(SIGKILL, current, 0);
|
||||
retval = -EINVAL;
|
||||
goto out_free_dentry;
|
||||
}
|
||||
|
@ -883,12 +877,9 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
* up getting placed where the bss needs to go.
|
||||
*/
|
||||
retval = set_brk(elf_bss, elf_brk);
|
||||
if (retval) {
|
||||
send_sig(SIGKILL, current, 0);
|
||||
if (retval)
|
||||
goto out_free_dentry;
|
||||
}
|
||||
if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
|
||||
send_sig(SIGSEGV, current, 0);
|
||||
retval = -EFAULT; /* Nobody gets to see this, but.. */
|
||||
goto out_free_dentry;
|
||||
}
|
||||
|
@ -909,7 +900,6 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
elf_entry += loc->interp_elf_ex.e_entry;
|
||||
}
|
||||
if (BAD_ADDR(elf_entry)) {
|
||||
force_sig(SIGSEGV, current);
|
||||
retval = IS_ERR((void *)elf_entry) ?
|
||||
(int)elf_entry : -EINVAL;
|
||||
goto out_free_dentry;
|
||||
|
@ -922,7 +912,6 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
} else {
|
||||
elf_entry = loc->elf_ex.e_entry;
|
||||
if (BAD_ADDR(elf_entry)) {
|
||||
force_sig(SIGSEGV, current);
|
||||
retval = -EINVAL;
|
||||
goto out_free_dentry;
|
||||
}
|
||||
|
@ -934,19 +923,15 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
|
||||
#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
|
||||
retval = arch_setup_additional_pages(bprm, !!elf_interpreter);
|
||||
if (retval < 0) {
|
||||
send_sig(SIGKILL, current, 0);
|
||||
if (retval < 0)
|
||||
goto out;
|
||||
}
|
||||
#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
|
||||
|
||||
install_exec_creds(bprm);
|
||||
retval = create_elf_tables(bprm, &loc->elf_ex,
|
||||
load_addr, interp_load_addr);
|
||||
if (retval < 0) {
|
||||
send_sig(SIGKILL, current, 0);
|
||||
if (retval < 0)
|
||||
goto out;
|
||||
}
|
||||
/* N.B. passed_fileno might not be initialized? */
|
||||
current->mm->end_code = end_code;
|
||||
current->mm->start_code = start_code;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue