diff options
Diffstat (limited to 'fs/binfmt_elf.c')
| -rw-r--r-- | fs/binfmt_elf.c | 12 | 
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index b25707fee2c..d48ff5f370f 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -16,7 +16,6 @@  #include <linux/time.h>  #include <linux/mm.h>  #include <linux/mman.h> -#include <linux/a.out.h>  #include <linux/errno.h>  #include <linux/signal.h>  #include <linux/binfmts.h> @@ -256,7 +255,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,  			return -EFAULT;  		len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);  		if (!len || len > MAX_ARG_STRLEN) -			return 0; +			return -EINVAL;  		p += len;  	}  	if (__put_user(0, argv)) @@ -268,7 +267,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,  			return -EFAULT;  		len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);  		if (!len || len > MAX_ARG_STRLEN) -			return 0; +			return -EINVAL;  		p += len;  	}  	if (__put_user(0, envp)) @@ -548,7 +547,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)  	struct {  		struct elfhdr elf_ex;  		struct elfhdr interp_elf_ex; -  		struct exec interp_ex;  	} *loc;  	loc = kmalloc(sizeof(*loc), GFP_KERNEL); @@ -680,7 +678,6 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)  			}  			/* Get the exec headers */ -			loc->interp_ex = *((struct exec *)bprm->buf);  			loc->interp_elf_ex = *((struct elfhdr *)bprm->buf);  			break;  		} @@ -1900,7 +1897,7 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file, un  	/* alloc memory for large data structures: too large to be on stack */  	elf = kmalloc(sizeof(*elf), GFP_KERNEL);  	if (!elf) -		goto cleanup; +		goto out;  	segs = current->mm->map_count;  #ifdef ELF_CORE_EXTRA_PHDRS @@ -2034,8 +2031,9 @@ end_coredump:  	set_fs(fs);  cleanup: -	kfree(elf);  	free_note_info(&info); +	kfree(elf); +out:  	return has_dumped;  }  |