diff options
| author | Dave Kleikamp <shaggy@linux.vnet.ibm.com> | 2009-02-02 13:40:55 -0600 | 
|---|---|---|
| committer | Dave Kleikamp <shaggy@linux.vnet.ibm.com> | 2009-02-02 13:40:55 -0600 | 
| commit | 8db0c5d5ef3ab99fe9e5151872b75f45c4282e3c (patch) | |
| tree | da9759151e00221c58cdd9f4de893c0b08753670 /fs/binfmt_flat.c | |
| parent | 1ad53a98c927a9b5b1b57288ac0edec562fbcf8d (diff) | |
| parent | 45c82b5a770be66845687a7d027c8b52946d59af (diff) | |
Merge branch 'master' of /home/shaggy/git/linus-clean/
Diffstat (limited to 'fs/binfmt_flat.c')
| -rw-r--r-- | fs/binfmt_flat.c | 34 | 
1 files changed, 11 insertions, 23 deletions
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 7bbd5c6b3725..5cebf0b37798 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c @@ -417,8 +417,8 @@ static int load_flat_file(struct linux_binprm * bprm,  	unsigned long textpos = 0, datapos = 0, result;  	unsigned long realdatastart = 0;  	unsigned long text_len, data_len, bss_len, stack_len, flags; -	unsigned long len, reallen, memp = 0; -	unsigned long extra, rlim; +	unsigned long len, memp = 0; +	unsigned long memp_size, extra, rlim;  	unsigned long *reloc = 0, *rp;  	struct inode *inode;  	int i, rev, relocs = 0; @@ -543,17 +543,10 @@ static int load_flat_file(struct linux_binprm * bprm,  		}  		len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); +		len = PAGE_ALIGN(len);  		down_write(¤t->mm->mmap_sem);  		realdatastart = do_mmap(0, 0, len,  			PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); -		/* Remap to use all availabe slack region space */ -		if (realdatastart && (realdatastart < (unsigned long)-4096)) { -			reallen = kobjsize((void *)realdatastart); -			if (reallen > len) { -				realdatastart = do_mremap(realdatastart, len, -					reallen, MREMAP_FIXED, realdatastart); -			} -		}  		up_write(¤t->mm->mmap_sem);  		if (realdatastart == 0 || realdatastart >= (unsigned long)-4096) { @@ -591,21 +584,14 @@ static int load_flat_file(struct linux_binprm * bprm,  		reloc = (unsigned long *) (datapos+(ntohl(hdr->reloc_start)-text_len));  		memp = realdatastart; - +		memp_size = len;  	} else {  		len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); +		len = PAGE_ALIGN(len);  		down_write(¤t->mm->mmap_sem);  		textpos = do_mmap(0, 0, len,  			PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); -		/* Remap to use all availabe slack region space */ -		if (textpos && (textpos < (unsigned long) -4096)) { -			reallen = kobjsize((void *)textpos); -			if (reallen > len) { -				textpos = do_mremap(textpos, len, reallen, -					MREMAP_FIXED, textpos); -			} -		}  		up_write(¤t->mm->mmap_sem);  		if (!textpos  || textpos >= (unsigned long) -4096) { @@ -622,7 +608,7 @@ static int load_flat_file(struct linux_binprm * bprm,  		reloc = (unsigned long *) (textpos + ntohl(hdr->reloc_start) +  				MAX_SHARED_LIBS * sizeof(unsigned long));  		memp = textpos; - +		memp_size = len;  #ifdef CONFIG_BINFMT_ZFLAT  		/*  		 * load it all in and treat it like a RAM load from now on @@ -680,10 +666,12 @@ static int load_flat_file(struct linux_binprm * bprm,  		 * set up the brk stuff, uses any slack left in data/bss/stack  		 * allocation.  We put the brk after the bss (between the bss  		 * and stack) like other platforms. +		 * Userspace code relies on the stack pointer starting out at +		 * an address right at the end of a page.  		 */  		current->mm->start_brk = datapos + data_len + bss_len;  		current->mm->brk = (current->mm->start_brk + 3) & ~3; -		current->mm->context.end_brk = memp + kobjsize((void *) memp) - stack_len; +		current->mm->context.end_brk = memp + memp_size - stack_len;  	}  	if (flags & FLAT_FLAG_KTRACE) @@ -790,8 +778,8 @@ static int load_flat_file(struct linux_binprm * bprm,  	/* zero the BSS,  BRK and stack areas */  	memset((void*)(datapos + data_len), 0, bss_len +  -			(memp + kobjsize((void *) memp) - stack_len -	/* end brk */ -			libinfo->lib_list[id].start_brk) +		/* start brk */ +			(memp + memp_size - stack_len -		/* end brk */ +			libinfo->lib_list[id].start_brk) +	/* start brk */  			stack_len);  	return 0;  | 
