lkml.org 
[lkml]   [2020]   [Apr]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/7] binfmt_elf_fdpic: remove the set_fs(KERNEL_DS) in elf_fdpic_core_dump
    Date
    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 <hch@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
    \
     
     \ /
      Last update: 2020-04-21 17:43    [W:3.376 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site