On 11/28/20 4:45 PM, Nadav Amit wrote: > From: Nadav Amit <namit@xxxxxxxxxx> > > It is possible to get an EINVAL error instead of EPERM if the following > test vm_flags have VM_UFFD_WP but do not have VM_MAYWRITE, as "ret" is > overwritten since commit cab350afcbc9 ("userfaultfd: hugetlbfs: allow > registration of ranges containing huge pages"). > > Fix it. > > Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx> > Cc: Jens Axboe <axboe@xxxxxxxxx> > Cc: Andrea Arcangeli <aarcange@xxxxxxxxxx> > Cc: Peter Xu <peterx@xxxxxxxxxx> > Cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> > Cc: io-uring@xxxxxxxxxxxxxxx > Cc: linux-fsdevel@xxxxxxxxxxxxxxx > Cc: linux-kernel@xxxxxxxxxxxxxxx > Cc: linux-mm@xxxxxxxxx > Fixes: cab350afcbc9 ("userfaultfd: hugetlbfs: allow registration of ranges containing huge pages") > Signed-off-by: Nadav Amit <namit@xxxxxxxxxx> > --- > fs/userfaultfd.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c > index 000b457ad087..c8ed4320370e 100644 > --- a/fs/userfaultfd.c > +++ b/fs/userfaultfd.c > @@ -1364,6 +1364,7 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx, > if (end & (vma_hpagesize - 1)) > goto out_unlock; > } > + ret = -EPERM; > if ((vm_flags & VM_UFFD_WP) && !(cur->vm_flags & VM_MAYWRITE)) > goto out_unlock; > Thanks! We should return EPERM in that case. However, the check for VM_UFFD_WP && !VM_MAYWRITE went in after commit cab350afcbc9. I think it is more accurate to say that the issue was introduced with commit 63b2d4174c4a ("Introduce the new uffd-wp APIs for userspace."). The convention in userfaultfd_register() is that the return code is set before testing condition which could cause return. Therefore, when 63b2d4174c4a added the VM_UFFD_WP && !VM_MAYWRITE check, it should have also added the 'ret = -EPERM;' statement. With changes to commit message and Fixes tag, Reviewed-by: Mike Kravetz <mike.kravetz@xxxxxxxxxx> -- Mike Kravetz