mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 21:51:05 +00:00
[PATCH] sanitize handling of shared descriptor tables in failing execve()
* unshare_files() can fail; doing it after irreversible actions is wrong and de_thread() is certainly irreversible. * since we do it unconditionally anyway, we might as well do it in do_execve() and save ourselves the PITA in binfmt handlers, etc. * while we are at it, binfmt_som actually leaked files_struct on failure. As a side benefit, unshare_files(), put_files_struct() and reset_files_struct() become unexported. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
6b335d9c80
commit
fd8328be87
6 changed files with 20 additions and 70 deletions
|
@ -543,7 +543,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|||
unsigned long interp_load_addr = 0;
|
||||
unsigned long start_code, end_code, start_data, end_data;
|
||||
unsigned long reloc_func_desc = 0;
|
||||
struct files_struct *files;
|
||||
int executable_stack = EXSTACK_DEFAULT;
|
||||
unsigned long def_flags = 0;
|
||||
struct {
|
||||
|
@ -593,20 +592,9 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|||
goto out_free_ph;
|
||||
}
|
||||
|
||||
files = current->files; /* Refcounted so ok */
|
||||
retval = unshare_files();
|
||||
if (retval < 0)
|
||||
goto out_free_ph;
|
||||
if (files == current->files) {
|
||||
put_files_struct(files);
|
||||
files = NULL;
|
||||
}
|
||||
|
||||
/* exec will make our files private anyway, but for the a.out
|
||||
loader stuff we need to do it earlier */
|
||||
retval = get_unused_fd();
|
||||
if (retval < 0)
|
||||
goto out_free_fh;
|
||||
goto out_free_ph;
|
||||
get_file(bprm->file);
|
||||
fd_install(elf_exec_fileno = retval, bprm->file);
|
||||
|
||||
|
@ -728,12 +716,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|||
if (retval)
|
||||
goto out_free_dentry;
|
||||
|
||||
/* Discard our unneeded old files struct */
|
||||
if (files) {
|
||||
put_files_struct(files);
|
||||
files = NULL;
|
||||
}
|
||||
|
||||
/* OK, This is the point of no return */
|
||||
current->flags &= ~PF_FORKNOEXEC;
|
||||
current->mm->def_flags = def_flags;
|
||||
|
@ -1016,9 +998,6 @@ out_free_interp:
|
|||
kfree(elf_interpreter);
|
||||
out_free_file:
|
||||
sys_close(elf_exec_fileno);
|
||||
out_free_fh:
|
||||
if (files)
|
||||
reset_files_struct(current, files);
|
||||
out_free_ph:
|
||||
kfree(elf_phdata);
|
||||
goto out;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue