Blame view
net/netlabel/netlabel_cipso_v4.c
21 KB
1ccea77e2 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
96cb8e331 [NetLabel]: CIPSO... |
2 3 4 5 6 7 8 |
/* * NetLabel CIPSO/IPv4 Support * * This file defines the CIPSO/IPv4 functions for the NetLabel system. The * NetLabel system manages static and dynamic label mappings for network * protocols such as CIPSO and RIPSO. * |
82c21bfab doc: Update the e... |
9 |
* Author: Paul Moore <paul@paul-moore.com> |
96cb8e331 [NetLabel]: CIPSO... |
10 11 12 13 |
*/ /* * (c) Copyright Hewlett-Packard Development Company, L.P., 2006 |
96cb8e331 [NetLabel]: CIPSO... |
14 15 16 17 18 19 |
*/ #include <linux/types.h> #include <linux/socket.h> #include <linux/string.h> #include <linux/skbuff.h> |
32f50cdee [NetLabel]: add a... |
20 |
#include <linux/audit.h> |
5a0e3ad6a include cleanup: ... |
21 |
#include <linux/slab.h> |
96cb8e331 [NetLabel]: CIPSO... |
22 23 24 25 26 |
#include <net/sock.h> #include <net/netlink.h> #include <net/genetlink.h> #include <net/netlabel.h> #include <net/cipso_ipv4.h> |
60063497a atomic: use <linu... |
27 |
#include <linux/atomic.h> |
96cb8e331 [NetLabel]: CIPSO... |
28 29 30 |
#include "netlabel_user.h" #include "netlabel_cipso_v4.h" |
23bcdc1ad SELinux: enable d... |
31 |
#include "netlabel_mgmt.h" |
b1edeb102 netlabel: Replace... |
32 |
#include "netlabel_domainhash.h" |
96cb8e331 [NetLabel]: CIPSO... |
33 |
|
fd3858554 [NetLabel]: rewor... |
34 35 36 37 38 39 |
/* Argument struct for cipso_v4_doi_walk() */ struct netlbl_cipsov4_doiwalk_arg { struct netlink_callback *nl_cb; struct sk_buff *skb; u32 seq; }; |
b1edeb102 netlabel: Replace... |
40 41 42 43 44 |
/* Argument struct for netlbl_domhsh_walk() */ struct netlbl_domhsh_walk_arg { struct netlbl_audit *audit_info; u32 doi; }; |
96cb8e331 [NetLabel]: CIPSO... |
45 |
/* NetLabel Generic NETLINK CIPSOv4 family */ |
489111e5c genetlink: static... |
46 |
static struct genl_family netlbl_cipsov4_gnl_family; |
fd3858554 [NetLabel]: rewor... |
47 |
/* NetLabel Netlink attribute policy */ |
ef7c79ed6 [NETLINK]: Mark n... |
48 |
static const struct nla_policy netlbl_cipsov4_genl_policy[NLBL_CIPSOV4_A_MAX + 1] = { |
fd3858554 [NetLabel]: rewor... |
49 50 51 52 53 54 55 56 57 58 59 60 61 |
[NLBL_CIPSOV4_A_DOI] = { .type = NLA_U32 }, [NLBL_CIPSOV4_A_MTYPE] = { .type = NLA_U32 }, [NLBL_CIPSOV4_A_TAG] = { .type = NLA_U8 }, [NLBL_CIPSOV4_A_TAGLST] = { .type = NLA_NESTED }, [NLBL_CIPSOV4_A_MLSLVLLOC] = { .type = NLA_U32 }, [NLBL_CIPSOV4_A_MLSLVLREM] = { .type = NLA_U32 }, [NLBL_CIPSOV4_A_MLSLVL] = { .type = NLA_NESTED }, [NLBL_CIPSOV4_A_MLSLVLLST] = { .type = NLA_NESTED }, [NLBL_CIPSOV4_A_MLSCATLOC] = { .type = NLA_U32 }, [NLBL_CIPSOV4_A_MLSCATREM] = { .type = NLA_U32 }, [NLBL_CIPSOV4_A_MLSCAT] = { .type = NLA_NESTED }, [NLBL_CIPSOV4_A_MLSCATLST] = { .type = NLA_NESTED }, }; |
96cb8e331 [NetLabel]: CIPSO... |
62 63 64 65 66 67 |
/* * Helper Functions */ /** |
fd3858554 [NetLabel]: rewor... |
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
* netlbl_cipsov4_add_common - Parse the common sections of a ADD message * @info: the Generic NETLINK info block * @doi_def: the CIPSO V4 DOI definition * * Description: * Parse the common sections of a ADD message and fill in the related values * in @doi_def. Returns zero on success, negative values on failure. * */ static int netlbl_cipsov4_add_common(struct genl_info *info, struct cipso_v4_doi *doi_def) { struct nlattr *nla; int nla_rem; u32 iter = 0; doi_def->doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); |
8cb081746 netlink: make val... |
85 86 87 88 |
if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_TAGLST], NLBL_CIPSOV4_A_MAX, netlbl_cipsov4_genl_policy, NULL) != 0) |
fd3858554 [NetLabel]: rewor... |
89 90 91 |
return -EINVAL; nla_for_each_nested(nla, info->attrs[NLBL_CIPSOV4_A_TAGLST], nla_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
92 |
if (nla_type(nla) == NLBL_CIPSOV4_A_TAG) { |
2a2f11c22 NetLabel: correct... |
93 |
if (iter >= CIPSO_V4_TAG_MAXCNT) |
fd3858554 [NetLabel]: rewor... |
94 95 96 |
return -EINVAL; doi_def->tags[iter++] = nla_get_u8(nla); } |
2a2f11c22 NetLabel: correct... |
97 98 |
while (iter < CIPSO_V4_TAG_MAXCNT) doi_def->tags[iter++] = CIPSO_V4_TAG_INVALID; |
fd3858554 [NetLabel]: rewor... |
99 100 101 |
return 0; } |
96cb8e331 [NetLabel]: CIPSO... |
102 103 104 105 106 107 108 |
/* * NetLabel Command Handlers */ /** * netlbl_cipsov4_add_std - Adds a CIPSO V4 DOI definition |
fd3858554 [NetLabel]: rewor... |
109 |
* @info: the Generic NETLINK info block |
6c2e8ac09 netlabel: Update ... |
110 |
* @audit_info: NetLabel audit information |
96cb8e331 [NetLabel]: CIPSO... |
111 112 |
* * Description: |
15c45f7b2 cipso: Add suppor... |
113 114 115 |
* Create a new CIPSO_V4_MAP_TRANS DOI definition based on the given ADD * message and add it to the CIPSO V4 engine. Return zero on success and * non-zero on error. |
96cb8e331 [NetLabel]: CIPSO... |
116 117 |
* */ |
6c2e8ac09 netlabel: Update ... |
118 119 |
static int netlbl_cipsov4_add_std(struct genl_info *info, struct netlbl_audit *audit_info) |
96cb8e331 [NetLabel]: CIPSO... |
120 121 |
{ int ret_val = -EINVAL; |
96cb8e331 [NetLabel]: CIPSO... |
122 |
struct cipso_v4_doi *doi_def = NULL; |
fd3858554 [NetLabel]: rewor... |
123 124 125 126 |
struct nlattr *nla_a; struct nlattr *nla_b; int nla_a_rem; int nla_b_rem; |
caff5b6a6 NetLabel: correct... |
127 |
u32 iter; |
96cb8e331 [NetLabel]: CIPSO... |
128 |
|
32f50cdee [NetLabel]: add a... |
129 |
if (!info->attrs[NLBL_CIPSOV4_A_TAGLST] || |
fd3858554 [NetLabel]: rewor... |
130 131 |
!info->attrs[NLBL_CIPSOV4_A_MLSLVLLST]) return -EINVAL; |
8cb081746 netlink: make val... |
132 133 134 135 |
if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], NLBL_CIPSOV4_A_MAX, netlbl_cipsov4_genl_policy, NULL) != 0) |
fd3858554 [NetLabel]: rewor... |
136 |
return -EINVAL; |
96cb8e331 [NetLabel]: CIPSO... |
137 138 |
doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL); |
fd3858554 [NetLabel]: rewor... |
139 140 |
if (doi_def == NULL) return -ENOMEM; |
96cb8e331 [NetLabel]: CIPSO... |
141 142 143 144 145 |
doi_def->map.std = kzalloc(sizeof(*doi_def->map.std), GFP_KERNEL); if (doi_def->map.std == NULL) { ret_val = -ENOMEM; goto add_std_failure; } |
15c45f7b2 cipso: Add suppor... |
146 |
doi_def->type = CIPSO_V4_MAP_TRANS; |
96cb8e331 [NetLabel]: CIPSO... |
147 |
|
fd3858554 [NetLabel]: rewor... |
148 149 |
ret_val = netlbl_cipsov4_add_common(info, doi_def); if (ret_val != 0) |
96cb8e331 [NetLabel]: CIPSO... |
150 |
goto add_std_failure; |
1fd2a25b7 NetLabel: perform... |
151 |
ret_val = -EINVAL; |
96cb8e331 [NetLabel]: CIPSO... |
152 |
|
fd3858554 [NetLabel]: rewor... |
153 154 155 |
nla_for_each_nested(nla_a, info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], nla_a_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
156 |
if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) { |
8cb081746 netlink: make val... |
157 158 159 160 |
if (nla_validate_nested_deprecated(nla_a, NLBL_CIPSOV4_A_MAX, netlbl_cipsov4_genl_policy, NULL) != 0) |
fceb6435e netlink: pass ext... |
161 |
goto add_std_failure; |
fd3858554 [NetLabel]: rewor... |
162 |
nla_for_each_nested(nla_b, nla_a, nla_b_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
163 |
switch (nla_type(nla_b)) { |
fd3858554 [NetLabel]: rewor... |
164 |
case NLBL_CIPSOV4_A_MLSLVLLOC: |
1fd2a25b7 NetLabel: perform... |
165 166 167 |
if (nla_get_u32(nla_b) > CIPSO_V4_MAX_LOC_LVLS) goto add_std_failure; |
fd3858554 [NetLabel]: rewor... |
168 169 170 171 172 173 |
if (nla_get_u32(nla_b) >= doi_def->map.std->lvl.local_size) doi_def->map.std->lvl.local_size = nla_get_u32(nla_b) + 1; break; case NLBL_CIPSOV4_A_MLSLVLREM: |
1fd2a25b7 NetLabel: perform... |
174 175 176 |
if (nla_get_u32(nla_b) > CIPSO_V4_MAX_REM_LVLS) goto add_std_failure; |
fd3858554 [NetLabel]: rewor... |
177 178 179 180 181 182 183 |
if (nla_get_u32(nla_b) >= doi_def->map.std->lvl.cipso_size) doi_def->map.std->lvl.cipso_size = nla_get_u32(nla_b) + 1; break; } } |
96cb8e331 [NetLabel]: CIPSO... |
184 185 186 187 188 189 190 |
doi_def->map.std->lvl.local = kcalloc(doi_def->map.std->lvl.local_size, sizeof(u32), GFP_KERNEL); if (doi_def->map.std->lvl.local == NULL) { ret_val = -ENOMEM; goto add_std_failure; } |
96cb8e331 [NetLabel]: CIPSO... |
191 192 193 194 195 196 197 |
doi_def->map.std->lvl.cipso = kcalloc(doi_def->map.std->lvl.cipso_size, sizeof(u32), GFP_KERNEL); if (doi_def->map.std->lvl.cipso == NULL) { ret_val = -ENOMEM; goto add_std_failure; } |
caff5b6a6 NetLabel: correct... |
198 199 200 201 |
for (iter = 0; iter < doi_def->map.std->lvl.local_size; iter++) doi_def->map.std->lvl.local[iter] = CIPSO_V4_INV_LVL; for (iter = 0; iter < doi_def->map.std->lvl.cipso_size; iter++) doi_def->map.std->lvl.cipso[iter] = CIPSO_V4_INV_LVL; |
fd3858554 [NetLabel]: rewor... |
202 203 204 |
nla_for_each_nested(nla_a, info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], nla_a_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
205 |
if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) { |
fd3858554 [NetLabel]: rewor... |
206 207 |
struct nlattr *lvl_loc; struct nlattr *lvl_rem; |
fd3858554 [NetLabel]: rewor... |
208 209 210 211 212 213 214 215 216 217 218 |
lvl_loc = nla_find_nested(nla_a, NLBL_CIPSOV4_A_MLSLVLLOC); lvl_rem = nla_find_nested(nla_a, NLBL_CIPSOV4_A_MLSLVLREM); if (lvl_loc == NULL || lvl_rem == NULL) goto add_std_failure; doi_def->map.std->lvl.local[nla_get_u32(lvl_loc)] = nla_get_u32(lvl_rem); doi_def->map.std->lvl.cipso[nla_get_u32(lvl_rem)] = nla_get_u32(lvl_loc); } |
96cb8e331 [NetLabel]: CIPSO... |
219 |
|
fd3858554 [NetLabel]: rewor... |
220 |
if (info->attrs[NLBL_CIPSOV4_A_MLSCATLST]) { |
8cb081746 netlink: make val... |
221 222 223 224 |
if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSCATLST], NLBL_CIPSOV4_A_MAX, netlbl_cipsov4_genl_policy, NULL) != 0) |
fd3858554 [NetLabel]: rewor... |
225 226 227 228 229 |
goto add_std_failure; nla_for_each_nested(nla_a, info->attrs[NLBL_CIPSOV4_A_MLSCATLST], nla_a_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
230 |
if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) { |
8cb081746 netlink: make val... |
231 232 233 234 |
if (nla_validate_nested_deprecated(nla_a, NLBL_CIPSOV4_A_MAX, netlbl_cipsov4_genl_policy, NULL) != 0) |
fd3858554 [NetLabel]: rewor... |
235 236 |
goto add_std_failure; nla_for_each_nested(nla_b, nla_a, nla_b_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
237 |
switch (nla_type(nla_b)) { |
fd3858554 [NetLabel]: rewor... |
238 |
case NLBL_CIPSOV4_A_MLSCATLOC: |
1fd2a25b7 NetLabel: perform... |
239 240 241 |
if (nla_get_u32(nla_b) > CIPSO_V4_MAX_LOC_CATS) goto add_std_failure; |
fd3858554 [NetLabel]: rewor... |
242 243 244 245 246 247 |
if (nla_get_u32(nla_b) >= doi_def->map.std->cat.local_size) doi_def->map.std->cat.local_size = nla_get_u32(nla_b) + 1; break; case NLBL_CIPSOV4_A_MLSCATREM: |
1fd2a25b7 NetLabel: perform... |
248 249 250 |
if (nla_get_u32(nla_b) > CIPSO_V4_MAX_REM_CATS) goto add_std_failure; |
fd3858554 [NetLabel]: rewor... |
251 252 253 254 255 256 257 |
if (nla_get_u32(nla_b) >= doi_def->map.std->cat.cipso_size) doi_def->map.std->cat.cipso_size = nla_get_u32(nla_b) + 1; break; } } |
fd3858554 [NetLabel]: rewor... |
258 |
doi_def->map.std->cat.local = kcalloc( |
e1a95265b [NET] NETLABEL: F... |
259 |
doi_def->map.std->cat.local_size, |
96cb8e331 [NetLabel]: CIPSO... |
260 261 |
sizeof(u32), GFP_KERNEL); |
fd3858554 [NetLabel]: rewor... |
262 263 264 265 266 |
if (doi_def->map.std->cat.local == NULL) { ret_val = -ENOMEM; goto add_std_failure; } doi_def->map.std->cat.cipso = kcalloc( |
e1a95265b [NET] NETLABEL: F... |
267 |
doi_def->map.std->cat.cipso_size, |
96cb8e331 [NetLabel]: CIPSO... |
268 269 |
sizeof(u32), GFP_KERNEL); |
fd3858554 [NetLabel]: rewor... |
270 271 |
if (doi_def->map.std->cat.cipso == NULL) { ret_val = -ENOMEM; |
96cb8e331 [NetLabel]: CIPSO... |
272 |
goto add_std_failure; |
fd3858554 [NetLabel]: rewor... |
273 |
} |
caff5b6a6 NetLabel: correct... |
274 275 276 277 |
for (iter = 0; iter < doi_def->map.std->cat.local_size; iter++) doi_def->map.std->cat.local[iter] = CIPSO_V4_INV_CAT; for (iter = 0; iter < doi_def->map.std->cat.cipso_size; iter++) doi_def->map.std->cat.cipso[iter] = CIPSO_V4_INV_CAT; |
fd3858554 [NetLabel]: rewor... |
278 279 280 |
nla_for_each_nested(nla_a, info->attrs[NLBL_CIPSOV4_A_MLSCATLST], nla_a_rem) |
8f4c1f9b0 [NETLINK]: Introd... |
281 |
if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) { |
fd3858554 [NetLabel]: rewor... |
282 283 284 285 286 287 288 289 290 291 |
struct nlattr *cat_loc; struct nlattr *cat_rem; cat_loc = nla_find_nested(nla_a, NLBL_CIPSOV4_A_MLSCATLOC); cat_rem = nla_find_nested(nla_a, NLBL_CIPSOV4_A_MLSCATREM); if (cat_loc == NULL || cat_rem == NULL) goto add_std_failure; doi_def->map.std->cat.local[ |
e1a95265b [NET] NETLABEL: F... |
292 |
nla_get_u32(cat_loc)] = |
fd3858554 [NetLabel]: rewor... |
293 294 |
nla_get_u32(cat_rem); doi_def->map.std->cat.cipso[ |
e1a95265b [NET] NETLABEL: F... |
295 |
nla_get_u32(cat_rem)] = |
fd3858554 [NetLabel]: rewor... |
296 297 |
nla_get_u32(cat_loc); } |
96cb8e331 [NetLabel]: CIPSO... |
298 |
} |
6c2e8ac09 netlabel: Update ... |
299 |
ret_val = cipso_v4_doi_add(doi_def, audit_info); |
96cb8e331 [NetLabel]: CIPSO... |
300 301 302 303 304 |
if (ret_val != 0) goto add_std_failure; return 0; add_std_failure: |
7a11b1d30 netlabel: Deletio... |
305 |
cipso_v4_doi_free(doi_def); |
96cb8e331 [NetLabel]: CIPSO... |
306 307 308 309 310 |
return ret_val; } /** * netlbl_cipsov4_add_pass - Adds a CIPSO V4 DOI definition |
fd3858554 [NetLabel]: rewor... |
311 |
* @info: the Generic NETLINK info block |
6c2e8ac09 netlabel: Update ... |
312 |
* @audit_info: NetLabel audit information |
96cb8e331 [NetLabel]: CIPSO... |
313 314 315 316 317 318 319 |
* * Description: * Create a new CIPSO_V4_MAP_PASS DOI definition based on the given ADD message * and add it to the CIPSO V4 engine. Return zero on success and non-zero on * error. * */ |
6c2e8ac09 netlabel: Update ... |
320 321 |
static int netlbl_cipsov4_add_pass(struct genl_info *info, struct netlbl_audit *audit_info) |
96cb8e331 [NetLabel]: CIPSO... |
322 |
{ |
fd3858554 [NetLabel]: rewor... |
323 |
int ret_val; |
96cb8e331 [NetLabel]: CIPSO... |
324 |
struct cipso_v4_doi *doi_def = NULL; |
96cb8e331 [NetLabel]: CIPSO... |
325 |
|
32f50cdee [NetLabel]: add a... |
326 |
if (!info->attrs[NLBL_CIPSOV4_A_TAGLST]) |
fd3858554 [NetLabel]: rewor... |
327 |
return -EINVAL; |
96cb8e331 [NetLabel]: CIPSO... |
328 329 |
doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL); |
fd3858554 [NetLabel]: rewor... |
330 331 |
if (doi_def == NULL) return -ENOMEM; |
96cb8e331 [NetLabel]: CIPSO... |
332 |
doi_def->type = CIPSO_V4_MAP_PASS; |
fd3858554 [NetLabel]: rewor... |
333 334 335 |
ret_val = netlbl_cipsov4_add_common(info, doi_def); if (ret_val != 0) goto add_pass_failure; |
96cb8e331 [NetLabel]: CIPSO... |
336 |
|
6c2e8ac09 netlabel: Update ... |
337 |
ret_val = cipso_v4_doi_add(doi_def, audit_info); |
96cb8e331 [NetLabel]: CIPSO... |
338 339 340 341 342 |
if (ret_val != 0) goto add_pass_failure; return 0; add_pass_failure: |
b1edeb102 netlabel: Replace... |
343 |
cipso_v4_doi_free(doi_def); |
96cb8e331 [NetLabel]: CIPSO... |
344 345 346 347 |
return ret_val; } /** |
d91d40799 netlabel: Add con... |
348 349 |
* netlbl_cipsov4_add_local - Adds a CIPSO V4 DOI definition * @info: the Generic NETLINK info block |
6c2e8ac09 netlabel: Update ... |
350 |
* @audit_info: NetLabel audit information |
d91d40799 netlabel: Add con... |
351 352 353 354 355 356 357 |
* * Description: * Create a new CIPSO_V4_MAP_LOCAL DOI definition based on the given ADD * message and add it to the CIPSO V4 engine. Return zero on success and * non-zero on error. * */ |
6c2e8ac09 netlabel: Update ... |
358 359 |
static int netlbl_cipsov4_add_local(struct genl_info *info, struct netlbl_audit *audit_info) |
d91d40799 netlabel: Add con... |
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 |
{ int ret_val; struct cipso_v4_doi *doi_def = NULL; if (!info->attrs[NLBL_CIPSOV4_A_TAGLST]) return -EINVAL; doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL); if (doi_def == NULL) return -ENOMEM; doi_def->type = CIPSO_V4_MAP_LOCAL; ret_val = netlbl_cipsov4_add_common(info, doi_def); if (ret_val != 0) goto add_local_failure; |
6c2e8ac09 netlabel: Update ... |
375 |
ret_val = cipso_v4_doi_add(doi_def, audit_info); |
d91d40799 netlabel: Add con... |
376 377 378 379 380 381 382 383 384 385 |
if (ret_val != 0) goto add_local_failure; return 0; add_local_failure: cipso_v4_doi_free(doi_def); return ret_val; } /** |
96cb8e331 [NetLabel]: CIPSO... |
386 387 388 389 390 391 392 393 394 395 396 397 398 |
* netlbl_cipsov4_add - Handle an ADD message * @skb: the NETLINK buffer * @info: the Generic NETLINK info block * * Description: * Create a new DOI definition based on the given ADD message and add it to the * CIPSO V4 engine. Returns zero on success, negative values on failure. * */ static int netlbl_cipsov4_add(struct sk_buff *skb, struct genl_info *info) { int ret_val = -EINVAL; |
95d4e6be2 [NetLabel]: audit... |
399 |
struct netlbl_audit audit_info; |
96cb8e331 [NetLabel]: CIPSO... |
400 |
|
32f50cdee [NetLabel]: add a... |
401 402 |
if (!info->attrs[NLBL_CIPSOV4_A_DOI] || !info->attrs[NLBL_CIPSOV4_A_MTYPE]) |
fd3858554 [NetLabel]: rewor... |
403 |
return -EINVAL; |
96cb8e331 [NetLabel]: CIPSO... |
404 |
|
95d4e6be2 [NetLabel]: audit... |
405 |
netlbl_netlink_auditinfo(skb, &audit_info); |
6c2e8ac09 netlabel: Update ... |
406 |
switch (nla_get_u32(info->attrs[NLBL_CIPSOV4_A_MTYPE])) { |
15c45f7b2 cipso: Add suppor... |
407 |
case CIPSO_V4_MAP_TRANS: |
6c2e8ac09 netlabel: Update ... |
408 |
ret_val = netlbl_cipsov4_add_std(info, &audit_info); |
96cb8e331 [NetLabel]: CIPSO... |
409 410 |
break; case CIPSO_V4_MAP_PASS: |
6c2e8ac09 netlabel: Update ... |
411 |
ret_val = netlbl_cipsov4_add_pass(info, &audit_info); |
96cb8e331 [NetLabel]: CIPSO... |
412 |
break; |
d91d40799 netlabel: Add con... |
413 |
case CIPSO_V4_MAP_LOCAL: |
6c2e8ac09 netlabel: Update ... |
414 |
ret_val = netlbl_cipsov4_add_local(info, &audit_info); |
d91d40799 netlabel: Add con... |
415 |
break; |
96cb8e331 [NetLabel]: CIPSO... |
416 |
} |
23bcdc1ad SELinux: enable d... |
417 |
if (ret_val == 0) |
c783f1ce5 NetLabel: Remove ... |
418 |
atomic_inc(&netlabel_mgmt_protocount); |
96cb8e331 [NetLabel]: CIPSO... |
419 |
|
96cb8e331 [NetLabel]: CIPSO... |
420 421 422 423 424 425 426 427 428 |
return ret_val; } /** * netlbl_cipsov4_list - Handle a LIST message * @skb: the NETLINK buffer * @info: the Generic NETLINK info block * * Description: |
fd3858554 [NetLabel]: rewor... |
429 430 431 432 433 434 435 436 437 |
* Process a user generated LIST message and respond accordingly. While the * response message generated by the kernel is straightforward, determining * before hand the size of the buffer to allocate is not (we have to generate * the message to know the size). In order to keep this function sane what we * do is allocate a buffer of NLMSG_GOODSIZE and try to fit the response in * that size, if we fail then we restart with a larger buffer and try again. * We continue in this manner until we hit a limit of failed attempts then we * give up and just send an error message. Returns zero on success and * negative values on error. |
96cb8e331 [NetLabel]: CIPSO... |
438 439 440 441 |
* */ static int netlbl_cipsov4_list(struct sk_buff *skb, struct genl_info *info) { |
fd3858554 [NetLabel]: rewor... |
442 443 444 445 |
int ret_val; struct sk_buff *ans_skb = NULL; u32 nlsze_mult = 1; void *data; |
96cb8e331 [NetLabel]: CIPSO... |
446 |
u32 doi; |
fd3858554 [NetLabel]: rewor... |
447 448 449 450 |
struct nlattr *nla_a; struct nlattr *nla_b; struct cipso_v4_doi *doi_def; u32 iter; |
96cb8e331 [NetLabel]: CIPSO... |
451 |
|
fd3858554 [NetLabel]: rewor... |
452 453 |
if (!info->attrs[NLBL_CIPSOV4_A_DOI]) { ret_val = -EINVAL; |
96cb8e331 [NetLabel]: CIPSO... |
454 |
goto list_failure; |
fd3858554 [NetLabel]: rewor... |
455 |
} |
96cb8e331 [NetLabel]: CIPSO... |
456 |
|
fd3858554 [NetLabel]: rewor... |
457 |
list_start: |
339bf98ff [NETLINK]: Do pre... |
458 |
ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE * nlsze_mult, GFP_KERNEL); |
96cb8e331 [NetLabel]: CIPSO... |
459 460 461 462 |
if (ans_skb == NULL) { ret_val = -ENOMEM; goto list_failure; } |
17c157c88 [GENL]: Add genlm... |
463 464 |
data = genlmsg_put_reply(ans_skb, info, &netlbl_cipsov4_gnl_family, 0, NLBL_CIPSOV4_C_LIST); |
fd3858554 [NetLabel]: rewor... |
465 466 467 468 469 470 471 472 473 474 475 |
if (data == NULL) { ret_val = -ENOMEM; goto list_failure; } doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); rcu_read_lock(); doi_def = cipso_v4_doi_getdef(doi); if (doi_def == NULL) { ret_val = -EINVAL; |
561967010 netlabel: Fix som... |
476 |
goto list_failure_lock; |
fd3858554 [NetLabel]: rewor... |
477 478 479 480 481 |
} ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MTYPE, doi_def->type); if (ret_val != 0) goto list_failure_lock; |
ae0be8de9 netlink: make nla... |
482 |
nla_a = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_TAGLST); |
fd3858554 [NetLabel]: rewor... |
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 |
if (nla_a == NULL) { ret_val = -ENOMEM; goto list_failure_lock; } for (iter = 0; iter < CIPSO_V4_TAG_MAXCNT && doi_def->tags[iter] != CIPSO_V4_TAG_INVALID; iter++) { ret_val = nla_put_u8(ans_skb, NLBL_CIPSOV4_A_TAG, doi_def->tags[iter]); if (ret_val != 0) goto list_failure_lock; } nla_nest_end(ans_skb, nla_a); switch (doi_def->type) { |
15c45f7b2 cipso: Add suppor... |
500 |
case CIPSO_V4_MAP_TRANS: |
ae0be8de9 netlink: make nla... |
501 502 |
nla_a = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_MLSLVLLST); |
fd3858554 [NetLabel]: rewor... |
503 504 505 506 507 508 509 510 511 512 |
if (nla_a == NULL) { ret_val = -ENOMEM; goto list_failure_lock; } for (iter = 0; iter < doi_def->map.std->lvl.local_size; iter++) { if (doi_def->map.std->lvl.local[iter] == CIPSO_V4_INV_LVL) continue; |
ae0be8de9 netlink: make nla... |
513 514 |
nla_b = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_MLSLVL); |
fd3858554 [NetLabel]: rewor... |
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 |
if (nla_b == NULL) { ret_val = -ENOMEM; goto list_retry; } ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MLSLVLLOC, iter); if (ret_val != 0) goto list_retry; ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MLSLVLREM, doi_def->map.std->lvl.local[iter]); if (ret_val != 0) goto list_retry; nla_nest_end(ans_skb, nla_b); } nla_nest_end(ans_skb, nla_a); |
ae0be8de9 netlink: make nla... |
532 533 |
nla_a = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_MLSCATLST); |
fd3858554 [NetLabel]: rewor... |
534 535 536 537 538 539 540 541 542 543 |
if (nla_a == NULL) { ret_val = -ENOMEM; goto list_retry; } for (iter = 0; iter < doi_def->map.std->cat.local_size; iter++) { if (doi_def->map.std->cat.local[iter] == CIPSO_V4_INV_CAT) continue; |
ae0be8de9 netlink: make nla... |
544 545 |
nla_b = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_MLSCAT); |
fd3858554 [NetLabel]: rewor... |
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 |
if (nla_b == NULL) { ret_val = -ENOMEM; goto list_retry; } ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MLSCATLOC, iter); if (ret_val != 0) goto list_retry; ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MLSCATREM, doi_def->map.std->cat.local[iter]); if (ret_val != 0) goto list_retry; nla_nest_end(ans_skb, nla_b); } nla_nest_end(ans_skb, nla_a); break; } rcu_read_unlock(); |
96cb8e331 [NetLabel]: CIPSO... |
567 |
|
fd3858554 [NetLabel]: rewor... |
568 |
genlmsg_end(ans_skb, data); |
fe785bee0 netlabel: netlink... |
569 |
return genlmsg_reply(ans_skb, info); |
96cb8e331 [NetLabel]: CIPSO... |
570 |
|
fd3858554 [NetLabel]: rewor... |
571 572 573 574 575 |
list_retry: /* XXX - this limit is a guesstimate */ if (nlsze_mult < 4) { rcu_read_unlock(); kfree_skb(ans_skb); |
83aa2e964 netlabel: return ... |
576 |
nlsze_mult *= 2; |
fd3858554 [NetLabel]: rewor... |
577 578 579 580 |
goto list_start; } list_failure_lock: rcu_read_unlock(); |
96cb8e331 [NetLabel]: CIPSO... |
581 |
list_failure: |
fd3858554 [NetLabel]: rewor... |
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 |
kfree_skb(ans_skb); return ret_val; } /** * netlbl_cipsov4_listall_cb - cipso_v4_doi_walk() callback for LISTALL * @doi_def: the CIPSOv4 DOI definition * @arg: the netlbl_cipsov4_doiwalk_arg structure * * Description: * This function is designed to be used as a callback to the * cipso_v4_doi_walk() function for use in generating a response for a LISTALL * message. Returns the size of the message on success, negative values on * failure. * */ static int netlbl_cipsov4_listall_cb(struct cipso_v4_doi *doi_def, void *arg) { int ret_val = -ENOMEM; struct netlbl_cipsov4_doiwalk_arg *cb_arg = arg; void *data; |
15e473046 netlink: Rename p... |
603 |
data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).portid, |
17c157c88 [GENL]: Add genlm... |
604 605 |
cb_arg->seq, &netlbl_cipsov4_gnl_family, NLM_F_MULTI, NLBL_CIPSOV4_C_LISTALL); |
fd3858554 [NetLabel]: rewor... |
606 607 608 609 610 611 612 613 614 615 616 |
if (data == NULL) goto listall_cb_failure; ret_val = nla_put_u32(cb_arg->skb, NLBL_CIPSOV4_A_DOI, doi_def->doi); if (ret_val != 0) goto listall_cb_failure; ret_val = nla_put_u32(cb_arg->skb, NLBL_CIPSOV4_A_MTYPE, doi_def->type); if (ret_val != 0) goto listall_cb_failure; |
053c095a8 netlink: make nlm... |
617 618 |
genlmsg_end(cb_arg->skb, data); return 0; |
fd3858554 [NetLabel]: rewor... |
619 620 621 |
listall_cb_failure: genlmsg_cancel(cb_arg->skb, data); |
96cb8e331 [NetLabel]: CIPSO... |
622 623 624 625 626 627 |
return ret_val; } /** * netlbl_cipsov4_listall - Handle a LISTALL message * @skb: the NETLINK buffer |
fd3858554 [NetLabel]: rewor... |
628 |
* @cb: the NETLINK callback |
96cb8e331 [NetLabel]: CIPSO... |
629 630 631 632 633 634 |
* * Description: * Process a user generated LISTALL message and respond accordingly. Returns * zero on success and negative values on error. * */ |
fd3858554 [NetLabel]: rewor... |
635 636 |
static int netlbl_cipsov4_listall(struct sk_buff *skb, struct netlink_callback *cb) |
96cb8e331 [NetLabel]: CIPSO... |
637 |
{ |
fd3858554 [NetLabel]: rewor... |
638 |
struct netlbl_cipsov4_doiwalk_arg cb_arg; |
561967010 netlabel: Fix som... |
639 |
u32 doi_skip = cb->args[0]; |
96cb8e331 [NetLabel]: CIPSO... |
640 |
|
fd3858554 [NetLabel]: rewor... |
641 642 643 |
cb_arg.nl_cb = cb; cb_arg.skb = skb; cb_arg.seq = cb->nlh->nlmsg_seq; |
96cb8e331 [NetLabel]: CIPSO... |
644 |
|
fd3858554 [NetLabel]: rewor... |
645 |
cipso_v4_doi_walk(&doi_skip, netlbl_cipsov4_listall_cb, &cb_arg); |
96cb8e331 [NetLabel]: CIPSO... |
646 |
|
fd3858554 [NetLabel]: rewor... |
647 648 |
cb->args[0] = doi_skip; return skb->len; |
96cb8e331 [NetLabel]: CIPSO... |
649 650 651 |
} /** |
b1edeb102 netlabel: Replace... |
652 653 654 655 656 657 658 659 660 661 662 663 664 665 |
* netlbl_cipsov4_remove_cb - netlbl_cipsov4_remove() callback for REMOVE * @entry: LSM domain mapping entry * @arg: the netlbl_domhsh_walk_arg structure * * Description: * This function is intended for use by netlbl_cipsov4_remove() as the callback * for the netlbl_domhsh_walk() function; it removes LSM domain map entries * which are associated with the CIPSO DOI specified in @arg. Returns zero on * success, negative values on failure. * */ static int netlbl_cipsov4_remove_cb(struct netlbl_dom_map *entry, void *arg) { struct netlbl_domhsh_walk_arg *cb_arg = arg; |
6a8b7f0c8 netlabel: use dom... |
666 667 |
if (entry->def.type == NETLBL_NLTYPE_CIPSOV4 && entry->def.cipso->doi == cb_arg->doi) |
b1edeb102 netlabel: Replace... |
668 669 670 671 672 673 |
return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info); return 0; } /** |
96cb8e331 [NetLabel]: CIPSO... |
674 675 676 677 678 679 680 681 682 683 684 |
* netlbl_cipsov4_remove - Handle a REMOVE message * @skb: the NETLINK buffer * @info: the Generic NETLINK info block * * Description: * Process a user generated REMOVE message and respond accordingly. Returns * zero on success, negative values on failure. * */ static int netlbl_cipsov4_remove(struct sk_buff *skb, struct genl_info *info) { |
fd3858554 [NetLabel]: rewor... |
685 |
int ret_val = -EINVAL; |
b1edeb102 netlabel: Replace... |
686 |
struct netlbl_domhsh_walk_arg cb_arg; |
95d4e6be2 [NetLabel]: audit... |
687 |
struct netlbl_audit audit_info; |
b1edeb102 netlabel: Replace... |
688 689 |
u32 skip_bkt = 0; u32 skip_chain = 0; |
96cb8e331 [NetLabel]: CIPSO... |
690 |
|
95d4e6be2 [NetLabel]: audit... |
691 692 |
if (!info->attrs[NLBL_CIPSOV4_A_DOI]) return -EINVAL; |
32f50cdee [NetLabel]: add a... |
693 |
|
95d4e6be2 [NetLabel]: audit... |
694 |
netlbl_netlink_auditinfo(skb, &audit_info); |
6c2e8ac09 netlabel: Update ... |
695 |
cb_arg.doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); |
b1edeb102 netlabel: Replace... |
696 697 698 699 |
cb_arg.audit_info = &audit_info; ret_val = netlbl_domhsh_walk(&skip_bkt, &skip_chain, netlbl_cipsov4_remove_cb, &cb_arg); if (ret_val == 0 || ret_val == -ENOENT) { |
6c2e8ac09 netlabel: Update ... |
700 |
ret_val = cipso_v4_doi_remove(cb_arg.doi, &audit_info); |
b1edeb102 netlabel: Replace... |
701 702 703 |
if (ret_val == 0) atomic_dec(&netlabel_mgmt_protocount); } |
95d4e6be2 [NetLabel]: audit... |
704 |
|
96cb8e331 [NetLabel]: CIPSO... |
705 706 707 708 709 710 |
return ret_val; } /* * NetLabel Generic NETLINK Command Definitions */ |
4534de830 genetlink: make a... |
711 |
static const struct genl_ops netlbl_cipsov4_ops[] = { |
227c43c3b [NETLABEL]: Shrin... |
712 |
{ |
96cb8e331 [NetLabel]: CIPSO... |
713 |
.cmd = NLBL_CIPSOV4_C_ADD, |
ef6243acb genetlink: option... |
714 |
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
fd3858554 [NetLabel]: rewor... |
715 |
.flags = GENL_ADMIN_PERM, |
96cb8e331 [NetLabel]: CIPSO... |
716 717 |
.doit = netlbl_cipsov4_add, .dumpit = NULL, |
227c43c3b [NETLABEL]: Shrin... |
718 719 |
}, { |
96cb8e331 [NetLabel]: CIPSO... |
720 |
.cmd = NLBL_CIPSOV4_C_REMOVE, |
ef6243acb genetlink: option... |
721 |
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
fd3858554 [NetLabel]: rewor... |
722 |
.flags = GENL_ADMIN_PERM, |
96cb8e331 [NetLabel]: CIPSO... |
723 724 |
.doit = netlbl_cipsov4_remove, .dumpit = NULL, |
227c43c3b [NETLABEL]: Shrin... |
725 726 |
}, { |
96cb8e331 [NetLabel]: CIPSO... |
727 |
.cmd = NLBL_CIPSOV4_C_LIST, |
ef6243acb genetlink: option... |
728 |
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
96cb8e331 [NetLabel]: CIPSO... |
729 730 731 |
.flags = 0, .doit = netlbl_cipsov4_list, .dumpit = NULL, |
227c43c3b [NETLABEL]: Shrin... |
732 733 |
}, { |
96cb8e331 [NetLabel]: CIPSO... |
734 |
.cmd = NLBL_CIPSOV4_C_LISTALL, |
ef6243acb genetlink: option... |
735 |
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
96cb8e331 [NetLabel]: CIPSO... |
736 |
.flags = 0, |
fd3858554 [NetLabel]: rewor... |
737 738 |
.doit = NULL, .dumpit = netlbl_cipsov4_listall, |
227c43c3b [NETLABEL]: Shrin... |
739 |
}, |
96cb8e331 [NetLabel]: CIPSO... |
740 |
}; |
56989f6d8 genetlink: mark f... |
741 |
static struct genl_family netlbl_cipsov4_gnl_family __ro_after_init = { |
489111e5c genetlink: static... |
742 743 744 745 |
.hdrsize = 0, .name = NETLBL_NLTYPE_CIPSOV4_NAME, .version = NETLBL_PROTO_VERSION, .maxattr = NLBL_CIPSOV4_A_MAX, |
3b0f31f2b genetlink: make p... |
746 |
.policy = netlbl_cipsov4_genl_policy, |
489111e5c genetlink: static... |
747 748 749 750 |
.module = THIS_MODULE, .ops = netlbl_cipsov4_ops, .n_ops = ARRAY_SIZE(netlbl_cipsov4_ops), }; |
96cb8e331 [NetLabel]: CIPSO... |
751 752 753 754 755 756 757 758 759 760 761 762 |
/* * NetLabel Generic NETLINK Protocol Functions */ /** * netlbl_cipsov4_genl_init - Register the CIPSOv4 NetLabel component * * Description: * Register the CIPSOv4 packet NetLabel component with the Generic NETLINK * mechanism. Returns zero on success, negative values on failure. * */ |
05705e4e1 [NETLABEL]: Move ... |
763 |
int __init netlbl_cipsov4_genl_init(void) |
96cb8e331 [NetLabel]: CIPSO... |
764 |
{ |
489111e5c genetlink: static... |
765 |
return genl_register_family(&netlbl_cipsov4_gnl_family); |
96cb8e331 [NetLabel]: CIPSO... |
766 |
} |