]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mmap: fix copy_vma() failure path
authorLiam Howlett <liam.howlett@oracle.com>
Tue, 11 Oct 2022 20:36:51 +0000 (20:36 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 12 Oct 2022 22:56:46 +0000 (15:56 -0700)
The anon vma was not unlinked and the file was not closed in the failure
path when the machine runs out of memory during the maple tree
modification.  This caused a memory leak of the anon vma chain and vma
since neither would be freed.

Link: https://lkml.kernel.org/r/20221011203621.1446507-1-Liam.Howlett@oracle.com
Fixes: 0abb9d7b6cdc ("mm: remove rb tree")
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Reported-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Tested-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/mmap.c

index 6e447544f07ddfe41ac02e778ae0bf11c78d796a..fc8581cefef71c78d6a9e34073da8fdfbe10f2ec 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -3240,6 +3240,11 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
 out_vma_link:
        if (new_vma->vm_ops && new_vma->vm_ops->close)
                new_vma->vm_ops->close(new_vma);
+
+       if (new_vma->vm_file)
+               fput(new_vma->vm_file);
+
+       unlink_anon_vmas(new_vma);
 out_free_mempol:
        mpol_put(vma_policy(new_vma));
 out_free_vma: