There is no logic in elf_fdpic_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 <h...@lst.de>
---
 fs/binfmt_elf_fdpic.c | 31 ++++++++++++-------------------
 1 file changed, 12 insertions(+), 19 deletions(-)

diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index 240f66663543..c62c17a5c34a 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -1549,7 +1549,6 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
 {
 #define        NUM_NOTES       6
        int has_dumped = 0;
-       mm_segment_t fs;
        int segs;
        int i;
        struct vm_area_struct *vma;
@@ -1678,9 +1677,6 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
                          "LINUX", ELF_CORE_XFPREG_TYPE, sizeof(*xfpu), xfpu);
 #endif
 
-       fs = get_fs();
-       set_fs(KERNEL_DS);
-
        offset += sizeof(*elf);                         /* Elf header */
        offset += segs * sizeof(struct elf_phdr);       /* Program headers */
 
@@ -1695,7 +1691,7 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
 
                phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
                if (!phdr4note)
-                       goto end_coredump;
+                       goto cleanup;
 
                fill_elf_note_phdr(phdr4note, sz, offset);
                offset += sz;
@@ -1711,17 +1707,17 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
        if (e_phnum == PN_XNUM) {
                shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
                if (!shdr4extnum)
-                       goto end_coredump;
+                       goto cleanup;
                fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
        }
 
        offset = dataoff;
 
        if (!dump_emit(cprm, elf, sizeof(*elf)))
-               goto end_coredump;
+               goto cleanup;
 
        if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
-               goto end_coredump;
+               goto cleanup;
 
        /* write program headers for segments dump */
        for (vma = current->mm->mmap; vma; vma = vma->vm_next) {
@@ -1745,16 +1741,16 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
                phdr.p_align = ELF_EXEC_PAGESIZE;
 
                if (!dump_emit(cprm, &phdr, sizeof(phdr)))
-                       goto end_coredump;
+                       goto cleanup;
        }
 
        if (!elf_core_write_extra_phdrs(cprm, offset))
-               goto end_coredump;
+               goto cleanup;
 
        /* write out the notes section */
        for (i = 0; i < numnote; i++)
                if (!writenote(notes + i, cprm))
-                       goto end_coredump;
+                       goto cleanup;
 
        /* write out the thread status notes section */
        list_for_each(t, &thread_list) {
@@ -1763,21 +1759,21 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
 
                for (i = 0; i < tmp->num_notes; i++)
                        if (!writenote(&tmp->notes[i], cprm))
-                               goto end_coredump;
+                               goto cleanup;
        }
 
        if (!dump_skip(cprm, dataoff - cprm->pos))
-               goto end_coredump;
+               goto cleanup;
 
        if (!elf_fdpic_dump_segments(cprm))
-               goto end_coredump;
+               goto cleanup;
 
        if (!elf_core_write_extra_data(cprm))
-               goto end_coredump;
+               goto cleanup;
 
        if (e_phnum == PN_XNUM) {
                if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
-                       goto end_coredump;
+                       goto cleanup;
        }
 
        if (cprm->file->f_pos != offset) {
@@ -1787,9 +1783,6 @@ static int elf_fdpic_core_dump(struct coredump_params 
*cprm)
                       cprm->file->f_pos, offset);
        }
 
-end_coredump:
-       set_fs(fs);
-
 cleanup:
        while (!list_empty(&thread_list)) {
                struct list_head *tmp = thread_list.next;
-- 
2.26.1

Reply via email to