Commit 225a3f53 authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by Linus Torvalds

fs/binfmt_elf.c: coredump: allocate core ELF header on stack

Comment says ELF header is "too large to be on stack".  64 bytes on
64-bit is not large by any means.

Link: http://lkml.kernel.org/r/20191222143850.GA24341@avx2Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 18676ffc
...@@ -2186,7 +2186,7 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -2186,7 +2186,7 @@ static int elf_core_dump(struct coredump_params *cprm)
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;
struct elfhdr *elf = NULL; struct elfhdr elf;
loff_t offset = 0, dataoff; loff_t offset = 0, dataoff;
struct elf_note_info info = { }; struct elf_note_info info = { };
struct elf_phdr *phdr4note = NULL; struct elf_phdr *phdr4note = NULL;
...@@ -2207,10 +2207,6 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -2207,10 +2207,6 @@ static int elf_core_dump(struct coredump_params *cprm)
* exists while dumping the mm->vm_next areas to the core file. * exists while dumping the mm->vm_next areas to the core file.
*/ */
/* alloc memory for large data structures: too large to be on stack */
elf = kmalloc(sizeof(*elf), GFP_KERNEL);
if (!elf)
goto out;
/* /*
* The number of segs are recored into ELF header as 16bit value. * The number of segs are recored into ELF header as 16bit value.
* Please check DEFAULT_MAX_MAP_COUNT definition when you modify here. * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
...@@ -2234,7 +2230,7 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -2234,7 +2230,7 @@ static int elf_core_dump(struct coredump_params *cprm)
* Collect all the non-memory information about the process for the * Collect all the non-memory information about the process for the
* 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 cleanup;
has_dumped = 1; has_dumped = 1;
...@@ -2242,7 +2238,7 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -2242,7 +2238,7 @@ static int elf_core_dump(struct coredump_params *cprm)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); 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 */
/* Write notes phdr entry */ /* Write notes phdr entry */
...@@ -2285,12 +2281,12 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -2285,12 +2281,12 @@ static int elf_core_dump(struct coredump_params *cprm)
shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL); shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
if (!shdr4extnum) if (!shdr4extnum)
goto end_coredump; goto end_coredump;
fill_extnum_info(elf, shdr4extnum, e_shoff, segs); fill_extnum_info(&elf, shdr4extnum, e_shoff, segs);
} }
offset = dataoff; offset = dataoff;
if (!dump_emit(cprm, elf, sizeof(*elf))) if (!dump_emit(cprm, &elf, sizeof(elf)))
goto end_coredump; goto end_coredump;
if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note))) if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
...@@ -2374,8 +2370,6 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -2374,8 +2370,6 @@ static int elf_core_dump(struct coredump_params *cprm)
kfree(shdr4extnum); kfree(shdr4extnum);
kvfree(vma_filesz); kvfree(vma_filesz);
kfree(phdr4note); kfree(phdr4note);
kfree(elf);
out:
return has_dumped; return has_dumped;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment