Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp8982264ybi; Tue, 23 Jul 2019 19:25:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqxgpFoUOoufIV6+3IEIlCQ4sww/NZTkcgddhOvSGqdgqL7jtxcXeasPdQwVlPBjYVOznrH5 X-Received: by 2002:a17:90a:6546:: with SMTP id f6mr39139872pjs.11.1563935136545; Tue, 23 Jul 2019 19:25:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563935136; cv=none; d=google.com; s=arc-20160816; b=eGz9E5kq4x4f+IFNmM67Q7yI7HSzGWJfJtglbo7CgG9gRZiSm/UYnW3OP30dVwFUyJ TUHSUoxSDOYRnMv9bJ9AHa4ZSVcbw3Hgak2/vBGBuwsj6vq/NgTeiBfucw1Qj5BZur7O j8st3fjqOWH1NCa91V2aMst2IwvVXQrJjJ+7+Fy9HJqo5w+7WLTmG56Y2xATs4ZUjGrx S/Enbpr6IJuNkjxq+H9gnMPkLTbGjNmH3zsw6iFjqYTDzEb9Du7DfNTAgBq8EuoSF/8f Phpm9EPSwUAge14gxh4TgCYiCwA4oDSBkLeZrnqAElC6p6OGotzQrQCUr0iZdio98ng5 +4xw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=mo6ZyD7PJiiiTnkBfnFT33xmRSSjLb2erTRpgEGb4jw=; b=j2KMP7TFjM8FScplR3ZX7QiCUkpGB4lhDhA7iCwkEziad4MOWV/psFaQX/Y65/x3rW j3VDk1CuLmJtvsyHpwdp+KqKG3vZc9YyLstPe1ICbSa5HB/n7aRt/JZooopIQUSIFcN0 XiwTpJT+kQaiwJ/TjrmhKqSOykImEozOOn6ihnIlITtfn8K9zPpmgMan0VlirWSjz9Va kKjPJA4EuWCiZ4kGqe+Oy1kzLfKszS5PUA8SxOEqKHR96Q2PTVzJK4GJewZGV4rXDmQh WSCfAOe4/WXkhAr5Vu9HaNVHceLMcqhz4uzW8u+L/7h5oNhCrcD997zkHMqzZtiOzhoX ysow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=cRcOEH0i; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y70si14138029pfg.184.2019.07.23.19.25.20; Tue, 23 Jul 2019 19:25:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=cRcOEH0i; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391344AbfGWR7g (ORCPT + 99 others); Tue, 23 Jul 2019 13:59:36 -0400 Received: from mail-qk1-f201.google.com ([209.85.222.201]:33414 "EHLO mail-qk1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391333AbfGWR7d (ORCPT ); Tue, 23 Jul 2019 13:59:33 -0400 Received: by mail-qk1-f201.google.com with SMTP id t196so37160473qke.0 for ; Tue, 23 Jul 2019 10:59:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=mo6ZyD7PJiiiTnkBfnFT33xmRSSjLb2erTRpgEGb4jw=; b=cRcOEH0iv2407FEeEXiGtfbNaRtJQIzg5XbYICzGVGc43sPOA3+CZIMWAHKgebQ1Fd NhXvQ2XcNcF8R9x/znx8/B+ZWBuFc0pppCQj6IxF/91ZQehMjq/FUgtTO1kgaD+sdo+u g0fX97ge7Kl52ZUaa6b+4pEh6IxUyFSuMDNJlzhUpxY5RLeNi8LIb5QOqygzH5YcXwTw u/vwHZkzfH96V/r4aumfuyQXlNmESoQtl9/gLW/U3oOdnKUbG/Ywu4Xo6BgLwOzrtBVU Gf76BaPylfmhv0ijCpRq3ZN2WZ9BE8VMsOdxcjRzxf/93AljoTsAfpUOJtPXkeNJ+1FY hU+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=mo6ZyD7PJiiiTnkBfnFT33xmRSSjLb2erTRpgEGb4jw=; b=m+4GJwCvpv/me0XjXsVeTWORv47vtHLWcUqxHhiIt3EZr7zTJ2CBRcBAmYaIQweW2j 59ptVp/JGbVEuFRwAEs/mXLk60P++/sfBnesFkkhdF6aUPYTIW1BjZeS0xIsIdhyDNyg GJ10UQtoZ7pnvwrcWu2vgVbZ4WvC7ub2m4B3MmpN8Gv3ktensm7z5Ej2S4VE4g1xM1jh LGQKKX5e0qw4jFGp7HeFoTO5zEkyEm7SfO6eh6CpJUhnSj/JXdwnNUcHaZExtl2APW0X mvTphUBKNrRJJ0HmfLU6Ly+Y+Z+BMqTjRBvs11JrUksZhJ/ncucWS/F/HOvQDpbaj9CY j/4g== X-Gm-Message-State: APjAAAUFDM8Jt7vIuLvhaLwaWK4n/fqQ8KZmGHN96fPufQhOiTwDidDd pjuJpCmszEs+XCaG65D6AAn0W2sl50kGYBIj X-Received: by 2002:a37:47d1:: with SMTP id u200mr49170508qka.21.1563904772061; Tue, 23 Jul 2019 10:59:32 -0700 (PDT) Date: Tue, 23 Jul 2019 19:58:45 +0200 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.22.0.709.g102302147b-goog Subject: [PATCH v19 08/15] userfaultfd: untag user pointers From: Andrey Konovalov To: linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-rdma@vger.kernel.org, linux-media@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Catalin Marinas , Vincenzo Frascino , Will Deacon , Mark Rutland , Andrew Morton , Greg Kroah-Hartman , Kees Cook , Yishai Hadas , Felix Kuehling , Alexander Deucher , Christian Koenig , Mauro Carvalho Chehab , Jens Wiklander , Alex Williamson , Leon Romanovsky , Luc Van Oostenryck , Dave Martin , Khalid Aziz , enh , Jason Gunthorpe , Christoph Hellwig , Dmitry Vyukov , Kostya Serebryany , Evgeniy Stepanov , Lee Smith , Ramana Radhakrishnan , Jacob Bramley , Ruben Ayrapetyan , Robin Murphy , Kevin Brodsky , Szabolcs Nagy , Andrey Konovalov , Mike Rapoport Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch is a part of a series that extends kernel ABI to allow to pass tagged user pointers (with the top byte set to something else other than 0x00) as syscall arguments. userfaultfd code use provided user pointers for vma lookups, which can only by done with untagged pointers. Untag user pointers in validate_range(). Reviewed-by: Mike Rapoport Reviewed-by: Vincenzo Frascino Reviewed-by: Catalin Marinas Reviewed-by: Kees Cook Signed-off-by: Andrey Konovalov --- fs/userfaultfd.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index ccbdbd62f0d8..6284a4e719cb 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -1271,21 +1271,23 @@ static __always_inline void wake_userfault(struct userfaultfd_ctx *ctx, } static __always_inline int validate_range(struct mm_struct *mm, - __u64 start, __u64 len) + __u64 *start, __u64 len) { __u64 task_size = mm->task_size; - if (start & ~PAGE_MASK) + *start = untagged_addr(*start); + + if (*start & ~PAGE_MASK) return -EINVAL; if (len & ~PAGE_MASK) return -EINVAL; if (!len) return -EINVAL; - if (start < mmap_min_addr) + if (*start < mmap_min_addr) return -EINVAL; - if (start >= task_size) + if (*start >= task_size) return -EINVAL; - if (len > task_size - start) + if (len > task_size - *start) return -EINVAL; return 0; } @@ -1335,7 +1337,7 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx, goto out; } - ret = validate_range(mm, uffdio_register.range.start, + ret = validate_range(mm, &uffdio_register.range.start, uffdio_register.range.len); if (ret) goto out; @@ -1524,7 +1526,7 @@ static int userfaultfd_unregister(struct userfaultfd_ctx *ctx, if (copy_from_user(&uffdio_unregister, buf, sizeof(uffdio_unregister))) goto out; - ret = validate_range(mm, uffdio_unregister.start, + ret = validate_range(mm, &uffdio_unregister.start, uffdio_unregister.len); if (ret) goto out; @@ -1675,7 +1677,7 @@ static int userfaultfd_wake(struct userfaultfd_ctx *ctx, if (copy_from_user(&uffdio_wake, buf, sizeof(uffdio_wake))) goto out; - ret = validate_range(ctx->mm, uffdio_wake.start, uffdio_wake.len); + ret = validate_range(ctx->mm, &uffdio_wake.start, uffdio_wake.len); if (ret) goto out; @@ -1715,7 +1717,7 @@ static int userfaultfd_copy(struct userfaultfd_ctx *ctx, sizeof(uffdio_copy)-sizeof(__s64))) goto out; - ret = validate_range(ctx->mm, uffdio_copy.dst, uffdio_copy.len); + ret = validate_range(ctx->mm, &uffdio_copy.dst, uffdio_copy.len); if (ret) goto out; /* @@ -1771,7 +1773,7 @@ static int userfaultfd_zeropage(struct userfaultfd_ctx *ctx, sizeof(uffdio_zeropage)-sizeof(__s64))) goto out; - ret = validate_range(ctx->mm, uffdio_zeropage.range.start, + ret = validate_range(ctx->mm, &uffdio_zeropage.range.start, uffdio_zeropage.range.len); if (ret) goto out; -- 2.22.0.709.g102302147b-goog