diff options
| -rw-r--r-- | arch/arm/kernel/process.c | 3 | ||||
| -rw-r--r-- | arch/hexagon/kernel/vdso.c | 3 | ||||
| -rw-r--r-- | arch/mips/kernel/vdso.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/vdso.c | 10 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso.c | 10 | ||||
| -rw-r--r-- | arch/sh/kernel/vsyscall/vsyscall.c | 3 | ||||
| -rw-r--r-- | arch/tile/mm/elf.c | 8 | ||||
| -rw-r--r-- | arch/unicore32/kernel/process.c | 2 | ||||
| -rw-r--r-- | arch/x86/um/mem_32.c | 8 | ||||
| -rw-r--r-- | arch/x86/um/vdso/vma.c | 3 | ||||
| -rw-r--r-- | arch/x86/vdso/vdso32-setup.c | 17 | ||||
| -rw-r--r-- | arch/x86/vdso/vma.c | 3 | ||||
| -rw-r--r-- | fs/binfmt_elf.c | 27 | ||||
| -rw-r--r-- | include/linux/mm.h | 1 | ||||
| -rw-r--r-- | mm/memory.c | 8 | 
15 files changed, 40 insertions, 69 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index c2ae3cd331f..219e4efee1a 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -533,8 +533,7 @@ int vectors_user_mapping(void)  	struct mm_struct *mm = current->mm;  	return install_special_mapping(mm, 0xffff0000, PAGE_SIZE,  				       VM_READ | VM_EXEC | -				       VM_MAYREAD | VM_MAYEXEC | -				       VM_ALWAYSDUMP | VM_RESERVED, +				       VM_MAYREAD | VM_MAYEXEC | VM_RESERVED,  				       NULL);  } diff --git a/arch/hexagon/kernel/vdso.c b/arch/hexagon/kernel/vdso.c index 16277c33308..f212a453b52 100644 --- a/arch/hexagon/kernel/vdso.c +++ b/arch/hexagon/kernel/vdso.c @@ -78,8 +78,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	/* MAYWRITE to allow gdb to COW and set breakpoints. */  	ret = install_special_mapping(mm, vdso_base, PAGE_SIZE,  				      VM_READ|VM_EXEC| -				      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -				      VM_ALWAYSDUMP, +				      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  				      &vdso_page);  	if (ret) diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c index e5cdfd603f8..0f1af58b036 100644 --- a/arch/mips/kernel/vdso.c +++ b/arch/mips/kernel/vdso.c @@ -88,8 +88,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	ret = install_special_mapping(mm, addr, PAGE_SIZE,  				      VM_READ|VM_EXEC| -				      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -				      VM_ALWAYSDUMP, +				      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  				      &vdso_page);  	if (ret) diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 7d14bb697d4..d36ee1055f8 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c @@ -263,17 +263,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	 * the "data" page of the vDSO or you'll stop getting kernel updates  	 * and your nice userland gettimeofday will be totally dead.  	 * It's fine to use that for setting breakpoints in the vDSO code -	 * pages though -	 * -	 * Make sure the vDSO gets into every core dump. -	 * Dumping its contents makes post-mortem fully interpretable later -	 * without matching up the same kernel and hardware config to see -	 * what PC values meant. +	 * pages though.  	 */  	rc = install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT,  				     VM_READ|VM_EXEC| -				     VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -				     VM_ALWAYSDUMP, +				     VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  				     vdso_pagelist);  	if (rc) {  		current->mm->context.vdso_base = 0; diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index e704a9965f9..9c80138206b 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c @@ -241,17 +241,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	 * on the "data" page of the vDSO or you'll stop getting kernel  	 * updates and your nice userland gettimeofday will be totally dead.  	 * It's fine to use that for setting breakpoints in the vDSO code -	 * pages though -	 * -	 * Make sure the vDSO gets into every core dump. -	 * Dumping its contents makes post-mortem fully interpretable later -	 * without matching up the same kernel and hardware config to see -	 * what PC values meant. +	 * pages though.  	 */  	rc = install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT,  				     VM_READ|VM_EXEC| -				     VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -				     VM_ALWAYSDUMP, +				     VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  				     vdso_pagelist);  	if (rc)  		current->mm->context.vdso_base = 0; diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c index 1d6d51a1ce7..5ca579720a0 100644 --- a/arch/sh/kernel/vsyscall/vsyscall.c +++ b/arch/sh/kernel/vsyscall/vsyscall.c @@ -73,8 +73,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	ret = install_special_mapping(mm, addr, PAGE_SIZE,  				      VM_READ | VM_EXEC | -				      VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC | -				      VM_ALWAYSDUMP, +				      VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,  				      syscall_pages);  	if (unlikely(ret))  		goto up_fail; diff --git a/arch/tile/mm/elf.c b/arch/tile/mm/elf.c index 55e58e93bfc..1a00fb64fc8 100644 --- a/arch/tile/mm/elf.c +++ b/arch/tile/mm/elf.c @@ -117,17 +117,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,  	/*  	 * MAYWRITE to allow gdb to COW and set breakpoints -	 * -	 * Make sure the vDSO gets into every core dump.  Dumping its -	 * contents makes post-mortem fully interpretable later -	 * without matching up the same kernel and hardware config to -	 * see what PC values meant.  	 */  	vdso_base = VDSO_BASE;  	retval = install_special_mapping(mm, vdso_base, PAGE_SIZE,  					 VM_READ|VM_EXEC| -					 VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -					 VM_ALWAYSDUMP, +					 VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  					 vdso_pages);  #ifndef __tilegx__ diff --git a/arch/unicore32/kernel/process.c b/arch/unicore32/kernel/process.c index 52edc2b6287..432b4291f37 100644 --- a/arch/unicore32/kernel/process.c +++ b/arch/unicore32/kernel/process.c @@ -381,7 +381,7 @@ int vectors_user_mapping(void)  	return install_special_mapping(mm, 0xffff0000, PAGE_SIZE,  				       VM_READ | VM_EXEC |  				       VM_MAYREAD | VM_MAYEXEC | -				       VM_ALWAYSDUMP | VM_RESERVED, +				       VM_RESERVED,  				       NULL);  } diff --git a/arch/x86/um/mem_32.c b/arch/x86/um/mem_32.c index 639900a6fde..f40281e5d6a 100644 --- a/arch/x86/um/mem_32.c +++ b/arch/x86/um/mem_32.c @@ -23,14 +23,6 @@ static int __init gate_vma_init(void)  	gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;  	gate_vma.vm_page_prot = __P101; -	/* -	 * Make sure the vDSO gets into every core dump. -	 * Dumping its contents makes post-mortem fully interpretable later -	 * without matching up the same kernel and hardware config to see -	 * what PC values meant. -	 */ -	gate_vma.vm_flags |= VM_ALWAYSDUMP; -  	return 0;  }  __initcall(gate_vma_init); diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c index 91f4ec9a0a5..af91901babb 100644 --- a/arch/x86/um/vdso/vma.c +++ b/arch/x86/um/vdso/vma.c @@ -64,8 +64,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE,  		VM_READ|VM_EXEC| -		VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -		VM_ALWAYSDUMP, +		VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  		vdsop);  	up_write(&mm->mmap_sem); diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c index 468d591dde3..a944020fa85 100644 --- a/arch/x86/vdso/vdso32-setup.c +++ b/arch/x86/vdso/vdso32-setup.c @@ -250,13 +250,7 @@ static int __init gate_vma_init(void)  	gate_vma.vm_end = FIXADDR_USER_END;  	gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;  	gate_vma.vm_page_prot = __P101; -	/* -	 * Make sure the vDSO gets into every core dump. -	 * Dumping its contents makes post-mortem fully interpretable later -	 * without matching up the same kernel and hardware config to see -	 * what PC values meant. -	 */ -	gate_vma.vm_flags |= VM_ALWAYSDUMP; +  	return 0;  } @@ -343,17 +337,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	if (compat_uses_vma || !compat) {  		/*  		 * MAYWRITE to allow gdb to COW and set breakpoints -		 * -		 * Make sure the vDSO gets into every core dump. -		 * Dumping its contents makes post-mortem fully -		 * interpretable later without matching up the same -		 * kernel and hardware config to see what PC values -		 * meant.  		 */  		ret = install_special_mapping(mm, addr, PAGE_SIZE,  					      VM_READ|VM_EXEC| -					      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -					      VM_ALWAYSDUMP, +					      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  					      vdso32_pages);  		if (ret) diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 153407c35b7..17e18279649 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c @@ -124,8 +124,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)  	ret = install_special_mapping(mm, addr, vdso_size,  				      VM_READ|VM_EXEC| -				      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| -				      VM_ALWAYSDUMP, +				      VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,  				      vdso_pages);  	if (ret) {  		current->mm->context.vdso = NULL; diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 81878b78c9d..b64be5b5ac2 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1093,6 +1093,29 @@ out:   */  /* + * The purpose of always_dump_vma() is to make sure that special kernel mappings + * that are useful for post-mortem analysis are included in every core dump. + * In that way we ensure that the core dump is fully interpretable later + * without matching up the same kernel and hardware config to see what PC values + * meant. These special mappings include - vDSO, vsyscall, and other + * architecture specific mappings + */ +static bool always_dump_vma(struct vm_area_struct *vma) +{ +	/* Any vsyscall mappings? */ +	if (vma == get_gate_vma(vma->vm_mm)) +		return true; +	/* +	 * arch_vma_name() returns non-NULL for special architecture mappings, +	 * such as vDSO sections. +	 */ +	if (arch_vma_name(vma)) +		return true; + +	return false; +} + +/*   * Decide what to dump of a segment, part, all or none.   */  static unsigned long vma_dump_size(struct vm_area_struct *vma, @@ -1100,8 +1123,8 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,  {  #define FILTER(type)	(mm_flags & (1UL << MMF_DUMP_##type)) -	/* The vma can be set up to tell us the answer directly.  */ -	if (vma->vm_flags & VM_ALWAYSDUMP) +	/* always dump the vdso and vsyscall sections */ +	if (always_dump_vma(vma))  		goto whole;  	/* Hugetlb memory check */ diff --git a/include/linux/mm.h b/include/linux/mm.h index 7330742e797..2de2ddba51d 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -111,7 +111,6 @@ extern unsigned int kobjsize(const void *objp);  #define VM_HUGEPAGE	0x01000000	/* MADV_HUGEPAGE marked this vma */  #endif  #define VM_INSERTPAGE	0x02000000	/* The vma has had "vm_insert_page()" done on it */ -#define VM_ALWAYSDUMP	0x04000000	/* Always include in core dumps */  #define VM_CAN_NONLINEAR 0x08000000	/* Has ->fault & does nonlinear pages */  #define VM_MIXEDMAP	0x10000000	/* Can contain "struct page" and pure PFN pages */ diff --git a/mm/memory.c b/mm/memory.c index 3416b6e018d..6105f475fa8 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3623,13 +3623,7 @@ static int __init gate_vma_init(void)  	gate_vma.vm_end = FIXADDR_USER_END;  	gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;  	gate_vma.vm_page_prot = __P101; -	/* -	 * Make sure the vDSO gets into every core dump. -	 * Dumping its contents makes post-mortem fully interpretable later -	 * without matching up the same kernel and hardware config to see -	 * what PC values meant. -	 */ -	gate_vma.vm_flags |= VM_ALWAYSDUMP; +  	return 0;  }  __initcall(gate_vma_init);  |