powerpc/mm/pkeys: Make pkey access check work on execute_only_key
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Sat, 27 Jun 2020 07:01:46 +0000 (12:31 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Jun 2020 06:17:02 +0000 (16:17 +1000)
commit19ab500edb5d6020010caba48ce3b4ce4182ab63
tree3b485662482b8b6384e623d7a242d91f9502b2bd
parent896066aa0685af3434637998b76218c2045142a8
powerpc/mm/pkeys: Make pkey access check work on execute_only_key

Jan reported that LTP mmap03 was getting stuck in a page fault loop
after commit c46241a370a6 ("powerpc/pkeys: Check vma before returning
key fault error to the user"), as well as a minimised reproducer:

  #include <fcntl.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/mman.h>

  int main(int ac, char **av)
  {
   int page_sz = getpagesize();
   int fildes;
   char *addr;

   fildes = open("tempfile", O_WRONLY | O_CREAT, 0666);
   write(fildes, &fildes, sizeof(fildes));
   close(fildes);

   fildes = open("tempfile", O_RDONLY);
   unlink("tempfile");

   addr = mmap(0, page_sz, PROT_EXEC, MAP_FILE | MAP_PRIVATE, fildes, 0);

   printf("%d\n", *addr);
   return 0;
  }

And noticed that access_pkey_error() in page fault handler now always
seem to return false:

  __do_page_fault
    access_pkey_error(is_pkey: 1, is_exec: 0, is_write: 0)
      arch_vma_access_permitted
pkey_access_permitted
  if (!is_pkey_enabled(pkey))
    return true
      return false

pkey_access_permitted() should not check if the pkey is available in
UAMOR (using is_pkey_enabled()). The kernel needs to do that check
only when allocating keys. This also makes sure the execute_only_key
which is marked as non-manageable via UAMOR is handled correctly in
pkey_access_permitted(), and fixes the bug.

Fixes: c46241a370a6 ("powerpc/pkeys: Check vma before returning key fault error to the user")
Reported-by: Jan Stancek <jstancek@redhat.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
[mpe: Include bug report details etc. in the change log]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200627070147.297535-1-aneesh.kumar@linux.ibm.com
arch/powerpc/mm/book3s64/pkeys.c