afs: Fix directory permissions check
authorDavid Howells <dhowells@redhat.com>
Wed, 16 May 2018 20:25:46 +0000 (21:25 +0100)
committerDavid Howells <dhowells@redhat.com>
Wed, 16 May 2018 20:35:23 +0000 (21:35 +0100)
commit378831e4daec75fbba6d3612bcf3b4dd00ddbf08
tree66cdf5ae7efa2fe90491caa6cd15c6158791f17e
parent21b9f1c7e319f654de3b2574fe8d4e4114c9143f
afs: Fix directory permissions check

Doing faccessat("/afs/some/directory", 0) triggers a BUG in the permissions
check code.

Fix this by just removing the BUG section.  If no permissions are asked
for, just return okay if the file exists.

Also:

 (1) Split up the directory check so that it has separate if-statements
     rather than if-else-if (e.g. checking for MAY_EXEC shouldn't skip the
     check for MAY_READ and MAY_WRITE).

 (2) Check for MAY_CHDIR as MAY_EXEC.

Without the main fix, the following BUG may occur:

 kernel BUG at fs/afs/security.c:386!
 invalid opcode: 0000 [#1] SMP PTI
 ...
 RIP: 0010:afs_permission+0x19d/0x1a0 [kafs]
 ...
 Call Trace:
  ? inode_permission+0xbe/0x180
  ? do_faccessat+0xdc/0x270
  ? do_syscall_64+0x60/0x1f0
  ? entry_SYSCALL_64_after_hwframe+0x49/0xbe

Fixes: 00d3b7a4533e ("[AFS]: Add security support.")
Reported-by: Jonathan Billings <jsbillings@jsbillings.org>
Signed-off-by: David Howells <dhowells@redhat.com>
fs/afs/security.c