mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Security: Add hook to calculate context based on a negative dentry.
There is a time where we need to calculate a context without the inode having been created yet. To do this we take the negative dentry and calculate a context based on the process and the parent directory contexts. Acked-by: Eric Paris <[email protected]> Acked-by: James Morris <[email protected]> Signed-off-by: Matthew N. Dodd <[email protected]> Signed-off-by: Miguel Rodel Felipe <[email protected]> Signed-off-by: Phua Eu Gene <[email protected]> Signed-off-by: Khin Mi Mi Aung <[email protected]> Signed-off-by: Steve Dickson <[email protected]> Signed-off-by: Trond Myklebust <[email protected]>
This commit is contained in:
parent
4488cc96c5
commit
d47be3dfec
4 changed files with 80 additions and 0 deletions
|
|
@ -2515,6 +2515,40 @@ static void selinux_inode_free_security(struct inode *inode)
|
|||
inode_free_security(inode);
|
||||
}
|
||||
|
||||
static int selinux_dentry_init_security(struct dentry *dentry, int mode,
|
||||
struct qstr *name, void **ctx,
|
||||
u32 *ctxlen)
|
||||
{
|
||||
const struct cred *cred = current_cred();
|
||||
struct task_security_struct *tsec;
|
||||
struct inode_security_struct *dsec;
|
||||
struct superblock_security_struct *sbsec;
|
||||
struct inode *dir = dentry->d_parent->d_inode;
|
||||
u32 newsid;
|
||||
int rc;
|
||||
|
||||
tsec = cred->security;
|
||||
dsec = dir->i_security;
|
||||
sbsec = dir->i_sb->s_security;
|
||||
|
||||
if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
|
||||
newsid = tsec->create_sid;
|
||||
} else {
|
||||
rc = security_transition_sid(tsec->sid, dsec->sid,
|
||||
inode_mode_to_security_class(mode),
|
||||
name,
|
||||
&newsid);
|
||||
if (rc) {
|
||||
printk(KERN_WARNING
|
||||
"%s: security_transition_sid failed, rc=%d\n",
|
||||
__func__, -rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
return security_sid_to_context(newsid, (char **)ctx, ctxlen);
|
||||
}
|
||||
|
||||
static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
|
||||
const struct qstr *qstr, char **name,
|
||||
void **value, size_t *len)
|
||||
|
|
@ -5562,6 +5596,7 @@ static struct security_operations selinux_ops = {
|
|||
.sb_clone_mnt_opts = selinux_sb_clone_mnt_opts,
|
||||
.sb_parse_opts_str = selinux_parse_opts_str,
|
||||
|
||||
.dentry_init_security = selinux_dentry_init_security,
|
||||
|
||||
.inode_alloc_security = selinux_inode_alloc_security,
|
||||
.inode_free_security = selinux_inode_free_security,
|
||||
|
|
|
|||
Loading…
Reference in a new issue