aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-06-19 01:50:08 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-07-20 01:43:05 -0400
commit4cf27141cbe0239f48ec6f0b37bad347d51d1785 (patch)
treeef2b247dc3cbbd795331b8937d3c29e5fc3c7b85 /fs
parent43e15cdbefea4ce6d68113de98d4f61c0cf45687 (diff)
make exec_permission(dir) really equivalent to inode_permission(dir, MAY_EXEC)
capability overrides apply only to the default case; if fs has ->permission() that does _not_ call generic_permission(), we have no business doing them. Moreover, if it has ->permission() that does call generic_permission(), we have no need to recheck capabilities. Besides, the capability overrides should apply only if we got EACCES from acl_permission_check(); any other value (-EIO, etc.) should be returned to caller, capabilities or not capabilities. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/namei.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 5ba42c453e31..7c8a93042e63 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -584,19 +584,19 @@ static inline int exec_permission(struct inode *inode, unsigned int flags)
584 584
585 if (inode->i_op->permission) { 585 if (inode->i_op->permission) {
586 ret = inode->i_op->permission(inode, MAY_EXEC, flags); 586 ret = inode->i_op->permission(inode, MAY_EXEC, flags);
587 if (likely(!ret))
588 goto ok;
587 } else { 589 } else {
588 ret = acl_permission_check(inode, MAY_EXEC, flags, 590 ret = acl_permission_check(inode, MAY_EXEC, flags,
589 inode->i_op->check_acl); 591 inode->i_op->check_acl);
592 if (likely(!ret))
593 goto ok;
594 if (ret != -EACCES)
595 return ret;
596 if (ns_capable(ns, CAP_DAC_OVERRIDE) ||
597 ns_capable(ns, CAP_DAC_READ_SEARCH))
598 goto ok;
590 } 599 }
591 if (likely(!ret))
592 goto ok;
593 if (ret == -ECHILD)
594 return ret;
595
596 if (ns_capable(ns, CAP_DAC_OVERRIDE) ||
597 ns_capable(ns, CAP_DAC_READ_SEARCH))
598 goto ok;
599
600 return ret; 600 return ret;
601ok: 601ok:
602 return security_inode_exec_permission(inode, flags); 602 return security_inode_exec_permission(inode, flags);