• Aneesh Kumar K.V's avatar
    powerpc/mm/pkeys: Make pkey access check work on execute_only_key · 19ab500e
    Aneesh Kumar K.V authored
    Jan reported that LTP mmap03 was getting stuck in a page fault loop
    after commit c46241a3 ("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: c46241a3 ("powerpc/pkeys: Check vma before returning key fault error to the user")
    Reported-by: default avatarJan Stancek <jstancek@redhat.com>
    Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    [mpe: Include bug report details etc. in the change log]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200627070147.297535-1-aneesh.kumar@linux.ibm.com
    19ab500e
pkeys.c 10.2 KB