mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	elfcore: Add a cprm parameter to elf_core_extra_{phdrs,data_size}
A subsequent fix for arm64 will use this parameter to parse the vma
information from the snapshot created by dump_vma_snapshot() rather than
traversing the vma list without the mmap_lock.
Fixes: 6dd8b1a0b6 ("arm64: mte: Dump the MTE tags in the core file")
Cc: <stable@vger.kernel.org> # 5.18.x
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Reported-by: Seth Jenkins <sethjenkins@google.com>
Suggested-by: Seth Jenkins <sethjenkins@google.com>
Cc: Will Deacon <will@kernel.org>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20221222181251.1345752-3-catalin.marinas@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									736eedc974
								
							
						
					
					
						commit
						19e183b545
					
				
					 6 changed files with 14 additions and 14 deletions
				
			
		|  | @ -76,7 +76,7 @@ static int mte_dump_tag_range(struct coredump_params *cprm, | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| Elf_Half elf_core_extra_phdrs(void) | ||||
| Elf_Half elf_core_extra_phdrs(struct coredump_params *cprm) | ||||
| { | ||||
| 	struct vm_area_struct *vma; | ||||
| 	int vma_count = 0; | ||||
|  | @ -113,7 +113,7 @@ int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset) | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| size_t elf_core_extra_data_size(void) | ||||
| size_t elf_core_extra_data_size(struct coredump_params *cprm) | ||||
| { | ||||
| 	struct vm_area_struct *vma; | ||||
| 	size_t data_size = 0; | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <asm/elf.h> | ||||
| 
 | ||||
| 
 | ||||
| Elf64_Half elf_core_extra_phdrs(void) | ||||
| Elf64_Half elf_core_extra_phdrs(struct coredump_params *cprm) | ||||
| { | ||||
| 	return GATE_EHDR->e_phnum; | ||||
| } | ||||
|  | @ -60,7 +60,7 @@ int elf_core_write_extra_data(struct coredump_params *cprm) | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| size_t elf_core_extra_data_size(void) | ||||
| size_t elf_core_extra_data_size(struct coredump_params *cprm) | ||||
| { | ||||
| 	const struct elf_phdr *const gate_phdrs = | ||||
| 		(const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <asm/elf.h> | ||||
| 
 | ||||
| 
 | ||||
| Elf32_Half elf_core_extra_phdrs(void) | ||||
| Elf32_Half elf_core_extra_phdrs(struct coredump_params *cprm) | ||||
| { | ||||
| 	return vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0; | ||||
| } | ||||
|  | @ -60,7 +60,7 @@ int elf_core_write_extra_data(struct coredump_params *cprm) | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| size_t elf_core_extra_data_size(void) | ||||
| size_t elf_core_extra_data_size(struct coredump_params *cprm) | ||||
| { | ||||
| 	if ( vsyscall_ehdr ) { | ||||
| 		const struct elfhdr *const ehdrp = | ||||
|  |  | |||
|  | @ -2034,7 +2034,7 @@ static int elf_core_dump(struct coredump_params *cprm) | |||
| 	 * The number of segs are recored into ELF header as 16bit value. | ||||
| 	 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here. | ||||
| 	 */ | ||||
| 	segs = cprm->vma_count + elf_core_extra_phdrs(); | ||||
| 	segs = cprm->vma_count + elf_core_extra_phdrs(cprm); | ||||
| 
 | ||||
| 	/* for notes section */ | ||||
| 	segs++; | ||||
|  | @ -2074,7 +2074,7 @@ static int elf_core_dump(struct coredump_params *cprm) | |||
| 	dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE); | ||||
| 
 | ||||
| 	offset += cprm->vma_data_size; | ||||
| 	offset += elf_core_extra_data_size(); | ||||
| 	offset += elf_core_extra_data_size(cprm); | ||||
| 	e_shoff = offset; | ||||
| 
 | ||||
| 	if (e_phnum == PN_XNUM) { | ||||
|  |  | |||
|  | @ -1509,7 +1509,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm) | |||
| 	tmp->next = thread_list; | ||||
| 	thread_list = tmp; | ||||
| 
 | ||||
| 	segs = cprm->vma_count + elf_core_extra_phdrs(); | ||||
| 	segs = cprm->vma_count + elf_core_extra_phdrs(cprm); | ||||
| 
 | ||||
| 	/* for notes section */ | ||||
| 	segs++; | ||||
|  | @ -1555,7 +1555,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm) | |||
| 	dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE); | ||||
| 
 | ||||
| 	offset += cprm->vma_data_size; | ||||
| 	offset += elf_core_extra_data_size(); | ||||
| 	offset += elf_core_extra_data_size(cprm); | ||||
| 	e_shoff = offset; | ||||
| 
 | ||||
| 	if (e_phnum == PN_XNUM) { | ||||
|  |  | |||
|  | @ -105,14 +105,14 @@ int elf_core_copy_task_fpregs(struct task_struct *t, elf_fpregset_t *fpu); | |||
|  * Dumping its extra ELF program headers includes all the other information | ||||
|  * a debugger needs to easily find how the gate DSO was being used. | ||||
|  */ | ||||
| extern Elf_Half elf_core_extra_phdrs(void); | ||||
| extern Elf_Half elf_core_extra_phdrs(struct coredump_params *cprm); | ||||
| extern int | ||||
| elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset); | ||||
| extern int | ||||
| elf_core_write_extra_data(struct coredump_params *cprm); | ||||
| extern size_t elf_core_extra_data_size(void); | ||||
| extern size_t elf_core_extra_data_size(struct coredump_params *cprm); | ||||
| #else | ||||
| static inline Elf_Half elf_core_extra_phdrs(void) | ||||
| static inline Elf_Half elf_core_extra_phdrs(struct coredump_params *cprm) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -127,7 +127,7 @@ static inline int elf_core_write_extra_data(struct coredump_params *cprm) | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static inline size_t elf_core_extra_data_size(void) | ||||
| static inline size_t elf_core_extra_data_size(struct coredump_params *cprm) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Catalin Marinas
						Catalin Marinas