diff options
author | Paul Moore <paul.moore@hp.com> | 2008-01-29 08:38:23 -0500 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2008-01-29 16:17:25 -0500 |
commit | 220deb966ea51e0dedb6a187c0763120809f3e64 (patch) | |
tree | 7d0e5dd8048907c364b4eeff294991937b466c7e /security/selinux/netlabel.c | |
parent | f67f4f315f31e7907779adb3296fb6682e755342 (diff) |
SELinux: Better integration between peer labeling subsystems
Rework the handling of network peer labels so that the different peer labeling
subsystems work better together. This includes moving both subsystems to a
single "peer" object class which involves not only changes to the permission
checks but an improved method of consolidating multiple packet peer labels.
As part of this work the inbound packet permission check code has been heavily
modified to handle both the old and new behavior in as sane a fashion as
possible.
Signed-off-by: Paul Moore <paul.moore@hp.com>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux/netlabel.c')
-rw-r--r-- | security/selinux/netlabel.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c index f4bcbf12a4c9..b54d28fd3b5d 100644 --- a/security/selinux/netlabel.c +++ b/security/selinux/netlabel.c | |||
@@ -137,7 +137,6 @@ void selinux_netlbl_sk_security_clone(struct sk_security_struct *ssec, | |||
137 | * lock as other threads could have access to ssec */ | 137 | * lock as other threads could have access to ssec */ |
138 | rcu_read_lock(); | 138 | rcu_read_lock(); |
139 | selinux_netlbl_sk_security_reset(newssec, ssec->sk->sk_family); | 139 | selinux_netlbl_sk_security_reset(newssec, ssec->sk->sk_family); |
140 | newssec->sclass = ssec->sclass; | ||
141 | rcu_read_unlock(); | 140 | rcu_read_unlock(); |
142 | } | 141 | } |
143 | 142 | ||
@@ -146,6 +145,7 @@ void selinux_netlbl_sk_security_clone(struct sk_security_struct *ssec, | |||
146 | * @skb: the packet | 145 | * @skb: the packet |
147 | * @family: protocol family | 146 | * @family: protocol family |
148 | * @base_sid: the SELinux SID to use as a context for MLS only attributes | 147 | * @base_sid: the SELinux SID to use as a context for MLS only attributes |
148 | * @type: NetLabel labeling protocol type | ||
149 | * @sid: the SID | 149 | * @sid: the SID |
150 | * | 150 | * |
151 | * Description: | 151 | * Description: |
@@ -157,6 +157,7 @@ void selinux_netlbl_sk_security_clone(struct sk_security_struct *ssec, | |||
157 | int selinux_netlbl_skbuff_getsid(struct sk_buff *skb, | 157 | int selinux_netlbl_skbuff_getsid(struct sk_buff *skb, |
158 | u16 family, | 158 | u16 family, |
159 | u32 base_sid, | 159 | u32 base_sid, |
160 | u32 *type, | ||
160 | u32 *sid) | 161 | u32 *sid) |
161 | { | 162 | { |
162 | int rc; | 163 | int rc; |
@@ -177,6 +178,7 @@ int selinux_netlbl_skbuff_getsid(struct sk_buff *skb, | |||
177 | netlbl_cache_add(skb, &secattr); | 178 | netlbl_cache_add(skb, &secattr); |
178 | } else | 179 | } else |
179 | *sid = SECSID_NULL; | 180 | *sid = SECSID_NULL; |
181 | *type = secattr.type; | ||
180 | netlbl_secattr_destroy(&secattr); | 182 | netlbl_secattr_destroy(&secattr); |
181 | 183 | ||
182 | return rc; | 184 | return rc; |
@@ -194,13 +196,10 @@ int selinux_netlbl_skbuff_getsid(struct sk_buff *skb, | |||
194 | */ | 196 | */ |
195 | void selinux_netlbl_sock_graft(struct sock *sk, struct socket *sock) | 197 | void selinux_netlbl_sock_graft(struct sock *sk, struct socket *sock) |
196 | { | 198 | { |
197 | struct inode_security_struct *isec = SOCK_INODE(sock)->i_security; | ||
198 | struct sk_security_struct *sksec = sk->sk_security; | 199 | struct sk_security_struct *sksec = sk->sk_security; |
199 | struct netlbl_lsm_secattr secattr; | 200 | struct netlbl_lsm_secattr secattr; |
200 | u32 nlbl_peer_sid; | 201 | u32 nlbl_peer_sid; |
201 | 202 | ||
202 | sksec->sclass = isec->sclass; | ||
203 | |||
204 | rcu_read_lock(); | 203 | rcu_read_lock(); |
205 | 204 | ||
206 | if (sksec->nlbl_state != NLBL_REQUIRE) { | 205 | if (sksec->nlbl_state != NLBL_REQUIRE) { |
@@ -238,11 +237,8 @@ int selinux_netlbl_socket_post_create(struct socket *sock) | |||
238 | { | 237 | { |
239 | int rc = 0; | 238 | int rc = 0; |
240 | struct sock *sk = sock->sk; | 239 | struct sock *sk = sock->sk; |
241 | struct inode_security_struct *isec = SOCK_INODE(sock)->i_security; | ||
242 | struct sk_security_struct *sksec = sk->sk_security; | 240 | struct sk_security_struct *sksec = sk->sk_security; |
243 | 241 | ||
244 | sksec->sclass = isec->sclass; | ||
245 | |||
246 | rcu_read_lock(); | 242 | rcu_read_lock(); |
247 | if (sksec->nlbl_state == NLBL_REQUIRE) | 243 | if (sksec->nlbl_state == NLBL_REQUIRE) |
248 | rc = selinux_netlbl_sock_setsid(sk, sksec->sid); | 244 | rc = selinux_netlbl_sock_setsid(sk, sksec->sid); |