diff options
author | James Morris <james.l.morris@oracle.com> | 2015-12-26 08:11:13 +0300 |
---|---|---|
committer | James Morris <james.l.morris@oracle.com> | 2015-12-26 08:11:13 +0300 |
commit | aa98b942cbf305cf2abe5dc3aff11f579c7d7fdc (patch) | |
tree | 0fe979dc49a794ae50af585062e75ebcf8427900 /security | |
parent | 37babe4ec610ff288a60aa79619b3d2f00bcfd89 (diff) | |
parent | 81bd0d56298f93af6ac233d8a7e8b29aa4b094b7 (diff) | |
download | linux-aa98b942cbf305cf2abe5dc3aff11f579c7d7fdc.tar.xz |
Merge branch 'smack-for-4.5' of https://github.com/cschaufler/smack-next into next
Diffstat (limited to 'security')
-rw-r--r-- | security/smack/smack_lsm.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index ac7436f1bc2b..e3d55334c50d 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1860,12 +1860,34 @@ static int smack_file_receive(struct file *file) int may = 0; struct smk_audit_info ad; struct inode *inode = file_inode(file); + struct socket *sock; + struct task_smack *tsp; + struct socket_smack *ssp; if (unlikely(IS_PRIVATE(inode))) return 0; smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); smk_ad_setfield_u_fs_path(&ad, file->f_path); + + if (S_ISSOCK(inode->i_mode)) { + sock = SOCKET_I(inode); + ssp = sock->sk->sk_security; + tsp = current_security(); + /* + * If the receiving process can't write to the + * passed socket or if the passed socket can't + * write to the receiving process don't accept + * the passed socket. + */ + rc = smk_access(tsp->smk_task, ssp->smk_out, MAY_WRITE, &ad); + rc = smk_bu_file(file, may, rc); + if (rc < 0) + return rc; + rc = smk_access(ssp->smk_in, tsp->smk_task, MAY_WRITE, &ad); + rc = smk_bu_file(file, may, rc); + return rc; + } /* * This code relies on bitmasks. */ @@ -3758,7 +3780,7 @@ static int smack_socket_sendmsg(struct socket *sock, struct msghdr *msg, if (sip == NULL) return 0; - switch (sip->sin_family) { + switch (sock->sk->sk_family) { case AF_INET: rc = smack_netlabel_send(sock->sk, sip); break; |