aboutsummaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2003-10-01 10:58:48 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-10-01 10:58:48 -0700
commitd5f1f9dd5f3c03cc2b9398354fc3c8f6355fd9cc (patch)
tree792214c5becec2a574d093614b686b879b72c76c /security
parent4dfbe983b14062c6299b865d1535b2a478c14378 (diff)
downloadhistory-d5f1f9dd5f3c03cc2b9398354fc3c8f6355fd9cc.tar.gz
[PATCH] Pass nameidata to security_inode_permission hook
From: Stephen Smalley <sds@epoch.ncsc.mil> This patch changes the security_inode_permission hook to also take a nameidata parameter in addition to the existing inode and mask parameters. A nameidata is already passed (although sometimes NULL) to fs/namei.c:permission(), and the patch changes exec_permission_lite() to also take a nameidata parameter so that it can pass it along to the security hook. The patch includes corresponding changes to the SELinux module to use the nameidata information when it is available; this allows SELinux to include pathname information in audit messages when a nameidata structure was supplied.
Diffstat (limited to 'security')
-rw-r--r--security/dummy.c2
-rw-r--r--security/selinux/hooks.c7
2 files changed, 7 insertions, 2 deletions
diff --git a/security/dummy.c b/security/dummy.c
index 76c6560a76c253..336e92cce44e18 100644
--- a/security/dummy.c
+++ b/security/dummy.c
@@ -364,7 +364,7 @@ static int dummy_inode_follow_link (struct dentry *dentry,
return 0;
}
-static int dummy_inode_permission (struct inode *inode, int mask)
+static int dummy_inode_permission (struct inode *inode, int mask, struct nameidata *nd)
{
return 0;
}
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index d39090fea44872..e9301f2b0dca77 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -1730,13 +1730,18 @@ static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *na
return dentry_has_perm(current, NULL, dentry, FILE__READ);
}
-static int selinux_inode_permission(struct inode *inode, int mask)
+static int selinux_inode_permission(struct inode *inode, int mask,
+ struct nameidata *nd)
{
if (!mask) {
/* No permission to check. Existence test. */
return 0;
}
+ if (nd && nd->dentry)
+ return dentry_has_perm(current, nd->mnt, nd->dentry,
+ file_mask_to_av(inode->i_mode, mask));
+
return inode_has_perm(current, inode,
file_mask_to_av(inode->i_mode, mask), NULL, NULL);
}