binfmt_elf: remove the set_fs(KERNEL_DS) in elf_core_dump
There is no logic in elf_core_dump itself or in the various arch helpers called from it which use uaccess routines on kernel pointers except for the file writes thate are nicely encapsulated by using __kernel_write in dump_emit. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
fa4751f454
commit
d2530b436f
|
@ -1355,7 +1355,6 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,
|
||||||
vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
|
vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
|
||||||
u32 __user *header = (u32 __user *) vma->vm_start;
|
u32 __user *header = (u32 __user *) vma->vm_start;
|
||||||
u32 word;
|
u32 word;
|
||||||
mm_segment_t fs = get_fs();
|
|
||||||
/*
|
/*
|
||||||
* Doing it this way gets the constant folded by GCC.
|
* Doing it this way gets the constant folded by GCC.
|
||||||
*/
|
*/
|
||||||
|
@ -1368,14 +1367,8 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,
|
||||||
magic.elfmag[EI_MAG1] = ELFMAG1;
|
magic.elfmag[EI_MAG1] = ELFMAG1;
|
||||||
magic.elfmag[EI_MAG2] = ELFMAG2;
|
magic.elfmag[EI_MAG2] = ELFMAG2;
|
||||||
magic.elfmag[EI_MAG3] = ELFMAG3;
|
magic.elfmag[EI_MAG3] = ELFMAG3;
|
||||||
/*
|
|
||||||
* Switch to the user "segment" for get_user(),
|
|
||||||
* then put back what elf_core_dump() had in place.
|
|
||||||
*/
|
|
||||||
set_fs(USER_DS);
|
|
||||||
if (unlikely(get_user(word, header)))
|
if (unlikely(get_user(word, header)))
|
||||||
word = 0;
|
word = 0;
|
||||||
set_fs(fs);
|
|
||||||
if (word == magic.cmp)
|
if (word == magic.cmp)
|
||||||
return PAGE_SIZE;
|
return PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
@ -2183,7 +2176,6 @@ static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
|
||||||
static int elf_core_dump(struct coredump_params *cprm)
|
static int elf_core_dump(struct coredump_params *cprm)
|
||||||
{
|
{
|
||||||
int has_dumped = 0;
|
int has_dumped = 0;
|
||||||
mm_segment_t fs;
|
|
||||||
int segs, i;
|
int segs, i;
|
||||||
size_t vma_data_size = 0;
|
size_t vma_data_size = 0;
|
||||||
struct vm_area_struct *vma, *gate_vma;
|
struct vm_area_struct *vma, *gate_vma;
|
||||||
|
@ -2232,13 +2224,10 @@ static int elf_core_dump(struct coredump_params *cprm)
|
||||||
* notes. This also sets up the file header.
|
* notes. This also sets up the file header.
|
||||||
*/
|
*/
|
||||||
if (!fill_note_info(&elf, e_phnum, &info, cprm->siginfo, cprm->regs))
|
if (!fill_note_info(&elf, e_phnum, &info, cprm->siginfo, cprm->regs))
|
||||||
goto cleanup;
|
goto end_coredump;
|
||||||
|
|
||||||
has_dumped = 1;
|
has_dumped = 1;
|
||||||
|
|
||||||
fs = get_fs();
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
|
|
||||||
offset += sizeof(elf); /* Elf header */
|
offset += sizeof(elf); /* Elf header */
|
||||||
offset += segs * sizeof(struct elf_phdr); /* Program headers */
|
offset += segs * sizeof(struct elf_phdr); /* Program headers */
|
||||||
|
|
||||||
|
@ -2366,9 +2355,6 @@ static int elf_core_dump(struct coredump_params *cprm)
|
||||||
}
|
}
|
||||||
|
|
||||||
end_coredump:
|
end_coredump:
|
||||||
set_fs(fs);
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
free_note_info(&info);
|
free_note_info(&info);
|
||||||
kfree(shdr4extnum);
|
kfree(shdr4extnum);
|
||||||
kvfree(vma_filesz);
|
kvfree(vma_filesz);
|
||||||
|
|
Loading…
Reference in New Issue