Patch "x86/pkeys/selftests: Add PROT_EXEC test" has been added to the 4.16-stable tree
Subsystems (3)
[email protected]
AppliedThis is a note to let you know that I've just added the patch titled
x86/pkeys/selftests: Add PROT_EXEC test
to the 4.16-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-pkeys-selftests-add-prot_exec-test.patch
and it can be found in the queue-4.16 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sun Jun 17 12:07:34 CEST 2018
From: Dave Hansen <[email protected]>
Date: Wed, 9 May 2018 10:13:48 -0700
Subject: x86/pkeys/selftests: Add PROT_EXEC test
From: Dave Hansen <[email protected]>
[ Upstream commit 6af17cf89e99b64cf1f660bf848755442ab2f047 ]
Under the covers, implement executable-only memory with protection keys when userspace calls mprotect(PROT_EXEC).
But, we did not have a selftest for that. Now we do.
--- tools/testing/selftests/x86/protection_keys.c | 44 ++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)
tools/testing/selftests/x86/protection_keys.c +44 -0
@@ -1303,6 +1303,49 @@ void test_executing_on_unreadable_memoryexpected_pk_fault (pkey); } +void test_implicit_mprotect_exec_only_memory (int *ptr,u16 pkey) +{ +void *p1; +int scratch; +int ptr_contents; +int ret; + +dprintf1 ("%s() start\n" , __func__); + + p1 =get_pointer_to_instructions (); +lots_o_noops_around_write (&scratch); + ptr_contents =read_ptr (p1); +dprintf2 ("ptr (%p) contents@%d: %x\n" , p1, __LINE__, ptr_contents); + +/* Use a *normal* mprotect(), not mprotect_pkey(): */ + ret =mprotect (p1,PAGE_SIZE ,PROT_EXEC ); +pkey_assert (!ret); + +dprintf2 ("pkru: %x\n" ,rdpkru ()); + +/* Make sure this is an *instruction* fault */ +madvise (p1,PAGE_SIZE ,MADV_DONTNEED ); +lots_o_noops_around_write (&scratch); +do_not_expect_pk_fault ("executing on PROT_EXEC memory" ); + ptr_contents =read_ptr (p1); +dprintf2 ("ptr (%p) contents@%d: %x\n" , p1, __LINE__, ptr_contents); +expected_pk_fault (UNKNOWN_PKEY ); + +/* +* Put the memory back to non-PROT_EXEC. Should clear the +* exec-only pkey off the VMA and allow it to be readable +* again. Go to PROT_NONE first to check for a kernel bug +* that did not clear the pkey when doing PROT_NONE. +*/ + ret =mprotect (p1,PAGE_SIZE ,PROT_NONE ); +pkey_assert (!ret); + + ret =mprotect (p1,PAGE_SIZE ,PROT_READ |PROT_EXEC ); +pkey_assert (!ret); + ptr_contents =read_ptr (p1); +do_not_expect_pk_fault ("plain read on recently PROT_EXEC area" ); +} +void test_mprotect_pkey_on_unsupported_cpu (int *ptr,u16 pkey) {int size =PAGE_SIZE ;
@@ -1327,6 +1370,7 @@ void (*pkey_tests[])(int *ptr, u16 pkey) test_kernel_gup_of_access_disabled_region, test_kernel_gup_write_to_write_disabled_region, test_executing_on_unreadable_memory, + test_implicit_mprotect_exec_only_memory, test_ptrace_of_child, test_pkey_syscalls_on_non_allocated_pkey, test_pkey_syscalls_bad_args,
Patches currently in stable-queue which might be from [email protected] are
queue-4.16/x86-pkeys-selftests-factor-out-instruction-page.patch queue-4.16/x86-pkeys-selftests-fix-pointer-math.patch queue-4.16/x86-pkeys-selftests-adjust-the-self-test-to-fresh-distros-that-export-the-pkeys-abi.patch queue-4.16/x86-pkeys-selftests-add-a-test-for-pkey-0.patch queue-4.16/x86-pkeys-selftests-stop-using-assert.patch queue-4.16/x86-pkeys-selftests-save-off-prot-for-allocations.patch queue-4.16/x86-pkeys-selftests-remove-dead-debugging-code-fix-dprint_in_signal.patch queue-4.16/x86-mpx-selftests-adjust-the-self-test-to-fresh-distros-that-export-the-mpx-abi.patch queue-4.16/x86-pkeys-selftests-add-prot_exec-test.patch queue-4.16/x86-pkeys-selftests-allow-faults-on-unknown-keys.patch queue-4.16/x86-pkeys-selftests-give-better-unexpected-fault-error-messages.patch queue-4.16/x86-pkeys-selftests-avoid-printf-in-signal-deadlocks.patch queue-4.16/x86-pkeys-selftests-fix-pkey-exhaustion-test-off-by-one.patch