Skip to content

Commit

Permalink
mm/mlock: set the correct prev on failure
Browse files Browse the repository at this point in the history
After commit 94d7d92 ("mm: abstract the vma_merge()/split_vma()
pattern for mprotect() et al."), if vma_modify_flags() return error, the
vma is set to an error code.  This will lead to an invalid prev be
returned.

Generally this shouldn't matter as the caller should treat an error as
indicating state is now invalidated, however unfortunately
apply_mlockall_flags() does not check for errors and assumes that
mlock_fixup() correctly maintains prev even if an error were to occur.

This patch fixes that assumption.

[[email protected]: provide a better fix and rephrase the log]
Link: https://lkml.kernel.org/r/[email protected]
Fixes: 94d7d92 ("mm: abstract the vma_merge()/split_vma() pattern for mprotect() et al.")
Signed-off-by: Wei Yang <[email protected]>
Reviewed-by: Lorenzo Stoakes <[email protected]>
Reviewed-by: Liam R. Howlett <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: Jann Horn <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
  • Loading branch information
RichardWeiYang authored and akpm00 committed Nov 7, 2024
1 parent cb6fcef commit faa242b
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions mm/mlock.c
Original file line number Diff line number Diff line change
Expand Up @@ -725,14 +725,17 @@ static int apply_mlockall_flags(int flags)
}

for_each_vma(vmi, vma) {
int error;
vm_flags_t newflags;

newflags = vma->vm_flags & ~VM_LOCKED_MASK;
newflags |= to_add;

/* Ignore errors */
mlock_fixup(&vmi, vma, &prev, vma->vm_start, vma->vm_end,
newflags);
error = mlock_fixup(&vmi, vma, &prev, vma->vm_start, vma->vm_end,
newflags);
/* Ignore errors, but prev needs fixing up. */
if (error)
prev = vma;
cond_resched();
}
out:
Expand Down

0 comments on commit faa242b

Please sign in to comment.