aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPaul Moore <paul.moore@hp.com>2006-11-17 17:38:46 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-12-03 00:24:07 -0500
commit701a90bad99b8081a824cca52c178c8fc8f46bb2 (patch)
tree5fed88e6707e9122d7f16e4c5d8fea7c69e090ac /net
parentc6fa82a9dd6160e0bc980cb0401c16bf62f2fe66 (diff)
NetLabel: make netlbl_lsm_secattr struct easier/quicker to understand
The existing netlbl_lsm_secattr struct required the LSM to check all of the fields to determine if any security attributes were present resulting in a lot of work in the common case of no attributes. This patch adds a 'flags' field which is used to indicate which attributes are present in the structure; this should allow the LSM to do a quick comparison to determine if the structure holds any security attributes. Example: if (netlbl_lsm_secattr->flags) /* security attributes present */ else /* NO security attributes present */ Signed-off-by: Paul Moore <paul.moore@hp.com> Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/cipso_ipv4.c22
-rw-r--r--net/netlabel/netlabel_kapi.c5
2 files changed, 18 insertions, 9 deletions
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c
index 095038ad72a4..f0a0785047fe 100644
--- a/net/ipv4/cipso_ipv4.c
+++ b/net/ipv4/cipso_ipv4.c
@@ -319,6 +319,7 @@ static int cipso_v4_cache_check(const unsigned char *key,
319 entry->activity += 1; 319 entry->activity += 1;
320 atomic_inc(&entry->lsm_data->refcount); 320 atomic_inc(&entry->lsm_data->refcount);
321 secattr->cache = entry->lsm_data; 321 secattr->cache = entry->lsm_data;
322 secattr->flags |= NETLBL_SECATTR_CACHE;
322 if (prev_entry == NULL) { 323 if (prev_entry == NULL) {
323 spin_unlock_bh(&cipso_v4_cache[bkt].lock); 324 spin_unlock_bh(&cipso_v4_cache[bkt].lock);
324 return 0; 325 return 0;
@@ -991,12 +992,15 @@ static int cipso_v4_gentag_rbm(const struct cipso_v4_doi *doi_def,
991 unsigned char **buffer, 992 unsigned char **buffer,
992 u32 *buffer_len) 993 u32 *buffer_len)
993{ 994{
994 int ret_val = -EPERM; 995 int ret_val;
995 unsigned char *buf = NULL; 996 unsigned char *buf = NULL;
996 u32 buf_len; 997 u32 buf_len;
997 u32 level; 998 u32 level;
998 999
999 if (secattr->mls_cat) { 1000 if ((secattr->flags & NETLBL_SECATTR_MLS_LVL) == 0)
1001 return -EPERM;
1002
1003 if (secattr->flags & NETLBL_SECATTR_MLS_CAT) {
1000 buf = kzalloc(CIPSO_V4_HDR_LEN + 4 + CIPSO_V4_TAG1_CAT_LEN, 1004 buf = kzalloc(CIPSO_V4_HDR_LEN + 4 + CIPSO_V4_TAG1_CAT_LEN,
1001 GFP_ATOMIC); 1005 GFP_ATOMIC);
1002 if (buf == NULL) 1006 if (buf == NULL)
@@ -1013,10 +1017,10 @@ static int cipso_v4_gentag_rbm(const struct cipso_v4_doi *doi_def,
1013 /* This will send packets using the "optimized" format when 1017 /* This will send packets using the "optimized" format when
1014 * possibile as specified in section 3.4.2.6 of the 1018 * possibile as specified in section 3.4.2.6 of the
1015 * CIPSO draft. */ 1019 * CIPSO draft. */
1016 if (cipso_v4_rbm_optfmt && (ret_val > 0 && ret_val < 10)) 1020 if (cipso_v4_rbm_optfmt && ret_val > 0 && ret_val <= 10)
1017 ret_val = 10; 1021 buf_len = 14;
1018 1022 else
1019 buf_len = 4 + ret_val; 1023 buf_len = 4 + ret_val;
1020 } else { 1024 } else {
1021 buf = kzalloc(CIPSO_V4_HDR_LEN + 4, GFP_ATOMIC); 1025 buf = kzalloc(CIPSO_V4_HDR_LEN + 4, GFP_ATOMIC);
1022 if (buf == NULL) 1026 if (buf == NULL)
@@ -1070,7 +1074,7 @@ static int cipso_v4_parsetag_rbm(const struct cipso_v4_doi *doi_def,
1070 if (ret_val != 0) 1074 if (ret_val != 0)
1071 return ret_val; 1075 return ret_val;
1072 secattr->mls_lvl = level; 1076 secattr->mls_lvl = level;
1073 secattr->mls_lvl_vld = 1; 1077 secattr->flags |= NETLBL_SECATTR_MLS_LVL;
1074 1078
1075 if (tag_len > 4) { 1079 if (tag_len > 4) {
1076 switch (doi_def->type) { 1080 switch (doi_def->type) {
@@ -1094,8 +1098,10 @@ static int cipso_v4_parsetag_rbm(const struct cipso_v4_doi *doi_def,
1094 if (ret_val < 0) { 1098 if (ret_val < 0) {
1095 kfree(secattr->mls_cat); 1099 kfree(secattr->mls_cat);
1096 return ret_val; 1100 return ret_val;
1101 } else if (ret_val > 0) {
1102 secattr->mls_cat_len = ret_val;
1103 secattr->flags |= NETLBL_SECATTR_MLS_CAT;
1097 } 1104 }
1098 secattr->mls_cat_len = ret_val;
1099 } 1105 }
1100 1106
1101 return 0; 1107 return 0;
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c
index ff971103fd0c..da2f1975a042 100644
--- a/net/netlabel/netlabel_kapi.c
+++ b/net/netlabel/netlabel_kapi.c
@@ -62,6 +62,9 @@ int netlbl_socket_setattr(const struct socket *sock,
62 int ret_val = -ENOENT; 62 int ret_val = -ENOENT;
63 struct netlbl_dom_map *dom_entry; 63 struct netlbl_dom_map *dom_entry;
64 64
65 if ((secattr->flags & NETLBL_SECATTR_DOMAIN) == 0)
66 return -ENOENT;
67
65 rcu_read_lock(); 68 rcu_read_lock();
66 dom_entry = netlbl_domhsh_getentry(secattr->domain); 69 dom_entry = netlbl_domhsh_getentry(secattr->domain);
67 if (dom_entry == NULL) 70 if (dom_entry == NULL)
@@ -200,7 +203,7 @@ void netlbl_cache_invalidate(void)
200int netlbl_cache_add(const struct sk_buff *skb, 203int netlbl_cache_add(const struct sk_buff *skb,
201 const struct netlbl_lsm_secattr *secattr) 204 const struct netlbl_lsm_secattr *secattr)
202{ 205{
203 if (secattr->cache == NULL) 206 if ((secattr->flags & NETLBL_SECATTR_CACHE) == 0)
204 return -ENOMSG; 207 return -ENOMSG;
205 208
206 if (CIPSO_V4_OPTEXIST(skb)) 209 if (CIPSO_V4_OPTEXIST(skb))