]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
vmcore: round up buffer size of ELF headers by PAGE_SIZE
authorHATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Wed, 20 Mar 2013 04:08:34 +0000 (15:08 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 20 Mar 2013 04:23:28 +0000 (15:23 +1100)
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>
Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/proc/vmcore.c

index 17e2501151a232df8cfa6a3281bff5c9b84acf3e..dd9769df72d702bf25ddac446876f30072b080ba 100644 (file)
@@ -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)