Skip to content

Commit 2697dd8

Browse files
Lorenzo Stoakes (Oracle)akpm00
authored andcommitted
mm/mseal: update VMA end correctly on merge
Previously we stored the end of the current VMA in curr_end, and then upon iterating to the next VMA updated curr_start to curr_end to advance to the next VMA. However, this doesn't take into account the fact that a VMA might be updated due to a merge by vma_modify_flags(), which can result in curr_end being stale and thus, upon setting curr_start to curr_end, ending up with an incorrect curr_start on the next iteration. Resolve the issue by setting curr_end to vma->vm_end unconditionally to ensure this value remains updated should this occur. While we're here, eliminate this entire class of bug by simply setting const curr_[start/end] to be clamped to the input range and VMAs, which also happens to simplify the logic. Link: https://lkml.kernel.org/r/[email protected] Fixes: 6c2da14 ("mm/mseal: rework mseal apply logic") Signed-off-by: Lorenzo Stoakes (Oracle) <[email protected]> Reported-by: Antonius <[email protected]> Closes: https://lore.kernel.org/linux-mm/CAK8a0jwWGj9-SgFk0yKFh7i8jMkwKm5b0ao9=kmXWjO54veX2g@mail.gmail.com/ Suggested-by: David Hildenbrand (ARM) <[email protected]> Acked-by: Vlastimil Babka (SUSE) <[email protected]> Reviewed-by: Pedro Falcato <[email protected]> Acked-by: David Hildenbrand (Arm) <[email protected]> Cc: Jann Horn <[email protected]> Cc: Jeff Xu <[email protected]> Cc: Liam Howlett <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 2598ab9 commit 2697dd8

1 file changed

Lines changed: 1 addition & 2 deletions

File tree

mm/mseal.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ static int mseal_apply(struct mm_struct *mm,
5656
unsigned long start, unsigned long end)
5757
{
5858
struct vm_area_struct *vma, *prev;
59-
unsigned long curr_start = start;
6059
VMA_ITERATOR(vmi, mm, start);
6160

6261
/* We know there are no gaps so this will be non-NULL. */
@@ -66,6 +65,7 @@ static int mseal_apply(struct mm_struct *mm,
6665
prev = vma;
6766

6867
for_each_vma_range(vmi, vma, end) {
68+
const unsigned long curr_start = MAX(vma->vm_start, start);
6969
const unsigned long curr_end = MIN(vma->vm_end, end);
7070

7171
if (!(vma->vm_flags & VM_SEALED)) {
@@ -79,7 +79,6 @@ static int mseal_apply(struct mm_struct *mm,
7979
}
8080

8181
prev = vma;
82-
curr_start = curr_end;
8382
}
8483

8584
return 0;

0 commit comments

Comments
 (0)