vmcore: allow user process to remap ELF note segment buffer
authorHATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Wed, 3 Jul 2013 22:02:21 +0000 (15:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Jul 2013 23:07:30 +0000 (16:07 -0700)
Now ELF note segment has been copied in the buffer on vmalloc memory.
To allow user process to remap the ELF note segment buffer with
remap_vmalloc_page, the corresponding VM area object has to have
VM_USERMAP flag set.

[akpm@linux-foundation.org: use the conventional comment layout]
Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Atsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp>
Cc: Lisa Mitchell <lisa.mitchell@hp.com>
Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/proc/vmcore.c

index 9b9270eb0599938303490f45eac87e26f6ff6b44..1082492e02fca4b9e006697fa64c744334c6bab1 100644 (file)
@@ -369,6 +369,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
        Elf64_Ehdr *ehdr_ptr;
        Elf64_Phdr phdr;
        u64 phdr_sz = 0, note_off;
+       struct vm_struct *vm;
 
        ehdr_ptr = (Elf64_Ehdr *)elfptr;
 
@@ -385,6 +386,14 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
        if (!*notes_buf)
                return -ENOMEM;
 
+       /*
+        * Allow users to remap ELF note segment buffer on vmalloc memory using
+        * remap_vmalloc_range.()
+        */
+       vm = find_vm_area(*notes_buf);
+       BUG_ON(!vm);
+       vm->flags |= VM_USERMAP;
+
        rc = copy_notes_elf64(ehdr_ptr, *notes_buf);
        if (rc < 0)
                return rc;
@@ -548,6 +557,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
        Elf32_Ehdr *ehdr_ptr;
        Elf32_Phdr phdr;
        u64 phdr_sz = 0, note_off;
+       struct vm_struct *vm;
 
        ehdr_ptr = (Elf32_Ehdr *)elfptr;
 
@@ -564,6 +574,14 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
        if (!*notes_buf)
                return -ENOMEM;
 
+       /*
+        * Allow users to remap ELF note segment buffer on vmalloc memory using
+        * remap_vmalloc_range()
+        */
+       vm = find_vm_area(*notes_buf);
+       BUG_ON(!vm);
+       vm->flags |= VM_USERMAP;
+
        rc = copy_notes_elf32(ehdr_ptr, *notes_buf);
        if (rc < 0)
                return rc;