From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751839AbdBXA2z (ORCPT ); Thu, 23 Feb 2017 19:28:55 -0500 Received: from mga09.intel.com ([134.134.136.24]:43843 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751403AbdBXA2x (ORCPT ); Thu, 23 Feb 2017 19:28:53 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,199,1484035200"; d="scan'208";a="1134144214" Subject: [PATCH] [v2] selftests, x86, pkeys: test with random, unallocated protection keys To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, Dave Hansen , kirill.shutemov@linux.intel.com, shuah@kernel.org, linux-kselftest@vger.kernel.org From: Dave Hansen Date: Thu, 23 Feb 2017 16:23:39 -0800 Message-Id: <20170224002339.672BEF68@viggo.jf.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Changes from v1: * Also generate random negative numbers for protection key -- From: Dave Hansen The kernel pkeys code had a minor bug where it did some large shifts to an integer which is undefined behavior in C. It didn't cause any real harm, but it is screwy behavior that the kernel should have rejected. Add a test case for this. Signed-off-by: Dave Hansen Cc: Kirill A. Shutemov Cc: Shuah Khan Cc: linux-kselftest@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: x86@kernel.org --- b/tools/testing/selftests/x86/protection_keys.c | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff -puN tools/testing/selftests/x86/protection_keys.c~pkeys-better-selftests-of-random-pkey tools/testing/selftests/x86/protection_keys.c --- a/tools/testing/selftests/x86/protection_keys.c~pkeys-better-selftests-of-random-pkey 2017-02-23 14:24:34.323744591 -0800 +++ b/tools/testing/selftests/x86/protection_keys.c 2017-02-23 16:14:06.101005910 -0800 @@ -1123,6 +1123,30 @@ void test_pkey_syscalls_on_non_allocated } /* Assumes that all pkeys other than 'pkey' are unallocated */ +void test_pkey_syscalls_on_non_allocated_random_pkey(int *ptr, u16 pkey) +{ + int err; + int nr_tests = 0; + + while (nr_tests < 1000) { + int test_pkey = rand() - RAND_MAX/2; + + /* do not test with the pkey we know is good */ + if (pkey == test_pkey) + continue; + + dprintf1("trying free/mprotect bad pkey: %2d\n", test_pkey); + err = sys_pkey_free(test_pkey); + pkey_assert(err); + + err = sys_mprotect_pkey(ptr, PAGE_SIZE, PROT_READ, test_pkey); + pkey_assert(err); + + nr_tests++; + } +} + +/* Assumes that all pkeys other than 'pkey' are unallocated */ void test_pkey_syscalls_bad_args(int *ptr, u16 pkey) { int err; @@ -1320,6 +1344,7 @@ void (*pkey_tests[])(int *ptr, u16 pkey) test_executing_on_unreadable_memory, test_ptrace_of_child, test_pkey_syscalls_on_non_allocated_pkey, + test_pkey_syscalls_on_non_allocated_random_pkey, test_pkey_syscalls_bad_args, test_pkey_alloc_exhaust, }; _