aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Moore <paul.moore@hp.com>2007-06-07 21:37:15 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-06-08 16:33:09 -0400
commitba6ff9f2b5c6018b293bd21083ffaa5ad710e671 (patch)
tree7a868d3a1948ab9e1aaf7b6e64e114e0f790370d
parent6363097cc4d182f93788131b5d8f72aa91d950a0 (diff)
[NetLabel]: consolidate the struct socket/sock handling to just struct sock
The current NetLabel code has some redundant APIs which allow both "struct socket" and "struct sock" types to be used; this may have made sense at some point but it is wasteful now. Remove the functions that operate on sockets and convert the callers. Not only does this make the code smaller and more consistent but it pushes the locking burden up to the caller which can be more intelligent about the locks. Also, perform the same conversion (socket to sock) on the SELinux/NetLabel glue code where it make sense. Signed-off-by: Paul Moore <paul.moore@hp.com> Acked-by: James Morris <jmorris@namei.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/cipso_ipv4.h20
-rw-r--r--include/net/netlabel.h14
-rw-r--r--net/ipv4/cipso_ipv4.c41
-rw-r--r--net/netlabel/netlabel_kapi.c43
-rw-r--r--security/selinux/netlabel.c36
5 files changed, 47 insertions, 107 deletions
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h
index 4f90f5554fac..a6bb94530cfd 100644
--- a/include/net/cipso_ipv4.h
+++ b/include/net/cipso_ipv4.h
@@ -203,12 +203,10 @@ static inline int cipso_v4_cache_add(const struct sk_buff *skb,
203 203
204#ifdef CONFIG_NETLABEL 204#ifdef CONFIG_NETLABEL
205void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway); 205void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway);
206int cipso_v4_socket_setattr(const struct socket *sock, 206int cipso_v4_sock_setattr(struct sock *sk,
207 const struct cipso_v4_doi *doi_def, 207 const struct cipso_v4_doi *doi_def,
208 const struct netlbl_lsm_secattr *secattr); 208 const struct netlbl_lsm_secattr *secattr);
209int cipso_v4_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr); 209int cipso_v4_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr);
210int cipso_v4_socket_getattr(const struct socket *sock,
211 struct netlbl_lsm_secattr *secattr);
212int cipso_v4_skbuff_getattr(const struct sk_buff *skb, 210int cipso_v4_skbuff_getattr(const struct sk_buff *skb,
213 struct netlbl_lsm_secattr *secattr); 211 struct netlbl_lsm_secattr *secattr);
214int cipso_v4_validate(unsigned char **option); 212int cipso_v4_validate(unsigned char **option);
@@ -220,9 +218,9 @@ static inline void cipso_v4_error(struct sk_buff *skb,
220 return; 218 return;
221} 219}
222 220
223static inline int cipso_v4_socket_setattr(const struct socket *sock, 221static inline int cipso_v4_sock_setattr(struct sock *sk,
224 const struct cipso_v4_doi *doi_def, 222 const struct cipso_v4_doi *doi_def,
225 const struct netlbl_lsm_secattr *secattr) 223 const struct netlbl_lsm_secattr *secattr)
226{ 224{
227 return -ENOSYS; 225 return -ENOSYS;
228} 226}
@@ -233,12 +231,6 @@ static inline int cipso_v4_sock_getattr(struct sock *sk,
233 return -ENOSYS; 231 return -ENOSYS;
234} 232}
235 233
236static inline int cipso_v4_socket_getattr(const struct socket *sock,
237 struct netlbl_lsm_secattr *secattr)
238{
239 return -ENOSYS;
240}
241
242static inline int cipso_v4_skbuff_getattr(const struct sk_buff *skb, 234static inline int cipso_v4_skbuff_getattr(const struct sk_buff *skb,
243 struct netlbl_lsm_secattr *secattr) 235 struct netlbl_lsm_secattr *secattr)
244{ 236{
diff --git a/include/net/netlabel.h b/include/net/netlabel.h
index 83da7e1f0d3d..9b7d6f2ac9a3 100644
--- a/include/net/netlabel.h
+++ b/include/net/netlabel.h
@@ -332,17 +332,15 @@ static inline int netlbl_secattr_catmap_setrng(
332 */ 332 */
333 333
334#ifdef CONFIG_NETLABEL 334#ifdef CONFIG_NETLABEL
335int netlbl_socket_setattr(const struct socket *sock, 335int netlbl_sock_setattr(struct sock *sk,
336 const struct netlbl_lsm_secattr *secattr); 336 const struct netlbl_lsm_secattr *secattr);
337int netlbl_sock_getattr(struct sock *sk, 337int netlbl_sock_getattr(struct sock *sk,
338 struct netlbl_lsm_secattr *secattr); 338 struct netlbl_lsm_secattr *secattr);
339int netlbl_socket_getattr(const struct socket *sock,
340 struct netlbl_lsm_secattr *secattr);
341int netlbl_skbuff_getattr(const struct sk_buff *skb, 339int netlbl_skbuff_getattr(const struct sk_buff *skb,
342 struct netlbl_lsm_secattr *secattr); 340 struct netlbl_lsm_secattr *secattr);
343void netlbl_skbuff_err(struct sk_buff *skb, int error); 341void netlbl_skbuff_err(struct sk_buff *skb, int error);
344#else 342#else
345static inline int netlbl_socket_setattr(const struct socket *sock, 343static inline int netlbl_sock_setattr(struct sock *sk,
346 const struct netlbl_lsm_secattr *secattr) 344 const struct netlbl_lsm_secattr *secattr)
347{ 345{
348 return -ENOSYS; 346 return -ENOSYS;
@@ -354,12 +352,6 @@ static inline int netlbl_sock_getattr(struct sock *sk,
354 return -ENOSYS; 352 return -ENOSYS;
355} 353}
356 354
357static inline int netlbl_socket_getattr(const struct socket *sock,
358 struct netlbl_lsm_secattr *secattr)
359{
360 return -ENOSYS;
361}
362
363static inline int netlbl_skbuff_getattr(const struct sk_buff *skb, 355static inline int netlbl_skbuff_getattr(const struct sk_buff *skb,
364 struct netlbl_lsm_secattr *secattr) 356 struct netlbl_lsm_secattr *secattr)
365{ 357{
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c
index 86a2b52aad38..fc839f9148ec 100644
--- a/net/ipv4/cipso_ipv4.c
+++ b/net/ipv4/cipso_ipv4.c
@@ -1709,22 +1709,22 @@ void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway)
1709} 1709}
1710 1710
1711/** 1711/**
1712 * cipso_v4_socket_setattr - Add a CIPSO option to a socket 1712 * cipso_v4_sock_setattr - Add a CIPSO option to a socket
1713 * @sock: the socket 1713 * @sk: the socket
1714 * @doi_def: the CIPSO DOI to use 1714 * @doi_def: the CIPSO DOI to use
1715 * @secattr: the specific security attributes of the socket 1715 * @secattr: the specific security attributes of the socket
1716 * 1716 *
1717 * Description: 1717 * Description:
1718 * Set the CIPSO option on the given socket using the DOI definition and 1718 * Set the CIPSO option on the given socket using the DOI definition and
1719 * security attributes passed to the function. This function requires 1719 * security attributes passed to the function. This function requires
1720 * exclusive access to @sock->sk, which means it either needs to be in the 1720 * exclusive access to @sk, which means it either needs to be in the
1721 * process of being created or locked via lock_sock(sock->sk). Returns zero on 1721 * process of being created or locked. Returns zero on success and negative
1722 * success and negative values on failure. 1722 * values on failure.
1723 * 1723 *
1724 */ 1724 */
1725int cipso_v4_socket_setattr(const struct socket *sock, 1725int cipso_v4_sock_setattr(struct sock *sk,
1726 const struct cipso_v4_doi *doi_def, 1726 const struct cipso_v4_doi *doi_def,
1727 const struct netlbl_lsm_secattr *secattr) 1727 const struct netlbl_lsm_secattr *secattr)
1728{ 1728{
1729 int ret_val = -EPERM; 1729 int ret_val = -EPERM;
1730 u32 iter; 1730 u32 iter;
@@ -1732,7 +1732,6 @@ int cipso_v4_socket_setattr(const struct socket *sock,
1732 u32 buf_len = 0; 1732 u32 buf_len = 0;
1733 u32 opt_len; 1733 u32 opt_len;
1734 struct ip_options *opt = NULL; 1734 struct ip_options *opt = NULL;
1735 struct sock *sk;
1736 struct inet_sock *sk_inet; 1735 struct inet_sock *sk_inet;
1737 struct inet_connection_sock *sk_conn; 1736 struct inet_connection_sock *sk_conn;
1738 1737
@@ -1740,7 +1739,6 @@ int cipso_v4_socket_setattr(const struct socket *sock,
1740 * defined yet but it is not a problem as the only users of these 1739 * defined yet but it is not a problem as the only users of these
1741 * "lite" PF_INET sockets are functions which do an accept() call 1740 * "lite" PF_INET sockets are functions which do an accept() call
1742 * afterwards so we will label the socket as part of the accept(). */ 1741 * afterwards so we will label the socket as part of the accept(). */
1743 sk = sock->sk;
1744 if (sk == NULL) 1742 if (sk == NULL)
1745 return 0; 1743 return 0;
1746 1744
@@ -1892,29 +1890,6 @@ int cipso_v4_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr)
1892} 1890}
1893 1891
1894/** 1892/**
1895 * cipso_v4_socket_getattr - Get the security attributes from a socket
1896 * @sock: the socket
1897 * @secattr: the security attributes
1898 *
1899 * Description:
1900 * Query @sock to see if there is a CIPSO option attached to the socket and if
1901 * there is return the CIPSO security attributes in @secattr. Returns zero on
1902 * success and negative values on failure.
1903 *
1904 */
1905int cipso_v4_socket_getattr(const struct socket *sock,
1906 struct netlbl_lsm_secattr *secattr)
1907{
1908 int ret_val;
1909
1910 lock_sock(sock->sk);
1911 ret_val = cipso_v4_sock_getattr(sock->sk, secattr);
1912 release_sock(sock->sk);
1913
1914 return ret_val;
1915}
1916
1917/**
1918 * cipso_v4_skbuff_getattr - Get the security attributes from the CIPSO option 1893 * cipso_v4_skbuff_getattr - Get the security attributes from the CIPSO option
1919 * @skb: the packet 1894 * @skb: the packet
1920 * @secattr: the security attributes 1895 * @secattr: the security attributes
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c
index f2535e7f2869..b165712aaa70 100644
--- a/net/netlabel/netlabel_kapi.c
+++ b/net/netlabel/netlabel_kapi.c
@@ -246,19 +246,18 @@ int netlbl_secattr_catmap_setrng(struct netlbl_lsm_secattr_catmap *catmap,
246 246
247/** 247/**
248 * netlbl_socket_setattr - Label a socket using the correct protocol 248 * netlbl_socket_setattr - Label a socket using the correct protocol
249 * @sock: the socket to label 249 * @sk: the socket to label
250 * @secattr: the security attributes 250 * @secattr: the security attributes
251 * 251 *
252 * Description: 252 * Description:
253 * Attach the correct label to the given socket using the security attributes 253 * Attach the correct label to the given socket using the security attributes
254 * specified in @secattr. This function requires exclusive access to 254 * specified in @secattr. This function requires exclusive access to @sk,
255 * @sock->sk, which means it either needs to be in the process of being 255 * which means it either needs to be in the process of being created or locked.
256 * created or locked via lock_sock(sock->sk). Returns zero on success, 256 * Returns zero on success, negative values on failure.
257 * negative values on failure.
258 * 257 *
259 */ 258 */
260int netlbl_socket_setattr(const struct socket *sock, 259int netlbl_sock_setattr(struct sock *sk,
261 const struct netlbl_lsm_secattr *secattr) 260 const struct netlbl_lsm_secattr *secattr)
262{ 261{
263 int ret_val = -ENOENT; 262 int ret_val = -ENOENT;
264 struct netlbl_dom_map *dom_entry; 263 struct netlbl_dom_map *dom_entry;
@@ -269,9 +268,9 @@ int netlbl_socket_setattr(const struct socket *sock,
269 goto socket_setattr_return; 268 goto socket_setattr_return;
270 switch (dom_entry->type) { 269 switch (dom_entry->type) {
271 case NETLBL_NLTYPE_CIPSOV4: 270 case NETLBL_NLTYPE_CIPSOV4:
272 ret_val = cipso_v4_socket_setattr(sock, 271 ret_val = cipso_v4_sock_setattr(sk,
273 dom_entry->type_def.cipsov4, 272 dom_entry->type_def.cipsov4,
274 secattr); 273 secattr);
275 break; 274 break;
276 case NETLBL_NLTYPE_UNLABELED: 275 case NETLBL_NLTYPE_UNLABELED:
277 ret_val = 0; 276 ret_val = 0;
@@ -309,30 +308,6 @@ int netlbl_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr)
309} 308}
310 309
311/** 310/**
312 * netlbl_socket_getattr - Determine the security attributes of a socket
313 * @sock: the socket
314 * @secattr: the security attributes
315 *
316 * Description:
317 * Examines the given socket to see any NetLabel style labeling has been
318 * applied to the socket, if so it parses the socket label and returns the
319 * security attributes in @secattr. Returns zero on success, negative values
320 * on failure.
321 *
322 */
323int netlbl_socket_getattr(const struct socket *sock,
324 struct netlbl_lsm_secattr *secattr)
325{
326 int ret_val;
327
328 ret_val = cipso_v4_socket_getattr(sock, secattr);
329 if (ret_val == 0)
330 return 0;
331
332 return netlbl_unlabel_getattr(secattr);
333}
334
335/**
336 * netlbl_skbuff_getattr - Determine the security attributes of a packet 311 * netlbl_skbuff_getattr - Determine the security attributes of a packet
337 * @skb: the packet 312 * @skb: the packet
338 * @secattr: the security attributes 313 * @secattr: the security attributes
diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c
index bf8750791dd1..e64eca246f1a 100644
--- a/security/selinux/netlabel.c
+++ b/security/selinux/netlabel.c
@@ -36,8 +36,8 @@
36#include "security.h" 36#include "security.h"
37 37
38/** 38/**
39 * selinux_netlbl_socket_setsid - Label a socket using the NetLabel mechanism 39 * selinux_netlbl_sock_setsid - Label a socket using the NetLabel mechanism
40 * @sock: the socket to label 40 * @sk: the socket to label
41 * @sid: the SID to use 41 * @sid: the SID to use
42 * 42 *
43 * Description: 43 * Description:
@@ -47,17 +47,17 @@
47 * this function and rcu_read_unlock() after this function returns. 47 * this function and rcu_read_unlock() after this function returns.
48 * 48 *
49 */ 49 */
50static int selinux_netlbl_socket_setsid(struct socket *sock, u32 sid) 50static int selinux_netlbl_sock_setsid(struct sock *sk, u32 sid)
51{ 51{
52 int rc; 52 int rc;
53 struct sk_security_struct *sksec = sock->sk->sk_security; 53 struct sk_security_struct *sksec = sk->sk_security;
54 struct netlbl_lsm_secattr secattr; 54 struct netlbl_lsm_secattr secattr;
55 55
56 rc = security_netlbl_sid_to_secattr(sid, &secattr); 56 rc = security_netlbl_sid_to_secattr(sid, &secattr);
57 if (rc != 0) 57 if (rc != 0)
58 return rc; 58 return rc;
59 59
60 rc = netlbl_socket_setattr(sock, &secattr); 60 rc = netlbl_sock_setattr(sk, &secattr);
61 if (rc == 0) { 61 if (rc == 0) {
62 spin_lock_bh(&sksec->nlbl_lock); 62 spin_lock_bh(&sksec->nlbl_lock);
63 sksec->nlbl_state = NLBL_LABELED; 63 sksec->nlbl_state = NLBL_LABELED;
@@ -206,7 +206,7 @@ void selinux_netlbl_sock_graft(struct sock *sk, struct socket *sock)
206 /* Try to set the NetLabel on the socket to save time later, if we fail 206 /* Try to set the NetLabel on the socket to save time later, if we fail
207 * here we will pick up the pieces in later calls to 207 * here we will pick up the pieces in later calls to
208 * selinux_netlbl_inode_permission(). */ 208 * selinux_netlbl_inode_permission(). */
209 selinux_netlbl_socket_setsid(sock, sksec->sid); 209 selinux_netlbl_sock_setsid(sk, sksec->sid);
210 210
211 rcu_read_unlock(); 211 rcu_read_unlock();
212} 212}
@@ -223,14 +223,15 @@ void selinux_netlbl_sock_graft(struct sock *sk, struct socket *sock)
223int selinux_netlbl_socket_post_create(struct socket *sock) 223int selinux_netlbl_socket_post_create(struct socket *sock)
224{ 224{
225 int rc = 0; 225 int rc = 0;
226 struct sock *sk = sock->sk;
226 struct inode_security_struct *isec = SOCK_INODE(sock)->i_security; 227 struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
227 struct sk_security_struct *sksec = sock->sk->sk_security; 228 struct sk_security_struct *sksec = sk->sk_security;
228 229
229 sksec->sclass = isec->sclass; 230 sksec->sclass = isec->sclass;
230 231
231 rcu_read_lock(); 232 rcu_read_lock();
232 if (sksec->nlbl_state == NLBL_REQUIRE) 233 if (sksec->nlbl_state == NLBL_REQUIRE)
233 rc = selinux_netlbl_socket_setsid(sock, sksec->sid); 234 rc = selinux_netlbl_sock_setsid(sk, sksec->sid);
234 rcu_read_unlock(); 235 rcu_read_unlock();
235 236
236 return rc; 237 return rc;
@@ -251,14 +252,16 @@ int selinux_netlbl_socket_post_create(struct socket *sock)
251int selinux_netlbl_inode_permission(struct inode *inode, int mask) 252int selinux_netlbl_inode_permission(struct inode *inode, int mask)
252{ 253{
253 int rc; 254 int rc;
254 struct sk_security_struct *sksec; 255 struct sock *sk;
255 struct socket *sock; 256 struct socket *sock;
257 struct sk_security_struct *sksec;
256 258
257 if (!S_ISSOCK(inode->i_mode) || 259 if (!S_ISSOCK(inode->i_mode) ||
258 ((mask & (MAY_WRITE | MAY_APPEND)) == 0)) 260 ((mask & (MAY_WRITE | MAY_APPEND)) == 0))
259 return 0; 261 return 0;
260 sock = SOCKET_I(inode); 262 sock = SOCKET_I(inode);
261 sksec = sock->sk->sk_security; 263 sk = sock->sk;
264 sksec = sk->sk_security;
262 265
263 rcu_read_lock(); 266 rcu_read_lock();
264 if (sksec->nlbl_state != NLBL_REQUIRE) { 267 if (sksec->nlbl_state != NLBL_REQUIRE) {
@@ -266,9 +269,9 @@ int selinux_netlbl_inode_permission(struct inode *inode, int mask)
266 return 0; 269 return 0;
267 } 270 }
268 local_bh_disable(); 271 local_bh_disable();
269 bh_lock_sock_nested(sock->sk); 272 bh_lock_sock_nested(sk);
270 rc = selinux_netlbl_socket_setsid(sock, sksec->sid); 273 rc = selinux_netlbl_sock_setsid(sk, sksec->sid);
271 bh_unlock_sock(sock->sk); 274 bh_unlock_sock(sk);
272 local_bh_enable(); 275 local_bh_enable();
273 rcu_read_unlock(); 276 rcu_read_unlock();
274 277
@@ -345,14 +348,17 @@ int selinux_netlbl_socket_setsockopt(struct socket *sock,
345 int optname) 348 int optname)
346{ 349{
347 int rc = 0; 350 int rc = 0;
348 struct sk_security_struct *sksec = sock->sk->sk_security; 351 struct sock *sk = sock->sk;
352 struct sk_security_struct *sksec = sk->sk_security;
349 struct netlbl_lsm_secattr secattr; 353 struct netlbl_lsm_secattr secattr;
350 354
351 rcu_read_lock(); 355 rcu_read_lock();
352 if (level == IPPROTO_IP && optname == IP_OPTIONS && 356 if (level == IPPROTO_IP && optname == IP_OPTIONS &&
353 sksec->nlbl_state == NLBL_LABELED) { 357 sksec->nlbl_state == NLBL_LABELED) {
354 netlbl_secattr_init(&secattr); 358 netlbl_secattr_init(&secattr);
355 rc = netlbl_socket_getattr(sock, &secattr); 359 lock_sock(sk);
360 rc = netlbl_sock_getattr(sk, &secattr);
361 release_sock(sk);
356 if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE) 362 if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE)
357 rc = -EACCES; 363 rc = -EACCES;
358 netlbl_secattr_destroy(&secattr); 364 netlbl_secattr_destroy(&secattr);