Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp1055064pxb; Fri, 21 Jan 2022 08:57:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJxrrHPHjgV+0SHYZQvgP/nQ/D4Y5I9hsQsmKIb/NyPxR5MfSlCgcPWdbMH29LoXdZJQq1tF X-Received: by 2002:a17:90a:9504:: with SMTP id t4mr1598376pjo.164.1642784278078; Fri, 21 Jan 2022 08:57:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642784278; cv=none; d=google.com; s=arc-20160816; b=qvBD0OB/ubbnHQ1uWuPtfJ/h6QySa8ZH36iOtiXRieJx3LzLA7YHCH74TCSf6GX0wh IvAZDPSpbubTMrqUm4HYpC9k9VT7qbkjL5goAKiDbkBPrZoeZ9aZ+Gn83gA1asyRXdOl V7WJOvyDDDxVs6ZJdpORNvQAehIy8INTFTaMUbzwJ76aT90IassVY/gKg/Yl2WhJst57 JoDzL58tlHkoW+dgu5asvGwmKUmI4v45NaRyOnJxpZSacvmo8aubeT3Wt3qS0JPkE2qF RIGNUG9v0WCWkD6sl7iSEZchESnS1zAUQHSqhEJyhAvBMH/i8CqTHit46dhyIVR69I05 TY7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=UWNe/3VGlP2WkdyvmuPXNtnUnWcj6lzWwu7jtcypKF4=; b=oa6lyQx1D2yIvTjpvxYDwfeS1/2kTQQW67MHFlAwF4U4E0XbmbQxTBtBODAAgg8CVD 2TG9H0S7V8KNGrcn3c6kc0p0z6HVMktkBv6T9a7daqaYH6xtAMmhyO/9oUUa3MRaBgY2 qxlwLKKNHI8PbyGfWoTe0UuN/4/MSKxA+B4HzjuOnuIYz7F+/rg81K9bEOfb5FoSGUmm 20r5hWEN7RmLuC7TUKgzxMyqB8QjHtHdftjtMLJXir68umA7uC9IZ5lX5tB9EQmUKFjx OME5cKD1CbsGthQWj6/2bZg7+V89g1dry3AHOC5VxIfB+vy0q5Wa727kH0i1/oB6J1Nr Xo+A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t34si6671501pgm.873.2022.01.21.08.57.45; Fri, 21 Jan 2022 08:57:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351727AbiASGRU (ORCPT + 99 others); Wed, 19 Jan 2022 01:17:20 -0500 Received: from foss.arm.com ([217.140.110.172]:47708 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234904AbiASGRT (ORCPT ); Wed, 19 Jan 2022 01:17:19 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4898FD6E; Tue, 18 Jan 2022 22:17:19 -0800 (PST) Received: from [10.163.74.69] (unknown [10.163.74.69]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3F7143F73D; Tue, 18 Jan 2022 22:17:14 -0800 (PST) Subject: Re: [PATCH] vmap(): don't allow invalid pages To: Matthew Wilcox , Yury Norov Cc: Catalin Marinas , Will Deacon , Andrew Morton , Nicholas Piggin , Ding Tianhong , Alexey Klimov , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Uladzislau Rezki References: <20220118235244.540103-1-yury.norov@gmail.com> From: Anshuman Khandual Message-ID: Date: Wed, 19 Jan 2022 11:47:18 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 1/19/22 6:21 AM, Matthew Wilcox wrote: > On Tue, Jan 18, 2022 at 03:52:44PM -0800, Yury Norov wrote: >> vmap() takes struct page *pages as one of arguments, and user may provide >> an invalid pointer which would lead to DABT at address translation later. > > Could we spell out 'DABT'? Presumably that's an ARM-specific thing. > Just like we don't say #PF for Intel page faults, I think this is > probably a 'data abort'? Right, it is data abort. > >> Currently, kernel checks the pages against NULL. In my case, however, the >> address was not NULL, and was big enough so that the hardware generated >> Address Size Abort on arm64. Could you please provide the actual abort stack here with details. >> >> Interestingly, this abort happens even if copy_from_kernel_nofault() is >> used, which is quite inconvenient for debugging purposes. >> >> This patch adds a pfn_valid() check into vmap() path, so that invalid >> mapping will not be created. >> >> RFC: https://lkml.org/lkml/2022/1/18/815 >> v1: use pfn_valid() instead of adding an arch-specific >> arch_vmap_page_valid(). Thanks to Matthew Wilcox for the hint. This should be after the '---' below. >> >> Signed-off-by: Yury Norov > > Suggested-by: Matthew Wilcox (Oracle) > >> --- >> mm/vmalloc.c | 2 ++ >> 1 file changed, 2 insertions(+) >> >> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >> index d2a00ad4e1dd..a4134ee56b10 100644 >> --- a/mm/vmalloc.c >> +++ b/mm/vmalloc.c >> @@ -477,6 +477,8 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr, >> return -EBUSY; >> if (WARN_ON(!page)) >> return -ENOMEM; >> + if (WARN_ON(!pfn_valid(page_to_pfn(page)))) >> + return -EINVAL; >> set_pte_at(&init_mm, addr, pte, mk_pte(page, prot)); >> (*nr)++; >> } while (pte++, addr += PAGE_SIZE, addr != end); >> -- >> 2.30.2 >> Why should not this just scan over the entire user provided struct page array and make sure that all pages there in are valid via above method, but in vmap() itself before calling vmap_pages_range(). Because seems like a single invalid page detected in vmap_pages_pte_range() will anyways abort the entire vmap(). This will also enable us to drop the existing NULL check above.