Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2662875yba; Mon, 6 May 2019 09:34:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqy7oCIts/WMxKYMQUNKNZI1CH18c9jBA0L0gRfxwuYfl/Vci66Fn7k9riXagSt/WkYN7QSr X-Received: by 2002:a63:5c4c:: with SMTP id n12mr33360642pgm.111.1557160482802; Mon, 06 May 2019 09:34:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557160482; cv=none; d=google.com; s=arc-20160816; b=L1HeOhDmktvaAgMrEDNKzlbpe5LsatnTvv1Tm7AQ739fzW77cSGt4R+7HG/RKzpHFR f5AO7YkmKzJvSJLYQBDzoaV79c/74Kaxjpfb9l6MxYaqhUm99KF3uMLmzhd7Wb1dnfTW CD6ZGsITIU+5jPD/AcZyFK3IeKdlLZ4jB8RhREOuVfuh681SVbtqs53j8CPU2eO7uPr8 MEnpBdW7GZncKjB5ZaL2cnzsRVCDEmWbczqMFEwLKlVOV/8Zk2GuyIM6XFM03vjgoIv8 AnvfxIQp3ZEy9GuHrodAbZW9PCfQA22Fb0QcNw/vrb6vQrmh8zKLm+GeBqHbRaEfDNoL PY9g== 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=XsLXWNDlsBBI0M98p6y9Vt03OYjBcfLHAOwfOkL6Mk8=; b=SxAVJGp3pit5N4TSDFqm2RDql7lExXnL7HodPAHwN9wWITRQW/X5zG9YpsG153l3ms pFtMTps9q2DUMEAjxnZoD2v90Y4mkJRF5SZ/jGChih5qP9WdhoxdSnf1N5Ua5vmSmwQU TrHlXsxsqHbbV1M3TJ9I7aszFptTRvs/TCu7ow2pgPkJOKoTBebWyMl5GyC6W9It/V4O vzJuGVlCzIoInb6Wqk33kuGwBMWYhfYw0Jox0n4/rqm8K+Ygjd/WXeGX+BfqecpRMjO6 y/rTGvq53dkx/T3H8pA7dxWd5S/ggEMGrbOBrx7iysxrGBoP7ipBzmNGThf6jBej+iA4 6oDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=kEClrhOV; 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 o28si6357398pgm.183.2019.05.06.09.34.26; Mon, 06 May 2019 09:34:42 -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=kEClrhOV; 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 S1727463AbfEFQcy (ORCPT + 99 others); Mon, 6 May 2019 12:32:54 -0400 Received: from mail-yw1-f73.google.com ([209.85.161.73]:36749 "EHLO mail-yw1-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727161AbfEFQbj (ORCPT ); Mon, 6 May 2019 12:31:39 -0400 Received: by mail-yw1-f73.google.com with SMTP id j62so26228884ywe.3 for ; Mon, 06 May 2019 09:31:38 -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=XsLXWNDlsBBI0M98p6y9Vt03OYjBcfLHAOwfOkL6Mk8=; b=kEClrhOVjhAItZ8ad4444tIss3a4M0x8Yot0yP0UgDJhkHPz5JJSrKt8hPGcBCGy4k n4A8xX+jnj6SxUqb5Teq0gUiCKNzkVcA04YhcbUNwlyz4R1O6RfjMZcPvXzWJ1RdceKB oQhTiP7SkvbOtmqbJ2RUuk4j1OYZLTrgQf9mkPglzFxH/VOrmTQ4nsN9RjYlhUC2s+eh 3RVGdXHQ+PFLeCy7nvUg/hvDRpVltVdy/tgWDjXNd7yymqhFMcWgbq1pcJP1+YPDmRyD x5gmgR7lpn+iTAg+S4pO9Zaw/FFLdxShW6UDAYaJnd95g7v5e/84elY+8pkkjOlGa4Nw P+ag== 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=XsLXWNDlsBBI0M98p6y9Vt03OYjBcfLHAOwfOkL6Mk8=; b=OS6pzyG5I94H1TmZK7LGxnka7MPZUVK2RQ9pY7hTxcgJ0hukU5NUcxmw6vhgFl1qAw qvTI4ZT+QoRI7L0Hv0ycDig4FcdqtN2Qvdxprzyjm8pSGpAt2E8DccTJbaq23M76ao/6 9tBXIBpArfQRPUALI//JfJ7VizUYDDu8Ef1ukx4ii//o9DKfIwViZAivuXjFmWogsSnl nnBi3YyTM0Uo27N1UMepXo5/a+Wv0mtVlOTEgdAby/xvDeIUwvIzcza/kRcQGEY950Rq NgsTDVQ4bdVKVQE+hGyd4jIOnt6BY3n6AsIACAIbIfU5fda1brgJXn0diWi9vF+kun32 bEtQ== X-Gm-Message-State: APjAAAXt1UWNTS2Bs8qaCN2GM3XEa+FuVUW71AKtbOZvk/2akOQeEN1F 1iilSYqKabT9XBzXIVtgMYpkP4xrFOUpfnD7 X-Received: by 2002:a81:7903:: with SMTP id u3mr17016403ywc.478.1557160297906; Mon, 06 May 2019 09:31:37 -0700 (PDT) Date: Mon, 6 May 2019 18:30:56 +0200 In-Reply-To: Message-Id: <30b44d469bb545c608531faf01fb10248ed78887.1557160186.git.andreyknvl@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.21.0.1020.gf2820cf01a-goog Subject: [PATCH v15 10/17] fs, arm64: untag user pointers in fs/userfaultfd.c 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 , Dmitry Vyukov , Kostya Serebryany , Evgeniy Stepanov , Lee Smith , Ramana Radhakrishnan , Jacob Bramley , Ruben Ayrapetyan , Robin Murphy , Luc Van Oostenryck , Dave Martin , Kevin Brodsky , Szabolcs Nagy , Andrey Konovalov 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 arm64 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(). 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 f5de1e726356..aa47ed0969dd 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -1261,21 +1261,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; } @@ -1325,7 +1327,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; @@ -1514,7 +1516,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; @@ -1665,7 +1667,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; @@ -1705,7 +1707,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; /* @@ -1761,7 +1763,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.21.0.1020.gf2820cf01a-goog