diff options
Diffstat (limited to 'include/net/scm.h')
| -rw-r--r-- | include/net/scm.h | 29 | 
1 files changed, 25 insertions, 4 deletions
diff --git a/include/net/scm.h b/include/net/scm.h index 02daa097cdc..5637d5e22d5 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -3,6 +3,7 @@  #include <linux/limits.h>  #include <linux/net.h> +#include <linux/security.h>  /* Well, we should have at least one descriptor open   * to accept passed FDs 8) @@ -20,8 +21,7 @@ struct scm_cookie  	struct ucred		creds;		/* Skb credentials	*/  	struct scm_fp_list	*fp;		/* Passed files		*/  #ifdef CONFIG_SECURITY_NETWORK -	char			*secdata;	/* Security context	*/ -	u32			seclen;		/* Security length	*/ +	u32			secid;		/* Passed security ID 	*/  #endif  	unsigned long		seq;		/* Connection seqno	*/  }; @@ -32,6 +32,16 @@ extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie  extern void __scm_destroy(struct scm_cookie *scm);  extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl); +#ifdef CONFIG_SECURITY_NETWORK +static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) +{ +	security_socket_getpeersec_dgram(sock, NULL, &scm->secid); +} +#else +static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) +{ } +#endif /* CONFIG_SECURITY_NETWORK */ +  static __inline__ void scm_destroy(struct scm_cookie *scm)  {  	if (scm && scm->fp) @@ -47,6 +57,7 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,  	scm->creds.pid = p->tgid;  	scm->fp = NULL;  	scm->seq = 0; +	unix_get_peersec_dgram(sock, scm);  	if (msg->msg_controllen <= 0)  		return 0;  	return __scm_send(sock, msg, scm); @@ -55,8 +66,18 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,  #ifdef CONFIG_SECURITY_NETWORK  static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)  { -	if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL) -		put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, scm->seclen, scm->secdata); +	char *secdata; +	u32 seclen; +	int err; + +	if (test_bit(SOCK_PASSSEC, &sock->flags)) { +		err = security_secid_to_secctx(scm->secid, &secdata, &seclen); + +		if (!err) { +			put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata); +			security_release_secctx(secdata, seclen); +		} +	}  }  #else  static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)  |