diff options
Diffstat (limited to 'fs/binfmt_elf.c')
| -rw-r--r-- | fs/binfmt_elf.c | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 605017eb9349..c36b1ec357fb 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1135,14 +1135,25 @@ out_free_interp:  			 * is then page aligned.  			 */  			load_bias = ELF_PAGESTART(load_bias - vaddr); -		} -		/* -		 * Calculate the entire size of the ELF mapping (total_size). -		 * (Note that load_addr_set is set to true later once the -		 * initial mapping is performed.) -		 */ -		if (!load_addr_set) { +			/* +			 * Calculate the entire size of the ELF mapping +			 * (total_size), used for the initial mapping, +			 * due to load_addr_set which is set to true later +			 * once the initial mapping is performed. +			 * +			 * Note that this is only sensible when the LOAD +			 * segments are contiguous (or overlapping). If +			 * used for LOADs that are far apart, this would +			 * cause the holes between LOADs to be mapped, +			 * running the risk of having the mapping fail, +			 * as it would be larger than the ELF file itself. +			 * +			 * As a result, only ET_DYN does this, since +			 * some ET_EXEC (e.g. ia64) may have large virtual +			 * memory holes between LOADs. +			 * +			 */  			total_size = total_mapping_size(elf_phdata,  							elf_ex->e_phnum);  			if (!total_size) {  | 
