From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3F6FCA0FE1 for ; Fri, 30 Aug 2024 12:45:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 311A66B0134; Fri, 30 Aug 2024 08:45:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 299F46B0135; Fri, 30 Aug 2024 08:45:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0ED026B0136; Fri, 30 Aug 2024 08:45:13 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id DA9DA6B0134 for ; Fri, 30 Aug 2024 08:45:12 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 839F41418F8 for ; Fri, 30 Aug 2024 12:45:12 +0000 (UTC) X-FDA: 82508882064.27.98EA2B9 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by imf14.hostedemail.com (Postfix) with ESMTP id 6D41910000D for ; Fri, 30 Aug 2024 12:45:10 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=T0munDMn; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf14.hostedemail.com: domain of pedro.falcato@gmail.com designates 209.85.128.41 as permitted sender) smtp.mailfrom=pedro.falcato@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1725021844; a=rsa-sha256; cv=none; b=TjyL+n00VhQ2Z2rGZx/vWyl7pIDyJSKc/smYhi9iT0cCRi51OClQQnnnawRRSl6JCrkTec ZWzutuf3nhue1GJ5Nmtr1UJaHYDp6moQMVuMFtXpvGUqZ5y7QBpNo8M76vNXQA4nxryzAy goOIxRuy3g71eppgkCY2m3wiIo4CBOg= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=T0munDMn; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf14.hostedemail.com: domain of pedro.falcato@gmail.com designates 209.85.128.41 as permitted sender) smtp.mailfrom=pedro.falcato@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1725021844; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZHI4f6UL8o/xAjeqhdRt5ePuagdwc9Vu7QLE1T70+iY=; b=R6idAIfKdSmhZ+oLc1QKsox96aSEbdfpV1VrxaBEALPsVrGRso+A8wWpbyQcofvrw0v4nO Tzi9ZQODBjt5uDQPp2z+oVYZcKPhf2x3bmD21BeR3DISY1w/xn9+FOENI0F07rmYJWekBw DKVoJ1iWIbeyV8uKgXNE8JoBv071je0= Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-42bb81e795bso13150915e9.1 for ; Fri, 30 Aug 2024 05:45:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1725021909; x=1725626709; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=ZHI4f6UL8o/xAjeqhdRt5ePuagdwc9Vu7QLE1T70+iY=; b=T0munDMnDZqfPa89qUWtlCxLgytcPNMi2y4iSvfz2Eg5AyipfXe/HdR44AEqpXXqvM 2jmNElvbw9C2MIjvPfPcHSdOo19NsXtBRqb+lVNSJSvQgh/Cpx/3Wl45E9+Bt3iO71wE pQl4lsM5+X/jlg+Le61JWrnHWc5sN94todvDNMDvHzOobJUrFHejM/Pn3w82i6rCyp5G rxzYKjOUDRAAuaBOb1uajRLVvlufYRPp8ukUH9b0owNgkQ5EY50C/j8N8P/blxftdJvb UYz3THuk0ZPBUXFgeBvPvRLtKAb8TVwlmaC6b5aguYKppmR1uqw1Gb4xANptZEXmK000 COTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725021909; x=1725626709; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=ZHI4f6UL8o/xAjeqhdRt5ePuagdwc9Vu7QLE1T70+iY=; b=Kk7SxSh2Hi7sEo9FF5WJvMPex49i1ROm3zHPf3OGjpQjxRaV0czJsgdtwtU4L1w5S6 XK3zI9/OSSOBFITlvT23/2WX3fDZctuRxIn4XYEB/+lV66boZVzgt6WR2JZEGUhAjIn8 HmTylFZlRVfyPT8JBSsp7puxmS67dll5ctqOvYVpEV7MkDytVC8Ff5I+fmMMwXgfXLoY E++IrsHJeAfowwRTPE3YNYiJW3LXHkw/8xduhmBCxCGEL0327N9dg27jfdRz3Y+AMoYF L5t5s//JKnpg7MwYTgGbLNXdo9ktD5ctaliNYyFKr0yhU+o1Q5xYnRZrpLrG+/LXpkd6 ypVg== X-Forwarded-Encrypted: i=1; AJvYcCVlxJeskYOc8RTVi8X3IcrPzzk326js9XOq7wR1MZlyuZoMidkY6C7PhEIEqMz1sfYDlmlNqTJWyA==@kvack.org X-Gm-Message-State: AOJu0Yy584Nu5/uEiESgGu8x8Sav8CJWIp6Tx4lHLngNCDKUnbDj71O9 fBRmlCOb3COfK0LLc/AutP2g1oXGzeaUurGnChjgntsA8O+Tn5F7 X-Google-Smtp-Source: AGHT+IGJK4GUGGa4GBeBW6LZpq8mQ/Nd15wwl3rhczUclSey00gnP4dpwPTgTVpihdfXiOF0WLqo4A== X-Received: by 2002:a05:600c:4683:b0:427:ac40:d4b1 with SMTP id 5b1f17b1804b1-42bbb436e2emr17818045e9.27.1725021908023; Fri, 30 Aug 2024 05:45:08 -0700 (PDT) Received: from PC-PEDRO-ARCH ([2001:8a0:7862:ea00:1d36:5f53:3f57:14ad]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-42ba639da86sm78280295e9.20.2024.08.30.05.45.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Aug 2024 05:45:07 -0700 (PDT) Date: Fri, 30 Aug 2024 13:45:05 +0100 From: Pedro Falcato To: jeffxu@chromium.org Cc: akpm@linux-foundation.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-hardening@vger.kernel.org, linux-kernel@vger.kernel.org, willy@infradead.org, lorenzo.stoakes@oracle.com, broonie@kernel.org, vbabka@suse.cz, Liam.Howlett@oracle.com, rientjes@google.com, keescook@chromium.org Subject: Re: [PATCH v2 1/4] selftests/mm: mseal_test, add vma size check Message-ID: References: <20240829214352.963001-1-jeffxu@chromium.org> <20240829214352.963001-2-jeffxu@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240829214352.963001-2-jeffxu@chromium.org> X-Rspamd-Queue-Id: 6D41910000D X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 8869wmzg1op1qou5aumy8mipdhkz7kkb X-HE-Tag: 1725021910-623207 X-HE-Meta: U2FsdGVkX1+hQxbg2IJMNBIsr+/dB9FJ+BYl5V2ubPapJFicOVJM5RlABtucNwWHG7FFVwcT8z2VWe68TnA1UUb20aMQPZ2D+OP3LkfEZXjNqpvrqaWJN+AFDBqvVs++72nRV/zFY1JO5kFGlKOgkED0CUWK3tW9QEWbTjNWkuThT758XdNnfqNKuMArKdHn51XbOvLgGPwmIHGhFemE+oLBcWfr+T5kZdgVk30N9a0KKD9VSlhZWqtRhyIUmfHnsyFNNPqSfBgCY+Dj5yYArBDJSGd4ILeKpWpgxb4kMb18hJJsBn+tFihU9p77C8AGxpEhbbcof0YROMw6O+gbXBZfx7LyLoPH63+KPVf7kl7UnOH7tYYTl01Wmj4SjIg8sTYVUkMsi5kvWnG2tYumRdRZIZDlsJhn/YHvQyw5FJLfJJLzHznQ83FIsIMW/01eXxDloW78TzqHITbhkSnDBc5IlxzGbWh0MC7o/gjfIjIR533PihxPSx5op3nJfpx3ZJucBcd3EqkrrhKwVtE+vFiYgriLCNLBSvrNwCvMmmTej5iJkK4HJn6WL1jFIWyDUL8sniwb9zAxRgLQXZ8NtW3FPsrTBLrKHQwBRPgiPlb9ZsSnuk4+UTHl4sPVFly+A0FSNUjQOGwqysuq5k/SYVmCkW9wZYdY+fgTNVjFUKJ3IV2deaUua2PfTupcnL03QHa5zDnoUY9Z/3DQDWcJMWfk/uy+914GOU4N9bfn2Z/zPtu3dwU7mOtEjPc5MG+1iWNOeCLxWSkSRIZ4dQDDpmtl6CxgX0UZaUNut+ZtC8io53/w4mqUf9o6EKdeu1ZsUyXg48bD3xxynEiiTLWnb6DpDGcMEq0b9BTmS3lsySz/5J8YsyktB81PmKN+kxzHNcBLD6Tsy45gh3UAYSuzvAkFsL7YfB+fnY7xjkDeR03jqtaraX9yRD5D51Uqq/r3uoGxdxmCmAg2fCODTrE Sxi5W6jY CzRopEWGuKuxpMJRNmlNZHDRdFE2Ocb0PaxYUohoke6V4l/GeU1YUG7Nee4nAJcBx0S3LvsOt/lTCWNgsklU/lLWs1hdylkzCeJ+csiHwvDz8rBR+E8T2wsAYmaMNXmo3TFEccaBeF74aghTbQVUJFA7tCHDmuaXUj9g7LSWq4dQ5ArXu4/992CdsooHr8KKqqnxOc15wmYocnNxuBrrcDhllY4TWdD4zy3AxUqgizEcCPcLwzEfxuXcaRV+zKeYScanJtFkETtwISjN90vACSoN0S2GXvCQsBccgeLBP0ioETN33P25B+tc6mIvx2dqJv3b+172nEUUgAgL3qViVqBqx4iT9GRkXGGKTtFafj/Gavnlcf9+IDfbKXoWa07p2tODXX6reo7MO/bxfMaG1Prh7rOjL7YVeBHJ0j26RSyVEQ2RkcBKZfjPrwWNVtesgKukI/HsMr87+YwZqoUnEmQ7/Zwb79pzu2fH6cVBfmxXU1NBFW+8pPp3dppNTfCNMP9c0M09rTmo8y5ptoT/E5slr4eHnt+NlR/Kr X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Thu, Aug 29, 2024 at 09:43:49PM GMT, jeffxu@chromium.org wrote: > From: Jeff Xu > > Add check for vma size, prot bits and error return. > > Signed-off-by: Jeff Xu > --- > tools/testing/selftests/mm/mseal_test.c | 398 ++++++++++++++++++++---- > 1 file changed, 332 insertions(+), 66 deletions(-) > > diff --git a/tools/testing/selftests/mm/mseal_test.c b/tools/testing/selftests/mm/mseal_test.c > index e7991e5fdcf3..adc646cf576c 100644 > --- a/tools/testing/selftests/mm/mseal_test.c > +++ b/tools/testing/selftests/mm/mseal_test.c > @@ -170,18 +170,31 @@ static void set_pkey(int pkey, unsigned long pkey_value) > static void setup_single_address(int size, void **ptrOut) > { > void *ptr; > + unsigned long page_size = getpagesize(); > > - ptr = mmap(NULL, size, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); > - *ptrOut = ptr; > + *ptrOut = (void *)-1; > + ptr = mmap(NULL, size + 2 * page_size, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); > + if (ptr != (void *) -1) { MAP_FAILED, not (void *) -1 > + /* add 2 page at the beginning and end to avoid auto-merge of mapping */ > + sys_mprotect(ptr, page_size, PROT_NONE); > + sys_mprotect(ptr + size + page_size, page_size, PROT_NONE); > + *ptrOut = ptr + page_size; > + } > } > > static void setup_single_address_rw(int size, void **ptrOut) > { > void *ptr; > unsigned long mapflags = MAP_ANONYMOUS | MAP_PRIVATE; > + unsigned long page_size = getpagesize(); > > - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, mapflags, -1, 0); > - *ptrOut = ptr; > + *ptrOut = (void *)-1; > + ptr = mmap(NULL, size + 2 * page_size, PROT_READ | PROT_WRITE, mapflags, -1, 0); > + if (ptr != (void *) -1) { Same here. > + sys_mprotect(ptr, page_size, PROT_NONE); > + sys_mprotect(ptr + size + page_size, page_size, PROT_NONE); > + *ptrOut = ptr + page_size; > + } > } > > static int clean_single_address(void *ptr, int size) > @@ -226,6 +239,21 @@ bool pkey_supported(void) > return false; > } > > +bool get_vma_size_supported(void) > +{ > + void *ptr; > + unsigned long page_size = getpagesize(); > + unsigned long size = 4 * page_size; > + int prot; > + > + setup_single_address(size, &ptr); > + size = get_vma_size(ptr, &prot); > + if (size == 4 * page_size && prot == 0x4) > + return true; > + > + return false; > +} > + > static void test_seal_addseal(void) > { > int ret; > @@ -419,11 +447,17 @@ static void test_seal_invalid_input(void) > unsigned long size = 4 * page_size; > int ret; > > - setup_single_address(8 * page_size, &ptr); > + setup_single_address(9 * page_size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > - ret = clean_single_address(ptr + 4 * page_size, 4 * page_size); > + > + ret = clean_single_address(ptr, page_size); > FAIL_TEST_IF_FALSE(!ret); > > + ret = clean_single_address(ptr + 5 * page_size, 4 * page_size); > + FAIL_TEST_IF_FALSE(!ret); > + > + ptr = ptr + page_size; > + > /* invalid flag */ > ret = syscall(__NR_mseal, ptr, size, 0x20); > FAIL_TEST_IF_FALSE(ret < 0); > @@ -523,6 +557,7 @@ static void test_seal_mprotect(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -533,9 +568,14 @@ static void test_seal_mprotect(bool seal) > } > > ret = sys_mprotect(ptr, size, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -547,6 +587,7 @@ static void test_seal_start_mprotect(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -558,9 +599,14 @@ static void test_seal_start_mprotect(bool seal) > > /* the first page is sealed. */ > ret = sys_mprotect(ptr, page_size, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > /* pages after the first page is not sealed. */ > @@ -577,6 +623,7 @@ static void test_seal_end_mprotect(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -593,9 +640,14 @@ static void test_seal_end_mprotect(bool seal) > /* last 3 page are sealed */ > ret = sys_mprotect(ptr + page_size, page_size * 3, > PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr + page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 3 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -607,6 +659,7 @@ static void test_seal_mprotect_unalign_len(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -618,9 +671,14 @@ static void test_seal_mprotect_unalign_len(bool seal) > > /* 2 pages are sealed. */ > ret = sys_mprotect(ptr, page_size * 2, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > ret = sys_mprotect(ptr + page_size * 2, page_size, > @@ -636,6 +694,7 @@ static void test_seal_mprotect_unalign_len_variant_2(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -646,9 +705,14 @@ static void test_seal_mprotect_unalign_len_variant_2(bool seal) > > /* 3 pages are sealed. */ > ret = sys_mprotect(ptr, page_size * 3, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 3 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > ret = sys_mprotect(ptr + page_size * 3, page_size, > @@ -664,6 +728,7 @@ static void test_seal_mprotect_two_vma(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -678,16 +743,26 @@ static void test_seal_mprotect_two_vma(bool seal) > } > > ret = sys_mprotect(ptr, page_size * 2, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + } else > FAIL_TEST_IF_FALSE(!ret); > > ret = sys_mprotect(ptr + page_size * 2, page_size * 2, > PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr + page_size * 2, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -699,6 +774,7 @@ static void test_seal_mprotect_two_vma_with_split(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -719,17 +795,27 @@ static void test_seal_mprotect_two_vma_with_split(bool seal) > > /* the second page is sealed. */ > ret = sys_mprotect(ptr + page_size, page_size, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + } else > FAIL_TEST_IF_FALSE(!ret); > > /* the third page is sealed. */ > ret = sys_mprotect(ptr + 2 * page_size, page_size, > PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr + 2 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > /* the fouth page is not sealed. */ > @@ -746,6 +832,7 @@ static void test_seal_mprotect_partial_mprotect(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -758,9 +845,14 @@ static void test_seal_mprotect_partial_mprotect(bool seal) > > /* mprotect first 2 page will fail, since the first page are sealed. */ > ret = sys_mprotect(ptr, 2 * page_size, PROT_READ | PROT_WRITE); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -783,15 +875,15 @@ static void test_seal_mprotect_partial_mprotect_tail(bool seal) > } > > ret = sys_mprotect(ptr, size, PROT_EXEC); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > - FAIL_TEST_IF_FALSE(!ret); > + FAIL_TEST_IF_FALSE(errno == EPERM); > > - if (seal) { > - FAIL_TEST_IF_FALSE(get_vma_size(ptr + page_size, &prot) > 0); > + size = get_vma_size(ptr + page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > FAIL_TEST_IF_FALSE(prot == 0x4); > - } > + } else > + FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > } > @@ -846,6 +938,7 @@ static void test_seal_mprotect_split(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -862,16 +955,34 @@ static void test_seal_mprotect_split(bool seal) > > /* mprotect is sealed. */ > ret = sys_mprotect(ptr, 2 * page_size, PROT_READ); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + > + size = get_vma_size(ptr + page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 3 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > > ret = sys_mprotect(ptr + 2 * page_size, 2 * page_size, PROT_READ); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + > + size = get_vma_size(ptr + page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 3 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -883,6 +994,7 @@ static void test_seal_mprotect_merge(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -899,9 +1011,18 @@ static void test_seal_mprotect_merge(bool seal) > > /* 2 pages are sealed. */ > ret = sys_mprotect(ptr, 2 * page_size, PROT_READ); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + > + size = get_vma_size(ptr + page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 1 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > /* last 2 pages are not sealed. */ > @@ -917,6 +1038,7 @@ static void test_seal_munmap(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -928,9 +1050,14 @@ static void test_seal_munmap(bool seal) > > /* 4 pages are sealed. */ > ret = sys_munmap(ptr, size); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -948,6 +1075,7 @@ static void test_seal_munmap_two_vma(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -962,15 +1090,33 @@ static void test_seal_munmap_two_vma(bool seal) > } > > ret = sys_munmap(ptr, page_size * 2); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + > + size = get_vma_size(ptr + 2 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > ret = sys_munmap(ptr + page_size, page_size * 2); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x6); > + > + size = get_vma_size(ptr + 2 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -1018,33 +1164,75 @@ static void test_seal_munmap_partial_across_vmas(bool seal) > { > void *ptr; > unsigned long page_size = getpagesize(); > - unsigned long size = 2 * page_size; > + unsigned long size = 12 * page_size; > int ret; > int prot; > > - /* > - * Check if a partial mseal (that results in two vmas) works correctly. > - * It might unmap the first, but it'll never unmap the second (msealed) vma. > - */ > - > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > > if (seal) { > - ret = sys_mseal(ptr + page_size, page_size); > + ret = sys_mseal(ptr + 4 * page_size, 4 * page_size); > FAIL_TEST_IF_FALSE(!ret); > } > > - ret = sys_munmap(ptr, size); > - if (seal) > + ret = sys_munmap(ptr, 12 * page_size); > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + > + size = get_vma_size(ptr + 4 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + > + size = get_vma_size(ptr + 8 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > + > + ret = sys_munmap(ptr, 6 * page_size); > if (seal) { > - FAIL_TEST_IF_FALSE(get_vma_size(ptr + page_size, &prot) > 0); > + FAIL_TEST_IF_FALSE(ret < 0); > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + > + size = get_vma_size(ptr + 4 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > FAIL_TEST_IF_FALSE(prot == 0x4); > - } > + > + size = get_vma_size(ptr + 8 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > + FAIL_TEST_IF_FALSE(!ret); > + > + ret = sys_munmap(ptr + 6 * page_size, 6 * page_size); > + if (seal) { > + FAIL_TEST_IF_FALSE(ret < 0); > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + > + size = get_vma_size(ptr + 4 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + > + size = get_vma_size(ptr + 8 * page_size, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > + FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > } > @@ -1074,9 +1262,11 @@ static void test_munmap_start_freed(bool seal) > ret = sys_munmap(ptr, size); > if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > + FAIL_TEST_IF_FALSE(errno == EPERM); > > size = get_vma_size(ptr + page_size, &prot); > - FAIL_TEST_IF_FALSE(size == page_size * 3); > + FAIL_TEST_IF_FALSE(size == 3 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else { > /* note: this will be OK, even the first page is */ > /* already unmapped. */ > @@ -1095,6 +1285,7 @@ static void test_munmap_end_freed(bool seal) > unsigned long page_size = getpagesize(); > unsigned long size = 4 * page_size; > int ret; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1111,9 +1302,14 @@ static void test_munmap_end_freed(bool seal) > > /* unmap all pages. */ > ret = sys_munmap(ptr, size); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 3 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(!ret); > > REPORT_TEST_PASS(); > @@ -1144,12 +1340,15 @@ static void test_munmap_middle_freed(bool seal) > ret = sys_munmap(ptr, size); > if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > + FAIL_TEST_IF_FALSE(errno == EPERM); > > size = get_vma_size(ptr, &prot); > FAIL_TEST_IF_FALSE(size == page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > > size = get_vma_size(ptr + page_size * 3, &prot); > FAIL_TEST_IF_FALSE(size == page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else { > FAIL_TEST_IF_FALSE(!ret); > > @@ -1170,6 +1369,7 @@ static void test_seal_mremap_shrink(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1184,6 +1384,10 @@ static void test_seal_mremap_shrink(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == (void *) MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else { > FAIL_TEST_IF_FALSE(ret2 != (void *) MAP_FAILED); > > @@ -1199,6 +1403,7 @@ static void test_seal_mremap_expand(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1216,6 +1421,10 @@ static void test_seal_mremap_expand(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 2 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else { > FAIL_TEST_IF_FALSE(ret2 == ptr); > > @@ -1231,6 +1440,7 @@ static void test_seal_mremap_move(bool seal) > unsigned long size = page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1249,10 +1459,12 @@ static void test_seal_mremap_move(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > - } else { > - FAIL_TEST_IF_FALSE(ret2 != MAP_FAILED); > > - } > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > + FAIL_TEST_IF_FALSE(ret2 != MAP_FAILED); > > REPORT_TEST_PASS(); > } > @@ -1264,6 +1476,7 @@ static void test_seal_mmap_overwrite_prot(bool seal) > unsigned long size = page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1279,6 +1492,10 @@ static void test_seal_mmap_overwrite_prot(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else > FAIL_TEST_IF_FALSE(ret2 == ptr); > > @@ -1292,6 +1509,7 @@ static void test_seal_mmap_expand(bool seal) > unsigned long size = 12 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1310,6 +1528,10 @@ static void test_seal_mmap_expand(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 8 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else > FAIL_TEST_IF_FALSE(ret2 == ptr); > > @@ -1323,6 +1545,7 @@ static void test_seal_mmap_shrink(bool seal) > unsigned long size = 12 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1338,6 +1561,10 @@ static void test_seal_mmap_shrink(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 12 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else > FAIL_TEST_IF_FALSE(ret2 == ptr); > > @@ -1352,6 +1579,7 @@ static void test_seal_mremap_shrink_fixed(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1369,6 +1597,10 @@ static void test_seal_mremap_shrink_fixed(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else > FAIL_TEST_IF_FALSE(ret2 == newAddr); > > @@ -1383,6 +1615,7 @@ static void test_seal_mremap_expand_fixed(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(page_size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1400,6 +1633,10 @@ static void test_seal_mremap_expand_fixed(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(newAddr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else > FAIL_TEST_IF_FALSE(ret2 == newAddr); > > @@ -1414,6 +1651,7 @@ static void test_seal_mremap_move_fixed(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1430,6 +1668,10 @@ static void test_seal_mremap_move_fixed(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(newAddr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else > FAIL_TEST_IF_FALSE(ret2 == newAddr); > > @@ -1443,6 +1685,7 @@ static void test_seal_mremap_move_fixed_zero(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1460,9 +1703,12 @@ static void test_seal_mremap_move_fixed_zero(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > - } else { > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > + } else > FAIL_TEST_IF_FALSE(ret2 == 0); > - } > > REPORT_TEST_PASS(); > } > @@ -1474,6 +1720,7 @@ static void test_seal_mremap_move_dontunmap(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1488,6 +1735,10 @@ static void test_seal_mremap_move_dontunmap(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else { > /* kernel will allocate a new address */ > FAIL_TEST_IF_FALSE(ret2 != MAP_FAILED); > @@ -1503,6 +1754,7 @@ static void test_seal_mremap_move_dontunmap_anyaddr(bool seal) > unsigned long size = 4 * page_size; > int ret; > void *ret2; > + int prot; > > setup_single_address(size, &ptr); > FAIL_TEST_IF_FALSE(ptr != (void *)-1); > @@ -1529,6 +1781,10 @@ static void test_seal_mremap_move_dontunmap_anyaddr(bool seal) > if (seal) { > FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED); > FAIL_TEST_IF_FALSE(errno == EPERM); > + > + size = get_vma_size(ptr, &prot); > + FAIL_TEST_IF_FALSE(size == 4 * page_size); > + FAIL_TEST_IF_FALSE(prot == 0x4); > } else { > /* remap success and return ptr2 */ > FAIL_TEST_IF_FALSE(ret2 == ptr2); > @@ -1690,9 +1946,10 @@ static void test_seal_discard_ro_anon_on_pkey(bool seal) > /* sealing will take effect if PKRU deny write. */ > set_pkey(pkey, PKEY_DISABLE_WRITE); > ret = sys_madvise(ptr, size, MADV_DONTNEED); > - if (seal) > + if (seal) { > FAIL_TEST_IF_FALSE(ret < 0); > - else > + FAIL_TEST_IF_FALSE(errno == EPERM); > + } else > FAIL_TEST_IF_FALSE(!ret); > > /* base seal still apply. */ FWIW I can't review any of the above. It's still a hard to review patch with a bunch of unrelated changes including VMA size, random errno checks, random vma size checks, etc. Maybe break this down in separate patches. > @@ -1876,6 +2133,15 @@ int main(int argc, char **argv) > if (!pkey_supported()) > ksft_print_msg("PKEY not supported\n"); > > + /* > + * Possible reasons: > + * - unable to read /proc/pid/maps (unlikely) > + * - parsing error when reading /proc/pid/maps,e.g. len is not expected. > + * Is this "TOPDOWN" mapping or format change in /proc/pid/maps ? Why do we care? I don't think running selftests without a procfs mount is supported in any way... Format won't change. -- Pedro