• KOSAKI Motohiro's avatar
    proc: fix pagemap_read() error case · 98bc93e5
    KOSAKI Motohiro authored
    Currently, pagemap_read() has three error and/or corner case handling
    mistake.
    
     (1) If ppos parameter is wrong, mm refcount will be leak.
     (2) If count parameter is 0, mm refcount will be leak too.
     (3) If the current task is sleeping in kmalloc() and the system
         is out of memory and oom-killer kill the proc associated task,
         mm_refcount prevent the task free its memory. then system may
         hang up.
    
    <Quote Hugh's explain why we shold call kmalloc() before get_mm()>
    
      check_mem_permission gets a reference to the mm.  If we
      __get_free_page after check_mem_permission, imagine what happens if the
      system is out of memory, and the mm we're looking at is selected for
      killing by the OOM killer: while we wait in __get_free_page for more
      memory, no memory is freed from the selected mm because it cannot reach
      exit_mmap while we hold that reference.
    
    This patch fixes the above three.
    Signed-off-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jovi Zhang <bookjovi@gmail.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Stephen Wilson <wilsons@start.ca>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    98bc93e5
task_mmu.c 26.1 KB