diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2013-04-13 20:31:37 -0400 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-04-29 15:40:23 -0400 | 
| commit | 3dc20cb282ec03cc4c997130d680c800011ed479 (patch) | |
| tree | d8374e58a433a144c571e193cb0b024374ee0b6a /arch/x86/ia32 | |
| parent | 3af0761307d04f6b9a4626fb80011a22c143d75e (diff) | |
| download | linux-3dc20cb282ec03cc4c997130d680c800011ed479.tar.bz2 | |
new helper: read_code()
switch binfmts that use ->read() to that (and to kernel_read()
in several cases in binfmt_flat - sure, it's nommu, but still,
doing ->read() into kmalloc'ed buffer...)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/x86/ia32')
| -rw-r--r-- | arch/x86/ia32/ia32_aout.c | 30 | 
1 files changed, 6 insertions, 24 deletions
| diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 03abf9b70011..03d721cbbc32 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c @@ -323,11 +323,8 @@ static int load_aout_binary(struct linux_binprm *bprm)  	if (N_MAGIC(ex) == OMAGIC) {  		unsigned long text_addr, map_size; -		loff_t pos;  		text_addr = N_TXTADDR(ex); - -		pos = 32;  		map_size = ex.a_text+ex.a_data;  		error = vm_brk(text_addr & PAGE_MASK, map_size); @@ -337,15 +334,12 @@ static int load_aout_binary(struct linux_binprm *bprm)  			return error;  		} -		error = bprm->file->f_op->read(bprm->file, -			 (char __user *)text_addr, -			  ex.a_text+ex.a_data, &pos); +		error = read_code(bprm->file, text_addr, 32, +				  ex.a_text + ex.a_data);  		if ((signed long)error < 0) {  			send_sig(SIGKILL, current, 0);  			return error;  		} - -		flush_icache_range(text_addr, text_addr+ex.a_text+ex.a_data);  	} else {  #ifdef WARN_OLD  		static unsigned long error_time, error_time2; @@ -367,15 +361,9 @@ static int load_aout_binary(struct linux_binprm *bprm)  #endif  		if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) { -			loff_t pos = fd_offset; -  			vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); -			bprm->file->f_op->read(bprm->file, -					(char __user *)N_TXTADDR(ex), -					ex.a_text+ex.a_data, &pos); -			flush_icache_range((unsigned long) N_TXTADDR(ex), -					   (unsigned long) N_TXTADDR(ex) + -					   ex.a_text+ex.a_data); +			read_code(bprm->file, N_TXTADDR(ex), fd_offset, +					ex.a_text+ex.a_data);  			goto beyond_if;  		} @@ -452,8 +440,6 @@ static int load_aout_library(struct file *file)  	start_addr =  ex.a_entry & 0xfffff000;  	if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) { -		loff_t pos = N_TXTOFF(ex); -  #ifdef WARN_OLD  		static unsigned long error_time;  		if (time_after(jiffies, error_time + 5*HZ)) { @@ -466,12 +452,8 @@ static int load_aout_library(struct file *file)  #endif  		vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); -		file->f_op->read(file, (char __user *)start_addr, -			ex.a_text + ex.a_data, &pos); -		flush_icache_range((unsigned long) start_addr, -				   (unsigned long) start_addr + ex.a_text + -				   ex.a_data); - +		read_code(file, start_addr, N_TXTOFF(ex), +			  ex.a_text + ex.a_data);  		retval = 0;  		goto out;  	} |