Blame view

include/net/scm.h 2.74 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  #ifndef __LINUX_NET_SCM_H
  #define __LINUX_NET_SCM_H
  
  #include <linux/limits.h>
  #include <linux/net.h>
dc49c1f94   Catherine Zhang   [AF_UNIX]: Kernel...
6
  #include <linux/security.h>
b488893a3   Pavel Emelyanov   pid namespaces: c...
7
8
  #include <linux/pid.h>
  #include <linux/nsproxy.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
  
  /* Well, we should have at least one descriptor open
   * to accept passed FDs 8)
   */
c09edd6eb   Roland McGrath   avoid OPEN_MAX in...
13
  #define SCM_MAX_FD	255
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14

fd2c3ef76   Eric Dumazet   net: cleanup incl...
15
  struct scm_fp_list {
f8d570a47   David Miller   net: Fix recursiv...
16
17
18
  	struct list_head	list;
  	int			count;
  	struct file		*fp[SCM_MAX_FD];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
  };
fd2c3ef76   Eric Dumazet   net: cleanup incl...
20
  struct scm_cookie {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  	struct ucred		creds;		/* Skb credentials	*/
  	struct scm_fp_list	*fp;		/* Passed files		*/
877ce7c1b   Catherine Zhang   [AF_UNIX]: Datagr...
23
  #ifdef CONFIG_SECURITY_NETWORK
dc49c1f94   Catherine Zhang   [AF_UNIX]: Kernel...
24
  	u32			secid;		/* Passed security ID 	*/
877ce7c1b   Catherine Zhang   [AF_UNIX]: Datagr...
25
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
32
  };
  
  extern void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm);
  extern void scm_detach_fds_compat(struct msghdr *msg, struct scm_cookie *scm);
  extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm);
  extern void __scm_destroy(struct scm_cookie *scm);
  extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl);
dc49c1f94   Catherine Zhang   [AF_UNIX]: Kernel...
33
34
35
36
37
38
39
40
41
  #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 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
45
46
47
48
49
50
  static __inline__ void scm_destroy(struct scm_cookie *scm)
  {
  	if (scm && scm->fp)
  		__scm_destroy(scm);
  }
  
  static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
  			       struct scm_cookie *scm)
  {
1d541ddd7   Benjamin LaHaise   [AF_UNIX]: scm: b...
51
  	struct task_struct *p = current;
8192b0c48   David Howells   CRED: Wrap task c...
52
53
  	scm->creds.uid = current_uid();
  	scm->creds.gid = current_gid();
b488893a3   Pavel Emelyanov   pid namespaces: c...
54
  	scm->creds.pid = task_tgid_vnr(p);
1d541ddd7   Benjamin LaHaise   [AF_UNIX]: scm: b...
55
  	scm->fp = NULL;
dc49c1f94   Catherine Zhang   [AF_UNIX]: Kernel...
56
  	unix_get_peersec_dgram(sock, scm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
59
60
  	if (msg->msg_controllen <= 0)
  		return 0;
  	return __scm_send(sock, msg, scm);
  }
877ce7c1b   Catherine Zhang   [AF_UNIX]: Datagr...
61
62
63
  #ifdef CONFIG_SECURITY_NETWORK
  static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)
  {
dc49c1f94   Catherine Zhang   [AF_UNIX]: Kernel...
64
65
66
67
68
69
70
71
72
73
74
75
  	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);
  		}
  	}
877ce7c1b   Catherine Zhang   [AF_UNIX]: Datagr...
76
77
78
79
80
  }
  #else
  static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)
  { }
  #endif /* CONFIG_SECURITY_NETWORK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
  static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
  				struct scm_cookie *scm, int flags)
  {
fd2c3ef76   Eric Dumazet   net: cleanup incl...
84
  	if (!msg->msg_control) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
88
89
90
91
92
  		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))
  		put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds);
877ce7c1b   Catherine Zhang   [AF_UNIX]: Datagr...
93
  	scm_passec(sock, msg, scm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
96
97
98
99
100
101
  	if (!scm->fp)
  		return;
  	
  	scm_detach_fds(msg, scm);
  }
  
  
  #endif /* __LINUX_NET_SCM_H */