cregit-Linux how code gets into the kernel

Release 4.7 include/net/scm.h

Directory: include/net
#ifndef __LINUX_NET_SCM_H

#define __LINUX_NET_SCM_H

#include <linux/limits.h>
#include <linux/net.h>
#include <linux/security.h>
#include <linux/pid.h>
#include <linux/nsproxy.h>

/* Well, we should have at least one descriptor open
 * to accept passed FDs 8)
 */

#define SCM_MAX_FD	253


struct scm_creds {
	
u32	pid;
	
kuid_t	uid;
	
kgid_t	gid;
};


struct scm_fp_list {
	
short			count;
	
short			max;
	
struct user_struct	*user;
	
struct file		*fp[SCM_MAX_FD];
};


struct scm_cookie {
	
struct pid		*pid;		/* Skb credentials */
	
struct scm_fp_list	*fp;		/* Passed files         */
	
struct scm_creds	creds;		/* Skb credentials      */
#ifdef CONFIG_SECURITY_NETWORK
	
u32			secid;		/* Passed security ID   */
#endif
};

void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm);
void scm_detach_fds_compat(struct msghdr *msg, struct scm_cookie *scm);
int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm);
void __scm_destroy(struct scm_cookie *scm);
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); }

Contributors

PersonTokensPropCommitsCommitProp
catherine zhangcatherine zhang29100.00%1100.00%
Total29100.00%1100.00%

#else
static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) { }

Contributors

PersonTokensPropCommitsCommitProp
catherine zhangcatherine zhang16100.00%1100.00%
Total16100.00%1100.00%

#endif /* CONFIG_SECURITY_NETWORK */
static __inline__ void scm_set_cred(struct scm_cookie *scm, struct pid *pid, kuid_t uid, kgid_t gid) { scm->pid = get_pid(pid); scm->creds.pid = pid_vnr(pid); scm->creds.uid = uid; scm->creds.gid = gid; }

Contributors

PersonTokensPropCommitsCommitProp
eric w. biedermaneric w. biederman59100.00%3100.00%
Total59100.00%3100.00%


static __inline__ void scm_destroy_cred(struct scm_cookie *scm) { put_pid(scm->pid); scm->pid = NULL; }

Contributors

PersonTokensPropCommitsCommitProp
eric w. biedermaneric w. biederman25100.00%1100.00%
Total25100.00%1100.00%


static __inline__ void scm_destroy(struct scm_cookie *scm) { scm_destroy_cred(scm); if (scm->fp) __scm_destroy(scm); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git2382.14%150.00%
eric w. biedermaneric w. biederman517.86%150.00%
Total28100.00%2100.00%


static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm, bool forcecreds) { memset(scm, 0, sizeof(*scm)); scm->creds.uid = INVALID_UID; scm->creds.gid = INVALID_GID; if (forcecreds) scm_set_cred(scm, task_tgid(current), current_uid(), current_gid()); unix_get_peersec_dgram(sock, scm); if (msg->msg_controllen <= 0) return 0; return __scm_send(sock, msg, scm); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4544.12%222.22%
eric dumazeteric dumazet2524.51%222.22%
eric w. biedermaneric w. biederman2120.59%222.22%
catherine zhangcatherine zhang76.86%111.11%
pavel emelianovpavel emelianov21.96%111.11%
david s. millerdavid s. miller21.96%111.11%
Total102100.00%9100.00%

#ifdef CONFIG_SECURITY_NETWORK
static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) { 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); } } }

Contributors

PersonTokensPropCommitsCommitProp
catherine zhangcatherine zhang88100.00%2100.00%
Total88100.00%2100.00%

#else
static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) { }

Contributors

PersonTokensPropCommitsCommitProp
catherine zhangcatherine zhang21100.00%1100.00%
Total21100.00%1100.00%

#endif /* CONFIG_SECURITY_NETWORK */
static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm, int flags) { if (!msg->msg_control) { if (test_bit(SOCK_PASSCRED, &sock->flags) || scm->fp) msg->msg_flags |= MSG_CTRUNC; scm_destroy(scm); return; } if (test_bit(SOCK_PASSCRED, &sock->flags)) { struct user_namespace *current_ns = current_user_ns(); struct ucred ucreds = { .pid = scm->creds.pid, .uid = from_kuid_munged(current_ns, scm->creds.uid), .gid = from_kgid_munged(current_ns, scm->creds.gid), }; put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(ucreds), &ucreds); } scm_destroy_cred(scm); scm_passec(sock, msg, scm); if (!scm->fp) return; scm_detach_fds(msg, scm); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git8951.45%120.00%
eric w. biedermaneric w. biederman5531.79%120.00%
herbert poetzlherbert poetzl148.09%120.00%
catherine zhangcatherine zhang95.20%120.00%
david s. millerdavid s. miller63.47%120.00%
Total173100.00%5100.00%

#endif /* __LINUX_NET_SCM_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git24834.35%210.00%
catherine zhangcatherine zhang19827.42%210.00%
eric w. biedermaneric w. biederman19026.32%420.00%
eric dumazeteric dumazet304.16%315.00%
herbert poetzlherbert poetzl141.94%15.00%
benjamin lahaisebenjamin lahaise141.94%15.00%
david s. millerdavid s. miller81.11%210.00%
pavel emelianovpavel emelianov81.11%15.00%
hannes frederic sowahannes frederic sowa50.69%15.00%
dave jonesdave jones30.42%15.00%
matthew wilcoxmatthew wilcox30.42%15.00%
linus torvaldslinus torvalds10.14%15.00%
Total722100.00%20100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}