Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2471661imm; Mon, 28 May 2018 08:43:10 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqJF4SxdpImUrnjCPTY3jWJ7XEldCXRL5flDlhE4SCfAu8oAdsNsBPLo/1AO808jdL7tc09 X-Received: by 2002:a62:4544:: with SMTP id s65-v6mr14060351pfa.150.1527522190377; Mon, 28 May 2018 08:43:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527522190; cv=none; d=google.com; s=arc-20160816; b=jP4IKhzEy7cgtmH9E+V6IUgMGoP5Vr/lEbSiujfm2J9OCUFdtGVs2wHS9D/1vic6mV 9Ryln2ZUa8M2E5j3lCC/awBA7qxFG0pf6CcUnY+eIMySEnmWKspS+hUom/CSe0SWv4Xh gprDA0wtDIviXl/mtRN/JLcGEiXrDDwvTlQLvdL+avrEgEFTKc+M9sJE3pzyvSdw7N9F ddI9sMsc/Wl+G3cJtxgi3WgNKT+v4kyCT4q0i0WeiXmUxR9Lxdw1jIvna7b2A9SocU0/ ZThmYKaDJjyxOoWfvI3MCK5ztU5YDnCLgGXLXk7j81l8lxyQLKkHSDotdXTMIR6lKiHo k1YA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=+uhFy7+84gj+T85srDYGkDpcitJigvAk3FWYFnuWZ18=; b=vPnZNZTG7xFEP0B32VXyToFihHyOCa8Bzc9am2zK/g9fqqvvHYJPAJkLEoHlxGGuxR hYNN7Zii3uD/MJuDscSHq2h8U4HDRZdbX49IzRaa2BHYpW+4o5Pu0ZpxlNEdE8VeMgCZ nH9eCUNP6Ebwvw2sQtB1mhBDnzkG6kaC/p2y7h+k1H/81b4dQSGChMGiWhy4BPk8xLE1 wvR7V0xpJY4A9bz7497bC9ydjpg3GhuhtW4U8blU+JaC1fWBwNxeY5L98AizoHQTphS9 Ji5RSmh20uM45ygT54iAdtRoceFrVmuLfkOCJaPAeFdqVa7AoLTxV7BOEZSWjkBWu3Ma AyaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IGMosacF; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bg2-v6si5597379plb.243.2018.05.28.08.42.55; Mon, 28 May 2018 08:43:10 -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=@kernel.org header.s=default header.b=IGMosacF; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1034730AbeE1PlR (ORCPT + 99 others); Mon, 28 May 2018 11:41:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:37770 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030356AbeE1KRi (ORCPT ); Mon, 28 May 2018 06:17:38 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7A4CF208A2; Mon, 28 May 2018 10:17:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527502658; bh=dvC8CUCOVlYnR9lfyKiz06tqN4d8vmLAEr1lFFvotM4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IGMosacFEI+zKrq04jT3VCq6T4/aV5eUuxFzoNd8UDyObcrrwDXZH+0LMtMUsfxik CUMZSycZRDpniQrUfE0EULOkYlSK8feSYup9qV/PqSrH9UMJ5w56erMuAdEpVfV1Mg 7waFmSzupEYQL9mzE50DJgBiURjlp1S4jZha63wU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Yisheng Xie , Tan Xiaojun , Vlastimil Babka , Andi Kleen , Chris Salls , Christopher Lameter , David Rientjes , Ingo Molnar , Naoya Horiguchi , Andrew Morton , Linus Torvalds , Sasha Levin Subject: [PATCH 4.4 049/268] mm/mempolicy: fix the check of nodemask from user Date: Mon, 28 May 2018 12:00:23 +0200 Message-Id: <20180528100207.547689076@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100202.045206534@linuxfoundation.org> References: <20180528100202.045206534@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 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 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Yisheng Xie [ Upstream commit 56521e7a02b7b84a5e72691a1fb15570e6055545 ] As Xiaojun reported the ltp of migrate_pages01 will fail on arm64 system which has 4 nodes[0...3], all have memory and CONFIG_NODES_SHIFT=2: migrate_pages01 0 TINFO : test_invalid_nodes migrate_pages01 14 TFAIL : migrate_pages_common.c:45: unexpected failure - returned value = 0, expected: -1 migrate_pages01 15 TFAIL : migrate_pages_common.c:55: call succeeded unexpectedly In this case the test_invalid_nodes of migrate_pages01 will call: SYSC_migrate_pages as: migrate_pages(0, , {0x0000000000000001}, 64, , {0x0000000000000010}, 64) = 0 The new nodes specifies one or more node IDs that are greater than the maximum supported node ID, however, the errno is not set to EINVAL as expected. As man pages of set_mempolicy[1], mbind[2], and migrate_pages[3] mentioned, when nodemask specifies one or more node IDs that are greater than the maximum supported node ID, the errno should set to EINVAL. However, get_nodes only check whether the part of bits [BITS_PER_LONG*BITS_TO_LONGS(MAX_NUMNODES), maxnode) is zero or not, and remain [MAX_NUMNODES, BITS_PER_LONG*BITS_TO_LONGS(MAX_NUMNODES) unchecked. This patch is to check the bits of [MAX_NUMNODES, maxnode) in get_nodes to let migrate_pages set the errno to EINVAL when nodemask specifies one or more node IDs that are greater than the maximum supported node ID, which follows the manpage's guide. [1] http://man7.org/linux/man-pages/man2/set_mempolicy.2.html [2] http://man7.org/linux/man-pages/man2/mbind.2.html [3] http://man7.org/linux/man-pages/man2/migrate_pages.2.html Link: http://lkml.kernel.org/r/1510882624-44342-3-git-send-email-xieyisheng1@huawei.com Signed-off-by: Yisheng Xie Reported-by: Tan Xiaojun Acked-by: Vlastimil Babka Cc: Andi Kleen Cc: Chris Salls Cc: Christopher Lameter Cc: David Rientjes Cc: Ingo Molnar Cc: Naoya Horiguchi Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- mm/mempolicy.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1232,6 +1232,7 @@ static int get_nodes(nodemask_t *nodes, unsigned long maxnode) { unsigned long k; + unsigned long t; unsigned long nlongs; unsigned long endmask; @@ -1248,13 +1249,19 @@ static int get_nodes(nodemask_t *nodes, else endmask = (1UL << (maxnode % BITS_PER_LONG)) - 1; - /* When the user specified more nodes than supported just check - if the non supported part is all zero. */ + /* + * When the user specified more nodes than supported just check + * if the non supported part is all zero. + * + * If maxnode have more longs than MAX_NUMNODES, check + * the bits in that area first. And then go through to + * check the rest bits which equal or bigger than MAX_NUMNODES. + * Otherwise, just check bits [MAX_NUMNODES, maxnode). + */ if (nlongs > BITS_TO_LONGS(MAX_NUMNODES)) { if (nlongs > PAGE_SIZE/sizeof(long)) return -EINVAL; for (k = BITS_TO_LONGS(MAX_NUMNODES); k < nlongs; k++) { - unsigned long t; if (get_user(t, nmask + k)) return -EFAULT; if (k == nlongs - 1) { @@ -1267,6 +1274,16 @@ static int get_nodes(nodemask_t *nodes, endmask = ~0UL; } + if (maxnode > MAX_NUMNODES && MAX_NUMNODES % BITS_PER_LONG != 0) { + unsigned long valid_mask = endmask; + + valid_mask &= ~((1UL << (MAX_NUMNODES % BITS_PER_LONG)) - 1); + if (get_user(t, nmask + nlongs - 1)) + return -EFAULT; + if (t & valid_mask) + return -EINVAL; + } + if (copy_from_user(nodes_addr(*nodes), nmask, nlongs*sizeof(unsigned long))) return -EFAULT; nodes_addr(*nodes)[nlongs-1] &= endmask;