mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04: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 <[email protected]>
This commit is contained in:
parent
2926620145
commit
19d860a140
5 changed files with 35 additions and 77 deletions
19
fs/exec.c
19
fs/exec.c
|
|
@ -1372,18 +1372,23 @@ int search_binary_handler(struct linux_binprm *bprm)
|
|||
read_unlock(&binfmt_lock);
|
||||
bprm->recursion_depth++;
|
||||
retval = fmt->load_binary(bprm);
|
||||
bprm->recursion_depth--;
|
||||
if (retval >= 0 || retval != -ENOEXEC ||
|
||||
bprm->mm == NULL || bprm->file == NULL) {
|
||||
put_binfmt(fmt);
|
||||
return retval;
|
||||
}
|
||||
read_lock(&binfmt_lock);
|
||||
put_binfmt(fmt);
|
||||
bprm->recursion_depth--;
|
||||
if (retval < 0 && !bprm->mm) {
|
||||
/* we got to flush_old_exec() and failed after it */
|
||||
read_unlock(&binfmt_lock);
|
||||
force_sigsegv(SIGSEGV, current);
|
||||
return retval;
|
||||
}
|
||||
if (retval != -ENOEXEC || !bprm->file) {
|
||||
read_unlock(&binfmt_lock);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
read_unlock(&binfmt_lock);
|
||||
|
||||
if (need_retry && retval == -ENOEXEC) {
|
||||
if (need_retry) {
|
||||
if (printable(bprm->buf[0]) && printable(bprm->buf[1]) &&
|
||||
printable(bprm->buf[2]) && printable(bprm->buf[3]))
|
||||
return retval;
|
||||
|
|
|
|||
Loading…
Reference in a new issue