cregit-Linux how code gets into the kernel

Release 4.12 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/cred.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 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 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. Biedermann59100.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. Biedermann25100.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
Linus Torvalds (pre-git)2382.14%150.00%
Eric W. Biedermann517.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
Linus Torvalds (pre-git)4544.12%222.22%
Eric Dumazet2524.51%222.22%
Eric W. Biedermann2120.59%222.22%
Catherine Zhang76.86%111.11%
David S. Miller21.96%111.11%
Pavel Emelyanov21.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 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 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
Linus Torvalds (pre-git)8951.45%120.00%
Eric W. Biedermann5531.79%120.00%
Herbert Pötzl148.09%120.00%
Catherine Zhang95.20%120.00%
David S. Miller63.47%120.00%
Total173100.00%5100.00%

#endif /* __LINUX_NET_SCM_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)24834.21%29.52%
Catherine Zhang19827.31%29.52%
Eric W. Biedermann19026.21%419.05%
Eric Dumazet304.14%314.29%
Herbert Pötzl141.93%14.76%
Benjamin LaHaise141.93%14.76%
Pavel Emelyanov81.10%14.76%
David S. Miller81.10%29.52%
Hannes Frederic Sowa50.69%14.76%
Dave Jones30.41%14.76%
Ingo Molnar30.41%14.76%
Matthew Wilcox30.41%14.76%
Linus Torvalds10.14%14.76%
Total725100.00%21100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.