Skip to content

Commit a3a1a6e

Browse files
chenjieBrian Maly
authored andcommitted
mm/madvise.c: fix madvise() infinite loop under special circumstances
MADVISE_WILLNEED has always been a noop for DAX (formerly XIP) mappings. Unfortunately madvise_willneed() doesn't communicate this information properly to the generic madvise syscall implementation. The calling convention is quite subtle there. madvise_vma() is supposed to either return an error or update &prev otherwise the main loop will never advance to the next vma and it will keep looping for ever without a way to get out of the kernel. It seems this has been broken since introduction. Nobody has noticed because nobody seems to be using MADVISE_WILLNEED on these DAX mappings. [[email protected]: rewrite changelog] Link: http://lkml.kernel.org/r/[email protected] Fixes: fe77ba6 ("[PATCH] xip: madvice/fadvice: execute in place") Signed-off-by: chenjie <[email protected]> Signed-off-by: guoxuenan <[email protected]> Acked-by: Michal Hocko <[email protected]> Cc: Minchan Kim <[email protected]> Cc: zhangyi (F) <[email protected]> Cc: Miao Xie <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Shaohua Li <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Kirill A. Shutemov <[email protected]> Cc: David Rientjes <[email protected]> Cc: Anshuman Khandual <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Carsten Otte <[email protected]> Cc: Dan Williams <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]> (cherry picked from commit 6ea8d95) Orabug: 29925610 CVE: CVE-2017-18208 Reviewed-by: Somasundaram Krishnasamy <[email protected]> Signed-off-by: Allen Pais <[email protected]> Signed-off-by: Brian Maly <[email protected]>
1 parent e86a9e6 commit a3a1a6e

File tree

1 file changed

+1
-3
lines changed

1 file changed

+1
-3
lines changed

mm/madvise.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,15 +222,14 @@ static long madvise_willneed(struct vm_area_struct *vma,
222222
{
223223
struct file *file = vma->vm_file;
224224

225+
*prev = vma;
225226
#ifdef CONFIG_SWAP
226227
if (!file) {
227-
*prev = vma;
228228
force_swapin_readahead(vma, start, end);
229229
return 0;
230230
}
231231

232232
if (shmem_mapping(file->f_mapping)) {
233-
*prev = vma;
234233
force_shm_swapin_readahead(vma, start, end,
235234
file->f_mapping);
236235
return 0;
@@ -245,7 +244,6 @@ static long madvise_willneed(struct vm_area_struct *vma,
245244
return 0;
246245
}
247246

248-
*prev = vma;
249247
start = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
250248
if (end > vma->vm_end)
251249
end = vma->vm_end;

0 commit comments

Comments
 (0)