mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	binfmt_flat: don't offset the data start
Ever since the initial commit of the binfmt_flat shared library support back in the bitkeeper days we've offset the actual in-memory .data start by one field per possible shared library, or 1 in case shared library support isn't enabled. I can't find anything in the loader that actually makes use of it, nor was it present before shared library support it. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
This commit is contained in:
		
							parent
							
								
									a445d988b4
								
							
						
					
					
						commit
						a2357223c5
					
				
					 1 changed files with 8 additions and 12 deletions
				
			
		|  | @ -573,7 +573,7 @@ static int load_flat_file(struct linux_binprm *bprm, | |||
| 			goto err; | ||||
| 		} | ||||
| 
 | ||||
| 		len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); | ||||
| 		len = data_len + extra; | ||||
| 		len = PAGE_ALIGN(len); | ||||
| 		realdatastart = vm_mmap(NULL, 0, len, | ||||
| 			PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); | ||||
|  | @ -587,9 +587,7 @@ static int load_flat_file(struct linux_binprm *bprm, | |||
| 			vm_munmap(textpos, text_len); | ||||
| 			goto err; | ||||
| 		} | ||||
| 		datapos = ALIGN(realdatastart + | ||||
| 				MAX_SHARED_LIBS * sizeof(unsigned long), | ||||
| 				FLAT_DATA_ALIGN); | ||||
| 		datapos = ALIGN(realdatastart, FLAT_DATA_ALIGN); | ||||
| 
 | ||||
| 		pr_debug("Allocated data+bss+stack (%u bytes): %lx\n", | ||||
| 			 data_len + bss_len + stack_len, datapos); | ||||
|  | @ -619,7 +617,7 @@ static int load_flat_file(struct linux_binprm *bprm, | |||
| 		memp_size = len; | ||||
| 	} else { | ||||
| 
 | ||||
| 		len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(u32); | ||||
| 		len = text_len + data_len + extra; | ||||
| 		len = PAGE_ALIGN(len); | ||||
| 		textpos = vm_mmap(NULL, 0, len, | ||||
| 			PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); | ||||
|  | @ -634,9 +632,7 @@ static int load_flat_file(struct linux_binprm *bprm, | |||
| 		} | ||||
| 
 | ||||
| 		realdatastart = textpos + ntohl(hdr->data_start); | ||||
| 		datapos = ALIGN(realdatastart + | ||||
| 				MAX_SHARED_LIBS * sizeof(u32), | ||||
| 				FLAT_DATA_ALIGN); | ||||
| 		datapos = ALIGN(realdatastart, FLAT_DATA_ALIGN); | ||||
| 
 | ||||
| 		reloc = (__be32 __user *) | ||||
| 			(datapos + (ntohl(hdr->reloc_start) - text_len)); | ||||
|  | @ -653,8 +649,9 @@ static int load_flat_file(struct linux_binprm *bprm, | |||
| 					 (text_len + full_data | ||||
| 						  - sizeof(struct flat_hdr)), | ||||
| 					 0); | ||||
| 			memmove((void *) datapos, (void *) realdatastart, | ||||
| 					full_data); | ||||
| 			if (datapos != realdatastart) | ||||
| 				memmove((void *)datapos, (void *)realdatastart, | ||||
| 						full_data); | ||||
| #else | ||||
| 			/*
 | ||||
| 			 * This is used on MMU systems mainly for testing. | ||||
|  | @ -710,8 +707,7 @@ static int load_flat_file(struct linux_binprm *bprm, | |||
| 		if (IS_ERR_VALUE(result)) { | ||||
| 			ret = result; | ||||
| 			pr_err("Unable to read code+data+bss, errno %d\n", ret); | ||||
| 			vm_munmap(textpos, text_len + data_len + extra + | ||||
| 				MAX_SHARED_LIBS * sizeof(u32)); | ||||
| 			vm_munmap(textpos, text_len + data_len + extra); | ||||
| 			goto err; | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Christoph Hellwig
						Christoph Hellwig