lkml.org 
[lkml]   [2013]   [Mar]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 06/21] vmcore: round up buffer size of ELF headers by PAGE_SIZE
    Date
    To satisfy mmap() page-size boundary requirement, round up buffer size
    of ELF headers by PAGE_SIZE. The resulting value becomes offset of ELF
    note segments and it's assigned in unique PT_NOTE program header
    entry.

    Also, some part that assumes past ELF headers' size is replaced by
    this new rounded-up value.

    Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
    ---

    fs/proc/vmcore.c | 16 ++++++++--------
    1 files changed, 8 insertions(+), 8 deletions(-)

    diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
    index 17e2501..dd9769d 100644
    --- a/fs/proc/vmcore.c
    +++ b/fs/proc/vmcore.c
    @@ -339,7 +339,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
    phdr.p_flags = 0;
    note_off = ehdr_ptr->e_phoff +
    (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
    - phdr.p_offset = note_off;
    + phdr.p_offset = roundup(note_off, PAGE_SIZE);
    phdr.p_vaddr = phdr.p_paddr = 0;
    phdr.p_filesz = phdr.p_memsz = phdr_sz;
    phdr.p_align = 0;
    @@ -352,6 +352,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
    /* Modify e_phnum to reflect merged headers. */
    ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1;

    + *elfsz = roundup(*elfsz, PAGE_SIZE);
    out:
    return 0;
    }
    @@ -447,7 +448,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
    phdr.p_flags = 0;
    note_off = ehdr_ptr->e_phoff +
    (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
    - phdr.p_offset = note_off;
    + phdr.p_offset = roundup(note_off, PAGE_SIZE);
    phdr.p_vaddr = phdr.p_paddr = 0;
    phdr.p_filesz = phdr.p_memsz = phdr_sz;
    phdr.p_align = 0;
    @@ -460,6 +461,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
    /* Modify e_phnum to reflect merged headers. */
    ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1;

    + *elfsz = roundup(*elfsz, PAGE_SIZE);
    out:
    return 0;
    }
    @@ -480,9 +482,8 @@ static int __init process_ptload_program_headers_elf64(char *elfptr,
    phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); /* PT_NOTE hdr */

    /* First program header is PT_NOTE header. */
    - vmcore_off = ehdr_ptr->e_phoff +
    - (ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr) +
    - phdr_ptr->p_memsz; /* Note sections */
    + vmcore_off = phdr_ptr->p_offset + roundup(phdr_ptr->p_memsz,
    + PAGE_SIZE);

    for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
    if (phdr_ptr->p_type != PT_LOAD)
    @@ -517,9 +518,8 @@ static int __init process_ptload_program_headers_elf32(char *elfptr,
    phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); /* PT_NOTE hdr */

    /* First program header is PT_NOTE header. */
    - vmcore_off = ehdr_ptr->e_phoff +
    - (ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr) +
    - phdr_ptr->p_memsz; /* Note sections */
    + vmcore_off = phdr_ptr->p_offset + roundup(phdr_ptr->p_memsz,
    + PAGE_SIZE);

    for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
    if (phdr_ptr->p_type != PT_LOAD)


    \
     
     \ /
      Last update: 2013-03-19 04:21    [W:6.661 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site