1 2/* Author : Stephen Smalley, <sds@epoch.ncsc.mil> */ 3 4/* 5 * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> 6 * 7 * Support for enhanced MLS infrastructure. 8 * 9 * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com> 10 * 11 * Added conditional policy language extensions 12 * 13 * Updated: Red Hat, Inc. James Morris <jmorris@redhat.com> 14 * Fine-grained netlink support 15 * IPv6 support 16 * Code cleanup 17 * 18 * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. 19 * Copyright (C) 2003 - 2005 Tresys Technology, LLC 20 * Copyright (C) 2003 - 2007 Red Hat, Inc. 21 * 22 * This library is free software; you can redistribute it and/or 23 * modify it under the terms of the GNU Lesser General Public 24 * License as published by the Free Software Foundation; either 25 * version 2.1 of the License, or (at your option) any later version. 26 * 27 * This library is distributed in the hope that it will be useful, 28 * but WITHOUT ANY WARRANTY; without even the implied warranty of 29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 30 * Lesser General Public License for more details. 31 * 32 * You should have received a copy of the GNU Lesser General Public 33 * License along with this library; if not, write to the Free Software 34 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 35 */ 36 37/* FLASK */ 38 39/* 40 * Implementation of the policy database. 41 */ 42 43#include <assert.h> 44#include <stdlib.h> 45 46#include <sepol/policydb/policydb.h> 47#include <sepol/policydb/expand.h> 48#include <sepol/policydb/conditional.h> 49#include <sepol/policydb/avrule_block.h> 50#include <sepol/policydb/util.h> 51#include <sepol/policydb/flask.h> 52 53#include "private.h" 54#include "debug.h" 55#include "mls.h" 56 57#define POLICYDB_TARGET_SZ ARRAY_SIZE(policydb_target_strings) 58char *policydb_target_strings[] = { POLICYDB_STRING, POLICYDB_XEN_STRING }; 59 60/* These need to be updated if SYM_NUM or OCON_NUM changes */ 61static struct policydb_compat_info policydb_compat[] = { 62 { 63 .type = POLICY_KERN, 64 .version = POLICYDB_VERSION_BOUNDARY, 65 .sym_num = SYM_NUM, 66 .ocon_num = OCON_XEN_PCIDEVICE + 1, 67 .target_platform = SEPOL_TARGET_XEN, 68 }, 69 { 70 .type = POLICY_KERN, 71 .version = POLICYDB_VERSION_BASE, 72 .sym_num = SYM_NUM - 3, 73 .ocon_num = OCON_FSUSE + 1, 74 .target_platform = SEPOL_TARGET_SELINUX, 75 }, 76 { 77 .type = POLICY_KERN, 78 .version = POLICYDB_VERSION_BOOL, 79 .sym_num = SYM_NUM - 2, 80 .ocon_num = OCON_FSUSE + 1, 81 .target_platform = SEPOL_TARGET_SELINUX, 82 }, 83 { 84 .type = POLICY_KERN, 85 .version = POLICYDB_VERSION_IPV6, 86 .sym_num = SYM_NUM - 2, 87 .ocon_num = OCON_NODE6 + 1, 88 .target_platform = SEPOL_TARGET_SELINUX, 89 }, 90 { 91 .type = POLICY_KERN, 92 .version = POLICYDB_VERSION_NLCLASS, 93 .sym_num = SYM_NUM - 2, 94 .ocon_num = OCON_NODE6 + 1, 95 .target_platform = SEPOL_TARGET_SELINUX, 96 }, 97 { 98 .type = POLICY_KERN, 99 .version = POLICYDB_VERSION_MLS, 100 .sym_num = SYM_NUM, 101 .ocon_num = OCON_NODE6 + 1, 102 .target_platform = SEPOL_TARGET_SELINUX, 103 }, 104 { 105 .type = POLICY_KERN, 106 .version = POLICYDB_VERSION_AVTAB, 107 .sym_num = SYM_NUM, 108 .ocon_num = OCON_NODE6 + 1, 109 .target_platform = SEPOL_TARGET_SELINUX, 110 }, 111 { 112 .type = POLICY_KERN, 113 .version = POLICYDB_VERSION_RANGETRANS, 114 .sym_num = SYM_NUM, 115 .ocon_num = OCON_NODE6 + 1, 116 .target_platform = SEPOL_TARGET_SELINUX, 117 }, 118 { 119 .type = POLICY_KERN, 120 .version = POLICYDB_VERSION_POLCAP, 121 .sym_num = SYM_NUM, 122 .ocon_num = OCON_NODE6 + 1, 123 .target_platform = SEPOL_TARGET_SELINUX, 124 }, 125 { 126 .type = POLICY_KERN, 127 .version = POLICYDB_VERSION_PERMISSIVE, 128 .sym_num = SYM_NUM, 129 .ocon_num = OCON_NODE6 + 1, 130 .target_platform = SEPOL_TARGET_SELINUX, 131 }, 132 { 133 .type = POLICY_KERN, 134 .version = POLICYDB_VERSION_BOUNDARY, 135 .sym_num = SYM_NUM, 136 .ocon_num = OCON_NODE6 + 1, 137 .target_platform = SEPOL_TARGET_SELINUX, 138 }, 139 { 140 .type = POLICY_KERN, 141 .version = POLICYDB_VERSION_FILENAME_TRANS, 142 .sym_num = SYM_NUM, 143 .ocon_num = OCON_NODE6 + 1, 144 .target_platform = SEPOL_TARGET_SELINUX, 145 }, 146 { 147 .type = POLICY_KERN, 148 .version = POLICYDB_VERSION_ROLETRANS, 149 .sym_num = SYM_NUM, 150 .ocon_num = OCON_NODE6 + 1, 151 .target_platform = SEPOL_TARGET_SELINUX, 152 }, 153 { 154 .type = POLICY_BASE, 155 .version = MOD_POLICYDB_VERSION_BASE, 156 .sym_num = SYM_NUM, 157 .ocon_num = OCON_NODE6 + 1, 158 .target_platform = SEPOL_TARGET_SELINUX, 159 }, 160 { 161 .type = POLICY_BASE, 162 .version = MOD_POLICYDB_VERSION_MLS, 163 .sym_num = SYM_NUM, 164 .ocon_num = OCON_NODE6 + 1, 165 .target_platform = SEPOL_TARGET_SELINUX, 166 }, 167 { 168 .type = POLICY_BASE, 169 .version = MOD_POLICYDB_VERSION_MLS_USERS, 170 .sym_num = SYM_NUM, 171 .ocon_num = OCON_NODE6 + 1, 172 .target_platform = SEPOL_TARGET_SELINUX, 173 }, 174 { 175 .type = POLICY_BASE, 176 .version = MOD_POLICYDB_VERSION_POLCAP, 177 .sym_num = SYM_NUM, 178 .ocon_num = OCON_NODE6 + 1, 179 .target_platform = SEPOL_TARGET_SELINUX, 180 }, 181 { 182 .type = POLICY_BASE, 183 .version = MOD_POLICYDB_VERSION_PERMISSIVE, 184 .sym_num = SYM_NUM, 185 .ocon_num = OCON_NODE6 + 1, 186 .target_platform = SEPOL_TARGET_SELINUX, 187 }, 188 { 189 .type = POLICY_BASE, 190 .version = MOD_POLICYDB_VERSION_BOUNDARY, 191 .sym_num = SYM_NUM, 192 .ocon_num = OCON_NODE6 + 1, 193 .target_platform = SEPOL_TARGET_SELINUX, 194 }, 195 { 196 .type = POLICY_BASE, 197 .version = MOD_POLICYDB_VERSION_BOUNDARY_ALIAS, 198 .sym_num = SYM_NUM, 199 .ocon_num = OCON_NODE6 + 1, 200 .target_platform = SEPOL_TARGET_SELINUX, 201 }, 202 { 203 .type = POLICY_BASE, 204 .version = MOD_POLICYDB_VERSION_FILENAME_TRANS, 205 .sym_num = SYM_NUM, 206 .ocon_num = OCON_NODE6 + 1, 207 .target_platform = SEPOL_TARGET_SELINUX, 208 }, 209 { 210 .type = POLICY_BASE, 211 .version = MOD_POLICYDB_VERSION_ROLETRANS, 212 .sym_num = SYM_NUM, 213 .ocon_num = OCON_NODE6 + 1, 214 .target_platform = SEPOL_TARGET_SELINUX, 215 }, 216 { 217 .type = POLICY_BASE, 218 .version = MOD_POLICYDB_VERSION_ROLEATTRIB, 219 .sym_num = SYM_NUM, 220 .ocon_num = OCON_NODE6 + 1, 221 .target_platform = SEPOL_TARGET_SELINUX, 222 }, 223 { 224 .type = POLICY_BASE, 225 .version = MOD_POLICYDB_VERSION_TUNABLE_SEP, 226 .sym_num = SYM_NUM, 227 .ocon_num = OCON_NODE6 + 1, 228 .target_platform = SEPOL_TARGET_SELINUX, 229 }, 230 { 231 .type = POLICY_MOD, 232 .version = MOD_POLICYDB_VERSION_BASE, 233 .sym_num = SYM_NUM, 234 .ocon_num = 0, 235 .target_platform = SEPOL_TARGET_SELINUX, 236 }, 237 { 238 .type = POLICY_MOD, 239 .version = MOD_POLICYDB_VERSION_MLS, 240 .sym_num = SYM_NUM, 241 .ocon_num = 0, 242 .target_platform = SEPOL_TARGET_SELINUX, 243 }, 244 { 245 .type = POLICY_MOD, 246 .version = MOD_POLICYDB_VERSION_MLS_USERS, 247 .sym_num = SYM_NUM, 248 .ocon_num = 0, 249 .target_platform = SEPOL_TARGET_SELINUX, 250 }, 251 { 252 .type = POLICY_MOD, 253 .version = MOD_POLICYDB_VERSION_POLCAP, 254 .sym_num = SYM_NUM, 255 .ocon_num = 0, 256 .target_platform = SEPOL_TARGET_SELINUX, 257 }, 258 { 259 .type = POLICY_MOD, 260 .version = MOD_POLICYDB_VERSION_PERMISSIVE, 261 .sym_num = SYM_NUM, 262 .ocon_num = 0, 263 .target_platform = SEPOL_TARGET_SELINUX, 264 }, 265 { 266 .type = POLICY_MOD, 267 .version = MOD_POLICYDB_VERSION_BOUNDARY, 268 .sym_num = SYM_NUM, 269 .ocon_num = 0, 270 .target_platform = SEPOL_TARGET_SELINUX, 271 }, 272 { 273 .type = POLICY_MOD, 274 .version = MOD_POLICYDB_VERSION_BOUNDARY_ALIAS, 275 .sym_num = SYM_NUM, 276 .ocon_num = 0, 277 .target_platform = SEPOL_TARGET_SELINUX, 278 }, 279 { 280 .type = POLICY_MOD, 281 .version = MOD_POLICYDB_VERSION_FILENAME_TRANS, 282 .sym_num = SYM_NUM, 283 .ocon_num = 0, 284 .target_platform = SEPOL_TARGET_SELINUX, 285 }, 286 { 287 .type = POLICY_MOD, 288 .version = MOD_POLICYDB_VERSION_ROLETRANS, 289 .sym_num = SYM_NUM, 290 .ocon_num = 0, 291 .target_platform = SEPOL_TARGET_SELINUX, 292 }, 293 { 294 .type = POLICY_MOD, 295 .version = MOD_POLICYDB_VERSION_ROLEATTRIB, 296 .sym_num = SYM_NUM, 297 .ocon_num = 0, 298 .target_platform = SEPOL_TARGET_SELINUX, 299 }, 300 { 301 .type = POLICY_MOD, 302 .version = MOD_POLICYDB_VERSION_TUNABLE_SEP, 303 .sym_num = SYM_NUM, 304 .ocon_num = 0, 305 .target_platform = SEPOL_TARGET_SELINUX, 306 }, 307}; 308 309#if 0 310static char *symtab_name[SYM_NUM] = { 311 "common prefixes", 312 "classes", 313 "roles", 314 "types", 315 "users", 316 "bools" mls_symtab_names cond_symtab_names 317}; 318#endif 319 320static unsigned int symtab_sizes[SYM_NUM] = { 321 2, 322 32, 323 16, 324 512, 325 128, 326 16, 327 16, 328 16, 329}; 330 331struct policydb_compat_info *policydb_lookup_compat(unsigned int version, 332 unsigned int type, 333 unsigned int target_platform) 334{ 335 unsigned int i; 336 struct policydb_compat_info *info = NULL; 337 338 for (i = 0; i < sizeof(policydb_compat) / sizeof(*info); i++) { 339 if (policydb_compat[i].version == version && 340 policydb_compat[i].type == type && 341 policydb_compat[i].target_platform == target_platform) { 342 info = &policydb_compat[i]; 343 break; 344 } 345 } 346 return info; 347} 348 349void type_set_init(type_set_t * x) 350{ 351 memset(x, 0, sizeof(type_set_t)); 352 ebitmap_init(&x->types); 353 ebitmap_init(&x->negset); 354} 355 356void type_set_destroy(type_set_t * x) 357{ 358 if (x != NULL) { 359 ebitmap_destroy(&x->types); 360 ebitmap_destroy(&x->negset); 361 } 362} 363 364void role_set_init(role_set_t * x) 365{ 366 memset(x, 0, sizeof(role_set_t)); 367 ebitmap_init(&x->roles); 368} 369 370void role_set_destroy(role_set_t * x) 371{ 372 ebitmap_destroy(&x->roles); 373} 374 375void role_datum_init(role_datum_t * x) 376{ 377 memset(x, 0, sizeof(role_datum_t)); 378 ebitmap_init(&x->dominates); 379 type_set_init(&x->types); 380 ebitmap_init(&x->cache); 381 ebitmap_init(&x->roles); 382} 383 384void role_datum_destroy(role_datum_t * x) 385{ 386 if (x != NULL) { 387 ebitmap_destroy(&x->dominates); 388 type_set_destroy(&x->types); 389 ebitmap_destroy(&x->cache); 390 ebitmap_destroy(&x->roles); 391 } 392} 393 394void type_datum_init(type_datum_t * x) 395{ 396 memset(x, 0, sizeof(*x)); 397 ebitmap_init(&x->types); 398} 399 400void type_datum_destroy(type_datum_t * x) 401{ 402 if (x != NULL) { 403 ebitmap_destroy(&x->types); 404 } 405} 406 407void user_datum_init(user_datum_t * x) 408{ 409 memset(x, 0, sizeof(user_datum_t)); 410 role_set_init(&x->roles); 411 mls_semantic_range_init(&x->range); 412 mls_semantic_level_init(&x->dfltlevel); 413 ebitmap_init(&x->cache); 414 mls_range_init(&x->exp_range); 415 mls_level_init(&x->exp_dfltlevel); 416} 417 418void user_datum_destroy(user_datum_t * x) 419{ 420 if (x != NULL) { 421 role_set_destroy(&x->roles); 422 mls_semantic_range_destroy(&x->range); 423 mls_semantic_level_destroy(&x->dfltlevel); 424 ebitmap_destroy(&x->cache); 425 mls_range_destroy(&x->exp_range); 426 mls_level_destroy(&x->exp_dfltlevel); 427 } 428} 429 430void level_datum_init(level_datum_t * x) 431{ 432 memset(x, 0, sizeof(level_datum_t)); 433} 434 435void level_datum_destroy(level_datum_t * x __attribute__ ((unused))) 436{ 437 /* the mls_level_t referenced by the level_datum is managed 438 * separately for now, so there is nothing to destroy */ 439 return; 440} 441 442void cat_datum_init(cat_datum_t * x) 443{ 444 memset(x, 0, sizeof(cat_datum_t)); 445} 446 447void cat_datum_destroy(cat_datum_t * x __attribute__ ((unused))) 448{ 449 /* it's currently a simple struct - really nothing to destroy */ 450 return; 451} 452 453void class_perm_node_init(class_perm_node_t * x) 454{ 455 memset(x, 0, sizeof(class_perm_node_t)); 456} 457 458void avrule_init(avrule_t * x) 459{ 460 memset(x, 0, sizeof(avrule_t)); 461 type_set_init(&x->stypes); 462 type_set_init(&x->ttypes); 463} 464 465void avrule_destroy(avrule_t * x) 466{ 467 class_perm_node_t *cur, *next; 468 469 if (x == NULL) { 470 return; 471 } 472 type_set_destroy(&x->stypes); 473 type_set_destroy(&x->ttypes); 474 475 next = x->perms; 476 while (next) { 477 cur = next; 478 next = cur->next; 479 free(cur); 480 } 481} 482 483void role_trans_rule_init(role_trans_rule_t * x) 484{ 485 memset(x, 0, sizeof(*x)); 486 role_set_init(&x->roles); 487 type_set_init(&x->types); 488 ebitmap_init(&x->classes); 489} 490 491void role_trans_rule_destroy(role_trans_rule_t * x) 492{ 493 if (x != NULL) { 494 role_set_destroy(&x->roles); 495 type_set_destroy(&x->types); 496 ebitmap_destroy(&x->classes); 497 } 498} 499 500void role_trans_rule_list_destroy(role_trans_rule_t * x) 501{ 502 while (x != NULL) { 503 role_trans_rule_t *next = x->next; 504 role_trans_rule_destroy(x); 505 free(x); 506 x = next; 507 } 508} 509 510void filename_trans_rule_init(filename_trans_rule_t * x) 511{ 512 memset(x, 0, sizeof(*x)); 513 type_set_init(&x->stypes); 514 type_set_init(&x->ttypes); 515} 516 517static void filename_trans_rule_destroy(filename_trans_rule_t * x) 518{ 519 if (!x) 520 return; 521 type_set_destroy(&x->stypes); 522 type_set_destroy(&x->ttypes); 523 free(x->name); 524} 525 526void filename_trans_rule_list_destroy(filename_trans_rule_t * x) 527{ 528 filename_trans_rule_t *next; 529 while (x) { 530 next = x->next; 531 filename_trans_rule_destroy(x); 532 free(x); 533 x = next; 534 } 535} 536 537void role_allow_rule_init(role_allow_rule_t * x) 538{ 539 memset(x, 0, sizeof(role_allow_rule_t)); 540 role_set_init(&x->roles); 541 role_set_init(&x->new_roles); 542} 543 544void role_allow_rule_destroy(role_allow_rule_t * x) 545{ 546 role_set_destroy(&x->roles); 547 role_set_destroy(&x->new_roles); 548} 549 550void role_allow_rule_list_destroy(role_allow_rule_t * x) 551{ 552 while (x != NULL) { 553 role_allow_rule_t *next = x->next; 554 role_allow_rule_destroy(x); 555 free(x); 556 x = next; 557 } 558} 559 560void range_trans_rule_init(range_trans_rule_t * x) 561{ 562 type_set_init(&x->stypes); 563 type_set_init(&x->ttypes); 564 ebitmap_init(&x->tclasses); 565 mls_semantic_range_init(&x->trange); 566 x->next = NULL; 567} 568 569void range_trans_rule_destroy(range_trans_rule_t * x) 570{ 571 type_set_destroy(&x->stypes); 572 type_set_destroy(&x->ttypes); 573 ebitmap_destroy(&x->tclasses); 574 mls_semantic_range_destroy(&x->trange); 575} 576 577void range_trans_rule_list_destroy(range_trans_rule_t * x) 578{ 579 while (x != NULL) { 580 range_trans_rule_t *next = x->next; 581 range_trans_rule_destroy(x); 582 free(x); 583 x = next; 584 } 585} 586 587void avrule_list_destroy(avrule_t * x) 588{ 589 avrule_t *next, *cur; 590 591 if (!x) 592 return; 593 594 next = x; 595 while (next) { 596 cur = next; 597 next = next->next; 598 avrule_destroy(cur); 599 free(cur); 600 } 601} 602 603/* 604 * Initialize the role table by implicitly adding role 'object_r'. If 605 * the policy is a module, set object_r's scope to be SCOPE_REQ, 606 * otherwise set it to SCOPE_DECL. 607 */ 608static int roles_init(policydb_t * p) 609{ 610 char *key = 0; 611 int rc; 612 role_datum_t *role; 613 614 role = calloc(1, sizeof(role_datum_t)); 615 if (!role) { 616 rc = -ENOMEM; 617 goto out; 618 } 619 key = malloc(strlen(OBJECT_R) + 1); 620 if (!key) { 621 rc = -ENOMEM; 622 goto out_free_role; 623 } 624 strcpy(key, OBJECT_R); 625 rc = symtab_insert(p, SYM_ROLES, key, role, 626 (p->policy_type == 627 POLICY_MOD ? SCOPE_REQ : SCOPE_DECL), 1, 628 &role->s.value); 629 if (rc) 630 goto out_free_key; 631 if (role->s.value != OBJECT_R_VAL) { 632 rc = -EINVAL; 633 goto out_free_role; 634 } 635 out: 636 return rc; 637 638 out_free_key: 639 free(key); 640 out_free_role: 641 free(role); 642 goto out; 643} 644 645/* 646 * Initialize a policy database structure. 647 */ 648int policydb_init(policydb_t * p) 649{ 650 int i, rc; 651 652 memset(p, 0, sizeof(policydb_t)); 653 654 ebitmap_init(&p->policycaps); 655 656 ebitmap_init(&p->permissive_map); 657 658 for (i = 0; i < SYM_NUM; i++) { 659 p->sym_val_to_name[i] = NULL; 660 rc = symtab_init(&p->symtab[i], symtab_sizes[i]); 661 if (rc) 662 goto out_free_symtab; 663 } 664 665 /* initialize the module stuff */ 666 for (i = 0; i < SYM_NUM; i++) { 667 if (symtab_init(&p->scope[i], symtab_sizes[i])) { 668 goto out_free_symtab; 669 } 670 } 671 if ((p->global = avrule_block_create()) == NULL || 672 (p->global->branch_list = avrule_decl_create(1)) == NULL) { 673 goto out_free_symtab; 674 } 675 p->decl_val_to_struct = NULL; 676 677 rc = avtab_init(&p->te_avtab); 678 if (rc) 679 goto out_free_symtab; 680 681 rc = roles_init(p); 682 if (rc) 683 goto out_free_symtab; 684 685 rc = cond_policydb_init(p); 686 if (rc) 687 goto out_free_symtab; 688 out: 689 return rc; 690 691 out_free_symtab: 692 for (i = 0; i < SYM_NUM; i++) { 693 hashtab_destroy(p->symtab[i].table); 694 hashtab_destroy(p->scope[i].table); 695 } 696 avrule_block_list_destroy(p->global); 697 goto out; 698} 699 700int policydb_role_cache(hashtab_key_t key 701 __attribute__ ((unused)), hashtab_datum_t datum, 702 void *arg) 703{ 704 policydb_t *p; 705 role_datum_t *role; 706 707 role = (role_datum_t *) datum; 708 p = (policydb_t *) arg; 709 710 ebitmap_destroy(&role->cache); 711 if (type_set_expand(&role->types, &role->cache, p, 1)) { 712 return -1; 713 } 714 715 return 0; 716} 717 718int policydb_user_cache(hashtab_key_t key 719 __attribute__ ((unused)), hashtab_datum_t datum, 720 void *arg) 721{ 722 policydb_t *p; 723 user_datum_t *user; 724 725 user = (user_datum_t *) datum; 726 p = (policydb_t *) arg; 727 728 ebitmap_destroy(&user->cache); 729 if (role_set_expand(&user->roles, &user->cache, p, NULL, NULL)) { 730 return -1; 731 } 732 733 /* we do not expand user's MLS info in kernel policies because the 734 * semantic representation is not present and we do not expand user's 735 * MLS info in module policies because all of the necessary mls 736 * information is not present */ 737 if (p->policy_type != POLICY_KERN && p->policy_type != POLICY_MOD) { 738 mls_range_destroy(&user->exp_range); 739 if (mls_semantic_range_expand(&user->range, 740 &user->exp_range, p, NULL)) { 741 return -1; 742 } 743 744 mls_level_destroy(&user->exp_dfltlevel); 745 if (mls_semantic_level_expand(&user->dfltlevel, 746 &user->exp_dfltlevel, p, NULL)) { 747 return -1; 748 } 749 } 750 751 return 0; 752} 753 754/* 755 * The following *_index functions are used to 756 * define the val_to_name and val_to_struct arrays 757 * in a policy database structure. The val_to_name 758 * arrays are used when converting security context 759 * structures into string representations. The 760 * val_to_struct arrays are used when the attributes 761 * of a class, role, or user are needed. 762 */ 763 764static int common_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 765{ 766 policydb_t *p; 767 common_datum_t *comdatum; 768 769 comdatum = (common_datum_t *) datum; 770 p = (policydb_t *) datap; 771 if (!comdatum->s.value || comdatum->s.value > p->p_commons.nprim) 772 return -EINVAL; 773 p->p_common_val_to_name[comdatum->s.value - 1] = (char *)key; 774 775 return 0; 776} 777 778static int class_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 779{ 780 policydb_t *p; 781 class_datum_t *cladatum; 782 783 cladatum = (class_datum_t *) datum; 784 p = (policydb_t *) datap; 785 if (!cladatum->s.value || cladatum->s.value > p->p_classes.nprim) 786 return -EINVAL; 787 p->p_class_val_to_name[cladatum->s.value - 1] = (char *)key; 788 p->class_val_to_struct[cladatum->s.value - 1] = cladatum; 789 790 return 0; 791} 792 793static int role_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 794{ 795 policydb_t *p; 796 role_datum_t *role; 797 798 role = (role_datum_t *) datum; 799 p = (policydb_t *) datap; 800 if (!role->s.value || role->s.value > p->p_roles.nprim) 801 return -EINVAL; 802 p->p_role_val_to_name[role->s.value - 1] = (char *)key; 803 p->role_val_to_struct[role->s.value - 1] = role; 804 805 return 0; 806} 807 808static int type_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 809{ 810 policydb_t *p; 811 type_datum_t *typdatum; 812 813 typdatum = (type_datum_t *) datum; 814 p = (policydb_t *) datap; 815 816 if (typdatum->primary) { 817 if (!typdatum->s.value || typdatum->s.value > p->p_types.nprim) 818 return -EINVAL; 819 p->p_type_val_to_name[typdatum->s.value - 1] = (char *)key; 820 p->type_val_to_struct[typdatum->s.value - 1] = typdatum; 821 } 822 823 return 0; 824} 825 826static int user_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 827{ 828 policydb_t *p; 829 user_datum_t *usrdatum; 830 831 usrdatum = (user_datum_t *) datum; 832 p = (policydb_t *) datap; 833 834 if (!usrdatum->s.value || usrdatum->s.value > p->p_users.nprim) 835 return -EINVAL; 836 837 p->p_user_val_to_name[usrdatum->s.value - 1] = (char *)key; 838 p->user_val_to_struct[usrdatum->s.value - 1] = usrdatum; 839 840 return 0; 841} 842 843static int sens_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 844{ 845 policydb_t *p; 846 level_datum_t *levdatum; 847 848 levdatum = (level_datum_t *) datum; 849 p = (policydb_t *) datap; 850 851 if (!levdatum->isalias) { 852 if (!levdatum->level->sens || 853 levdatum->level->sens > p->p_levels.nprim) 854 return -EINVAL; 855 p->p_sens_val_to_name[levdatum->level->sens - 1] = (char *)key; 856 } 857 858 return 0; 859} 860 861static int cat_index(hashtab_key_t key, hashtab_datum_t datum, void *datap) 862{ 863 policydb_t *p; 864 cat_datum_t *catdatum; 865 866 catdatum = (cat_datum_t *) datum; 867 p = (policydb_t *) datap; 868 869 if (!catdatum->isalias) { 870 if (!catdatum->s.value || catdatum->s.value > p->p_cats.nprim) 871 return -EINVAL; 872 p->p_cat_val_to_name[catdatum->s.value - 1] = (char *)key; 873 } 874 875 return 0; 876} 877 878static int (*index_f[SYM_NUM]) (hashtab_key_t key, hashtab_datum_t datum, 879 void *datap) = { 880common_index, class_index, role_index, type_index, user_index, 881 cond_index_bool, sens_index, cat_index,}; 882 883/* 884 * Define the common val_to_name array and the class 885 * val_to_name and val_to_struct arrays in a policy 886 * database structure. 887 */ 888int policydb_index_classes(policydb_t * p) 889{ 890 free(p->p_common_val_to_name); 891 p->p_common_val_to_name = (char **) 892 malloc(p->p_commons.nprim * sizeof(char *)); 893 if (!p->p_common_val_to_name) 894 return -1; 895 896 if (hashtab_map(p->p_commons.table, common_index, p)) 897 return -1; 898 899 free(p->class_val_to_struct); 900 p->class_val_to_struct = (class_datum_t **) 901 malloc(p->p_classes.nprim * sizeof(class_datum_t *)); 902 if (!p->class_val_to_struct) 903 return -1; 904 905 free(p->p_class_val_to_name); 906 p->p_class_val_to_name = (char **) 907 malloc(p->p_classes.nprim * sizeof(char *)); 908 if (!p->p_class_val_to_name) 909 return -1; 910 911 if (hashtab_map(p->p_classes.table, class_index, p)) 912 return -1; 913 914 return 0; 915} 916 917int policydb_index_bools(policydb_t * p) 918{ 919 920 if (cond_init_bool_indexes(p) == -1) 921 return -1; 922 p->p_bool_val_to_name = (char **) 923 malloc(p->p_bools.nprim * sizeof(char *)); 924 if (!p->p_bool_val_to_name) 925 return -1; 926 if (hashtab_map(p->p_bools.table, cond_index_bool, p)) 927 return -1; 928 return 0; 929} 930 931int policydb_index_decls(policydb_t * p) 932{ 933 avrule_block_t *curblock; 934 avrule_decl_t *decl; 935 int num_decls = 0; 936 937 free(p->decl_val_to_struct); 938 939 for (curblock = p->global; curblock != NULL; curblock = curblock->next) { 940 for (decl = curblock->branch_list; decl != NULL; 941 decl = decl->next) { 942 num_decls++; 943 } 944 } 945 946 p->decl_val_to_struct = 947 calloc(num_decls, sizeof(*(p->decl_val_to_struct))); 948 if (!p->decl_val_to_struct) { 949 return -1; 950 } 951 952 for (curblock = p->global; curblock != NULL; curblock = curblock->next) { 953 for (decl = curblock->branch_list; decl != NULL; 954 decl = decl->next) { 955 p->decl_val_to_struct[decl->decl_id - 1] = decl; 956 } 957 } 958 959 return 0; 960} 961 962/* 963 * Define the other val_to_name and val_to_struct arrays 964 * in a policy database structure. 965 */ 966int policydb_index_others(sepol_handle_t * handle, 967 policydb_t * p, unsigned verbose) 968{ 969 int i; 970 971 if (verbose) { 972 INFO(handle, 973 "security: %d users, %d roles, %d types, %d bools", 974 p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim, 975 p->p_bools.nprim); 976 977 if (p->mls) 978 INFO(handle, "security: %d sens, %d cats", 979 p->p_levels.nprim, p->p_cats.nprim); 980 981 INFO(handle, "security: %d classes, %d rules, %d cond rules", 982 p->p_classes.nprim, p->te_avtab.nel, p->te_cond_avtab.nel); 983 } 984#if 0 985 avtab_hash_eval(&p->te_avtab, "rules"); 986 for (i = 0; i < SYM_NUM; i++) 987 hashtab_hash_eval(p->symtab[i].table, symtab_name[i]); 988#endif 989 990 free(p->role_val_to_struct); 991 p->role_val_to_struct = (role_datum_t **) 992 malloc(p->p_roles.nprim * sizeof(role_datum_t *)); 993 if (!p->role_val_to_struct) 994 return -1; 995 996 free(p->user_val_to_struct); 997 p->user_val_to_struct = (user_datum_t **) 998 malloc(p->p_users.nprim * sizeof(user_datum_t *)); 999 if (!p->user_val_to_struct) 1000 return -1; 1001 1002 free(p->type_val_to_struct); 1003 p->type_val_to_struct = (type_datum_t **) 1004 calloc(p->p_types.nprim, sizeof(type_datum_t *)); 1005 if (!p->type_val_to_struct) 1006 return -1; 1007 1008 cond_init_bool_indexes(p); 1009 1010 for (i = SYM_ROLES; i < SYM_NUM; i++) { 1011 free(p->sym_val_to_name[i]); 1012 p->sym_val_to_name[i] = NULL; 1013 if (p->symtab[i].nprim) { 1014 p->sym_val_to_name[i] = (char **) 1015 calloc(p->symtab[i].nprim, sizeof(char *)); 1016 if (!p->sym_val_to_name[i]) 1017 return -1; 1018 if (hashtab_map(p->symtab[i].table, index_f[i], p)) 1019 return -1; 1020 } 1021 } 1022 1023 /* This pre-expands the roles and users for context validity checking */ 1024 if (hashtab_map(p->p_roles.table, policydb_role_cache, p)) 1025 return -1; 1026 1027 if (hashtab_map(p->p_users.table, policydb_user_cache, p)) 1028 return -1; 1029 1030 return 0; 1031} 1032 1033/* 1034 * The following *_destroy functions are used to 1035 * free any memory allocated for each kind of 1036 * symbol data in the policy database. 1037 */ 1038 1039static int perm_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1040 __attribute__ ((unused))) 1041{ 1042 if (key) 1043 free(key); 1044 free(datum); 1045 return 0; 1046} 1047 1048static int common_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1049 __attribute__ ((unused))) 1050{ 1051 common_datum_t *comdatum; 1052 1053 if (key) 1054 free(key); 1055 comdatum = (common_datum_t *) datum; 1056 hashtab_map(comdatum->permissions.table, perm_destroy, 0); 1057 hashtab_destroy(comdatum->permissions.table); 1058 free(datum); 1059 return 0; 1060} 1061 1062static int class_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1063 __attribute__ ((unused))) 1064{ 1065 class_datum_t *cladatum; 1066 constraint_node_t *constraint, *ctemp; 1067 constraint_expr_t *e, *etmp; 1068 1069 if (key) 1070 free(key); 1071 cladatum = (class_datum_t *) datum; 1072 if (cladatum == NULL) { 1073 return 0; 1074 } 1075 hashtab_map(cladatum->permissions.table, perm_destroy, 0); 1076 hashtab_destroy(cladatum->permissions.table); 1077 constraint = cladatum->constraints; 1078 while (constraint) { 1079 e = constraint->expr; 1080 while (e) { 1081 etmp = e; 1082 e = e->next; 1083 constraint_expr_destroy(etmp); 1084 } 1085 ctemp = constraint; 1086 constraint = constraint->next; 1087 free(ctemp); 1088 } 1089 1090 constraint = cladatum->validatetrans; 1091 while (constraint) { 1092 e = constraint->expr; 1093 while (e) { 1094 etmp = e; 1095 e = e->next; 1096 constraint_expr_destroy(etmp); 1097 } 1098 ctemp = constraint; 1099 constraint = constraint->next; 1100 free(ctemp); 1101 } 1102 1103 if (cladatum->comkey) 1104 free(cladatum->comkey); 1105 free(datum); 1106 return 0; 1107} 1108 1109static int role_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1110 __attribute__ ((unused))) 1111{ 1112 free(key); 1113 role_datum_destroy((role_datum_t *) datum); 1114 free(datum); 1115 return 0; 1116} 1117 1118static int type_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1119 __attribute__ ((unused))) 1120{ 1121 free(key); 1122 type_datum_destroy((type_datum_t *) datum); 1123 free(datum); 1124 return 0; 1125} 1126 1127static int user_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1128 __attribute__ ((unused))) 1129{ 1130 free(key); 1131 user_datum_destroy((user_datum_t *) datum); 1132 free(datum); 1133 return 0; 1134} 1135 1136static int sens_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1137 __attribute__ ((unused))) 1138{ 1139 level_datum_t *levdatum; 1140 1141 if (key) 1142 free(key); 1143 levdatum = (level_datum_t *) datum; 1144 mls_level_destroy(levdatum->level); 1145 free(levdatum->level); 1146 level_datum_destroy(levdatum); 1147 free(levdatum); 1148 return 0; 1149} 1150 1151static int cat_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1152 __attribute__ ((unused))) 1153{ 1154 if (key) 1155 free(key); 1156 cat_datum_destroy((cat_datum_t *) datum); 1157 free(datum); 1158 return 0; 1159} 1160 1161static int (*destroy_f[SYM_NUM]) (hashtab_key_t key, hashtab_datum_t datum, 1162 void *datap) = { 1163common_destroy, class_destroy, role_destroy, type_destroy, user_destroy, 1164 cond_destroy_bool, sens_destroy, cat_destroy,}; 1165 1166void ocontext_selinux_free(ocontext_t **ocontexts) 1167{ 1168 ocontext_t *c, *ctmp; 1169 int i; 1170 1171 for (i = 0; i < OCON_NUM; i++) { 1172 c = ocontexts[i]; 1173 while (c) { 1174 ctmp = c; 1175 c = c->next; 1176 context_destroy(&ctmp->context[0]); 1177 context_destroy(&ctmp->context[1]); 1178 if (i == OCON_ISID || i == OCON_FS || i == OCON_NETIF 1179 || i == OCON_FSUSE) 1180 free(ctmp->u.name); 1181 free(ctmp); 1182 } 1183 } 1184} 1185 1186void ocontext_xen_free(ocontext_t **ocontexts) 1187{ 1188 ocontext_t *c, *ctmp; 1189 int i; 1190 1191 for (i = 0; i < OCON_NUM; i++) { 1192 c = ocontexts[i]; 1193 while (c) { 1194 ctmp = c; 1195 c = c->next; 1196 context_destroy(&ctmp->context[0]); 1197 context_destroy(&ctmp->context[1]); 1198 if (i == OCON_ISID) 1199 free(ctmp->u.name); 1200 free(ctmp); 1201 } 1202 } 1203} 1204 1205/* 1206 * Free any memory allocated by a policy database structure. 1207 */ 1208void policydb_destroy(policydb_t * p) 1209{ 1210 ocontext_t *c, *ctmp; 1211 genfs_t *g, *gtmp; 1212 unsigned int i; 1213 role_allow_t *ra, *lra = NULL; 1214 role_trans_t *tr, *ltr = NULL; 1215 range_trans_t *rt, *lrt = NULL; 1216 filename_trans_t *ft, *nft; 1217 1218 if (!p) 1219 return; 1220 1221 ebitmap_destroy(&p->policycaps); 1222 1223 ebitmap_destroy(&p->permissive_map); 1224 1225 symtabs_destroy(p->symtab); 1226 1227 for (i = 0; i < SYM_NUM; i++) { 1228 if (p->sym_val_to_name[i]) 1229 free(p->sym_val_to_name[i]); 1230 } 1231 1232 if (p->class_val_to_struct) 1233 free(p->class_val_to_struct); 1234 if (p->role_val_to_struct) 1235 free(p->role_val_to_struct); 1236 if (p->user_val_to_struct) 1237 free(p->user_val_to_struct); 1238 if (p->type_val_to_struct) 1239 free(p->type_val_to_struct); 1240 free(p->decl_val_to_struct); 1241 1242 for (i = 0; i < SYM_NUM; i++) { 1243 hashtab_map(p->scope[i].table, scope_destroy, 0); 1244 hashtab_destroy(p->scope[i].table); 1245 } 1246 avrule_block_list_destroy(p->global); 1247 free(p->name); 1248 free(p->version); 1249 1250 avtab_destroy(&p->te_avtab); 1251 1252 if (p->target_platform == SEPOL_TARGET_SELINUX) 1253 ocontext_selinux_free(p->ocontexts); 1254 else if (p->target_platform == SEPOL_TARGET_XEN) 1255 ocontext_xen_free(p->ocontexts); 1256 1257 g = p->genfs; 1258 while (g) { 1259 free(g->fstype); 1260 c = g->head; 1261 while (c) { 1262 ctmp = c; 1263 c = c->next; 1264 context_destroy(&ctmp->context[0]); 1265 free(ctmp->u.name); 1266 free(ctmp); 1267 } 1268 gtmp = g; 1269 g = g->next; 1270 free(gtmp); 1271 } 1272 cond_policydb_destroy(p); 1273 1274 for (tr = p->role_tr; tr; tr = tr->next) { 1275 if (ltr) 1276 free(ltr); 1277 ltr = tr; 1278 } 1279 if (ltr) 1280 free(ltr); 1281 1282 ft = p->filename_trans; 1283 while (ft) { 1284 nft = ft->next; 1285 free(ft->name); 1286 free(ft); 1287 ft = nft; 1288 } 1289 1290 for (ra = p->role_allow; ra; ra = ra->next) { 1291 if (lra) 1292 free(lra); 1293 lra = ra; 1294 } 1295 if (lra) 1296 free(lra); 1297 1298 for (rt = p->range_tr; rt; rt = rt->next) { 1299 if (lrt) { 1300 ebitmap_destroy(&lrt->target_range.level[0].cat); 1301 ebitmap_destroy(&lrt->target_range.level[1].cat); 1302 free(lrt); 1303 } 1304 lrt = rt; 1305 } 1306 if (lrt) { 1307 ebitmap_destroy(&lrt->target_range.level[0].cat); 1308 ebitmap_destroy(&lrt->target_range.level[1].cat); 1309 free(lrt); 1310 } 1311 1312 if (p->type_attr_map) { 1313 for (i = 0; i < p->p_types.nprim; i++) { 1314 ebitmap_destroy(&p->type_attr_map[i]); 1315 } 1316 free(p->type_attr_map); 1317 } 1318 1319 if (p->attr_type_map) { 1320 for (i = 0; i < p->p_types.nprim; i++) { 1321 ebitmap_destroy(&p->attr_type_map[i]); 1322 } 1323 free(p->attr_type_map); 1324 } 1325 1326 return; 1327} 1328 1329void symtabs_destroy(symtab_t * symtab) 1330{ 1331 int i; 1332 for (i = 0; i < SYM_NUM; i++) { 1333 hashtab_map(symtab[i].table, destroy_f[i], 0); 1334 hashtab_destroy(symtab[i].table); 1335 } 1336} 1337 1338int scope_destroy(hashtab_key_t key, hashtab_datum_t datum, void *p 1339 __attribute__ ((unused))) 1340{ 1341 scope_datum_t *cur = (scope_datum_t *) datum; 1342 free(key); 1343 if (cur != NULL) { 1344 free(cur->decl_ids); 1345 } 1346 free(cur); 1347 return 0; 1348} 1349 1350hashtab_destroy_func_t get_symtab_destroy_func(int sym_num) 1351{ 1352 if (sym_num < 0 || sym_num >= SYM_NUM) { 1353 return NULL; 1354 } 1355 return (hashtab_destroy_func_t) destroy_f[sym_num]; 1356} 1357 1358/* 1359 * Load the initial SIDs specified in a policy database 1360 * structure into a SID table. 1361 */ 1362int policydb_load_isids(policydb_t * p, sidtab_t * s) 1363{ 1364 ocontext_t *head, *c; 1365 1366 if (sepol_sidtab_init(s)) { 1367 ERR(NULL, "out of memory on SID table init"); 1368 return -1; 1369 } 1370 1371 head = p->ocontexts[OCON_ISID]; 1372 for (c = head; c; c = c->next) { 1373 if (!c->context[0].user) { 1374 ERR(NULL, "SID %s was never defined", c->u.name); 1375 return -1; 1376 } 1377 if (sepol_sidtab_insert(s, c->sid[0], &c->context[0])) { 1378 ERR(NULL, "unable to load initial SID %s", c->u.name); 1379 return -1; 1380 } 1381 } 1382 1383 return 0; 1384} 1385 1386/* Declare a symbol for a certain avrule_block context. Insert it 1387 * into a symbol table for a policy. This function will handle 1388 * inserting the appropriate scope information in addition to 1389 * inserting the symbol into the hash table. 1390 * 1391 * arguments: 1392 * policydb_t *pol module policy to modify 1393 * uint32_t sym the symbole table for insertion (SYM_*) 1394 * hashtab_key_t key the key for the symbol - not cloned 1395 * hashtab_datum_t data the data for the symbol - not cloned 1396 * scope scope of this symbol, either SCOPE_REQ or SCOPE_DECL 1397 * avrule_decl_id identifier for this symbol's encapsulating declaration 1398 * value (out) assigned value to the symbol (if value is not NULL) 1399 * 1400 * returns: 1401 * 0 success 1402 * 1 success, but symbol already existed as a requirement 1403 * (datum was not inserted and needs to be free()d) 1404 * -1 general error 1405 * -2 scope conflicted 1406 * -ENOMEM memory error 1407 * error codes from hashtab_insert 1408 */ 1409int symtab_insert(policydb_t * pol, uint32_t sym, 1410 hashtab_key_t key, hashtab_datum_t datum, 1411 uint32_t scope, uint32_t avrule_decl_id, uint32_t * value) 1412{ 1413 int rc, retval = 0; 1414 unsigned int i; 1415 scope_datum_t *scope_datum; 1416 1417 /* check if the symbol is already there. multiple 1418 * declarations of non-roles/non-users are illegal, but 1419 * multiple requires are allowed. */ 1420 1421 /* FIX ME - the failures after the hashtab_insert will leave 1422 * the policy in a inconsistent state. */ 1423 rc = hashtab_insert(pol->symtab[sym].table, key, datum); 1424 if (rc == SEPOL_OK) { 1425 /* if no value is passed in the symbol is not primary 1426 * (i.e. aliases) */ 1427 if (value) 1428 *value = ++pol->symtab[sym].nprim; 1429 } else if (rc == SEPOL_EEXIST) { 1430 retval = 1; /* symbol not added -- need to free() later */ 1431 } else { 1432 return rc; 1433 } 1434 1435 /* get existing scope information; if there is not one then 1436 * create it */ 1437 scope_datum = 1438 (scope_datum_t *) hashtab_search(pol->scope[sym].table, key); 1439 if (scope_datum == NULL) { 1440 hashtab_key_t key2 = strdup((char *)key); 1441 if (!key2) 1442 return -ENOMEM; 1443 if ((scope_datum = malloc(sizeof(*scope_datum))) == NULL) { 1444 free(key2); 1445 return -ENOMEM; 1446 } 1447 scope_datum->scope = scope; 1448 scope_datum->decl_ids = NULL; 1449 scope_datum->decl_ids_len = 0; 1450 if ((rc = 1451 hashtab_insert(pol->scope[sym].table, key2, 1452 scope_datum)) != 0) { 1453 free(key2); 1454 free(scope_datum); 1455 return rc; 1456 } 1457 } else if (scope_datum->scope == SCOPE_DECL && scope == SCOPE_DECL) { 1458 /* disallow multiple declarations for non-roles/users */ 1459 if (sym != SYM_ROLES && sym != SYM_USERS) { 1460 return -2; 1461 } 1462 /* Further confine that a role attribute can't have the same 1463 * name as another regular role, and a role attribute can't 1464 * be declared more than once. */ 1465 if (sym == SYM_ROLES) { 1466 role_datum_t *base_role; 1467 role_datum_t *cur_role = (role_datum_t *)datum; 1468 1469 base_role = (role_datum_t *) 1470 hashtab_search(pol->symtab[sym].table, 1471 key); 1472 assert(base_role != NULL); 1473 1474 if (!((base_role->flavor == ROLE_ROLE) && 1475 (cur_role->flavor == ROLE_ROLE))) { 1476 /* Only regular roles are allowed to have 1477 * multiple declarations. */ 1478 return -2; 1479 } 1480 } 1481 } else if (scope_datum->scope == SCOPE_REQ && scope == SCOPE_DECL) { 1482 scope_datum->scope = SCOPE_DECL; 1483 } else if (scope_datum->scope != scope) { 1484 /* This only happens in DECL then REQUIRE case, which is handled by caller */ 1485 return -2; 1486 } 1487 1488 /* search through the pre-existing list to avoid adding duplicates */ 1489 for (i = 0; i < scope_datum->decl_ids_len; i++) { 1490 if (scope_datum->decl_ids[i] == avrule_decl_id) { 1491 /* already there, so don't modify its scope */ 1492 return retval; 1493 } 1494 } 1495 1496 if (add_i_to_a(avrule_decl_id, 1497 &scope_datum->decl_ids_len, 1498 &scope_datum->decl_ids) == -1) { 1499 return -ENOMEM; 1500 } 1501 1502 return retval; 1503} 1504 1505int type_set_or(type_set_t * dst, type_set_t * a, type_set_t * b) 1506{ 1507 type_set_init(dst); 1508 1509 if (ebitmap_or(&dst->types, &a->types, &b->types)) { 1510 return -1; 1511 } 1512 if (ebitmap_or(&dst->negset, &a->negset, &b->negset)) { 1513 return -1; 1514 } 1515 1516 dst->flags |= a->flags; 1517 dst->flags |= b->flags; 1518 1519 return 0; 1520} 1521 1522int type_set_cpy(type_set_t * dst, type_set_t * src) 1523{ 1524 type_set_init(dst); 1525 1526 dst->flags = src->flags; 1527 if (ebitmap_cpy(&dst->types, &src->types)) 1528 return -1; 1529 if (ebitmap_cpy(&dst->negset, &src->negset)) 1530 return -1; 1531 1532 return 0; 1533} 1534 1535int type_set_or_eq(type_set_t * dst, type_set_t * other) 1536{ 1537 int ret; 1538 type_set_t tmp; 1539 1540 if (type_set_or(&tmp, dst, other)) 1541 return -1; 1542 type_set_destroy(dst); 1543 ret = type_set_cpy(dst, &tmp); 1544 type_set_destroy(&tmp); 1545 1546 return ret; 1547} 1548 1549int role_set_get_role(role_set_t * x, uint32_t role) 1550{ 1551 if (x->flags & ROLE_STAR) 1552 return 1; 1553 1554 if (ebitmap_get_bit(&x->roles, role - 1)) { 1555 if (x->flags & ROLE_COMP) 1556 return 0; 1557 else 1558 return 1; 1559 } else { 1560 if (x->flags & ROLE_COMP) 1561 return 1; 1562 else 1563 return 0; 1564 } 1565} 1566 1567/***********************************************************************/ 1568/* everything below is for policy reads */ 1569 1570/* The following are read functions for module structures */ 1571 1572static int role_set_read(role_set_t * r, struct policy_file *fp) 1573{ 1574 uint32_t buf[1]; 1575 int rc; 1576 1577 if (ebitmap_read(&r->roles, fp)) 1578 return -1; 1579 rc = next_entry(buf, fp, sizeof(uint32_t)); 1580 if (rc < 0) 1581 return -1; 1582 r->flags = le32_to_cpu(buf[0]); 1583 1584 return 0; 1585} 1586 1587static int type_set_read(type_set_t * t, struct policy_file *fp) 1588{ 1589 uint32_t buf[1]; 1590 int rc; 1591 1592 if (ebitmap_read(&t->types, fp)) 1593 return -1; 1594 if (ebitmap_read(&t->negset, fp)) 1595 return -1; 1596 1597 rc = next_entry(buf, fp, sizeof(uint32_t)); 1598 if (rc < 0) 1599 return -1; 1600 t->flags = le32_to_cpu(buf[0]); 1601 1602 return 0; 1603} 1604 1605/* 1606 * Read a MLS range structure from a policydb binary 1607 * representation file. 1608 */ 1609static int mls_read_range_helper(mls_range_t * r, struct policy_file *fp) 1610{ 1611 uint32_t buf[2], items; 1612 int rc; 1613 1614 rc = next_entry(buf, fp, sizeof(uint32_t)); 1615 if (rc < 0) 1616 goto out; 1617 1618 items = le32_to_cpu(buf[0]); 1619 if (items > ARRAY_SIZE(buf)) { 1620 ERR(fp->handle, "range overflow"); 1621 rc = -EINVAL; 1622 goto out; 1623 } 1624 rc = next_entry(buf, fp, sizeof(uint32_t) * items); 1625 if (rc < 0) { 1626 ERR(fp->handle, "truncated range"); 1627 goto out; 1628 } 1629 r->level[0].sens = le32_to_cpu(buf[0]); 1630 if (items > 1) 1631 r->level[1].sens = le32_to_cpu(buf[1]); 1632 else 1633 r->level[1].sens = r->level[0].sens; 1634 1635 rc = ebitmap_read(&r->level[0].cat, fp); 1636 if (rc) { 1637 ERR(fp->handle, "error reading low categories"); 1638 goto out; 1639 } 1640 if (items > 1) { 1641 rc = ebitmap_read(&r->level[1].cat, fp); 1642 if (rc) { 1643 ERR(fp->handle, "error reading high categories"); 1644 goto bad_high; 1645 } 1646 } else { 1647 rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat); 1648 if (rc) { 1649 ERR(fp->handle, "out of memory"); 1650 goto bad_high; 1651 } 1652 } 1653 1654 rc = 0; 1655 out: 1656 return rc; 1657 bad_high: 1658 ebitmap_destroy(&r->level[0].cat); 1659 goto out; 1660} 1661 1662/* 1663 * Read a semantic MLS level structure from a policydb binary 1664 * representation file. 1665 */ 1666static int mls_read_semantic_level_helper(mls_semantic_level_t * l, 1667 struct policy_file *fp) 1668{ 1669 uint32_t buf[2], ncat; 1670 unsigned int i; 1671 mls_semantic_cat_t *cat; 1672 int rc; 1673 1674 mls_semantic_level_init(l); 1675 1676 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 1677 if (rc < 0) { 1678 ERR(fp->handle, "truncated level"); 1679 goto bad; 1680 } 1681 l->sens = le32_to_cpu(buf[0]); 1682 1683 ncat = le32_to_cpu(buf[1]); 1684 for (i = 0; i < ncat; i++) { 1685 cat = (mls_semantic_cat_t *) malloc(sizeof(mls_semantic_cat_t)); 1686 if (!cat) { 1687 ERR(fp->handle, "out of memory"); 1688 goto bad; 1689 } 1690 1691 mls_semantic_cat_init(cat); 1692 cat->next = l->cat; 1693 l->cat = cat; 1694 1695 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 1696 if (rc < 0) { 1697 ERR(fp->handle, "error reading level categories"); 1698 goto bad; 1699 } 1700 cat->low = le32_to_cpu(buf[0]); 1701 cat->high = le32_to_cpu(buf[1]); 1702 } 1703 1704 return 0; 1705 1706 bad: 1707 return -EINVAL; 1708} 1709 1710/* 1711 * Read a semantic MLS range structure from a policydb binary 1712 * representation file. 1713 */ 1714static int mls_read_semantic_range_helper(mls_semantic_range_t * r, 1715 struct policy_file *fp) 1716{ 1717 int rc; 1718 1719 rc = mls_read_semantic_level_helper(&r->level[0], fp); 1720 if (rc) 1721 return rc; 1722 1723 rc = mls_read_semantic_level_helper(&r->level[1], fp); 1724 1725 return rc; 1726} 1727 1728static int mls_level_to_semantic(mls_level_t * l, mls_semantic_level_t * sl) 1729{ 1730 unsigned int i; 1731 ebitmap_node_t *cnode; 1732 mls_semantic_cat_t *open_cat = NULL; 1733 1734 mls_semantic_level_init(sl); 1735 sl->sens = l->sens; 1736 ebitmap_for_each_bit(&l->cat, cnode, i) { 1737 if (ebitmap_node_get_bit(cnode, i)) { 1738 if (open_cat) 1739 continue; 1740 open_cat = (mls_semantic_cat_t *) 1741 malloc(sizeof(mls_semantic_cat_t)); 1742 if (!open_cat) 1743 return -1; 1744 1745 mls_semantic_cat_init(open_cat); 1746 open_cat->low = i + 1; 1747 open_cat->next = sl->cat; 1748 sl->cat = open_cat; 1749 } else { 1750 if (!open_cat) 1751 continue; 1752 open_cat->high = i; 1753 open_cat = NULL; 1754 } 1755 } 1756 if (open_cat) 1757 open_cat->high = i; 1758 1759 return 0; 1760} 1761 1762static int mls_range_to_semantic(mls_range_t * r, mls_semantic_range_t * sr) 1763{ 1764 if (mls_level_to_semantic(&r->level[0], &sr->level[0])) 1765 return -1; 1766 1767 if (mls_level_to_semantic(&r->level[1], &sr->level[1])) 1768 return -1; 1769 1770 return 0; 1771} 1772 1773/* 1774 * Read and validate a security context structure 1775 * from a policydb binary representation file. 1776 */ 1777static int context_read_and_validate(context_struct_t * c, 1778 policydb_t * p, struct policy_file *fp) 1779{ 1780 uint32_t buf[3]; 1781 int rc; 1782 1783 rc = next_entry(buf, fp, sizeof(uint32_t) * 3); 1784 if (rc < 0) { 1785 ERR(fp->handle, "context truncated"); 1786 return -1; 1787 } 1788 c->user = le32_to_cpu(buf[0]); 1789 c->role = le32_to_cpu(buf[1]); 1790 c->type = le32_to_cpu(buf[2]); 1791 if ((p->policy_type == POLICY_KERN 1792 && p->policyvers >= POLICYDB_VERSION_MLS) 1793 || (p->policy_type == POLICY_BASE 1794 && p->policyvers >= MOD_POLICYDB_VERSION_MLS)) { 1795 if (mls_read_range_helper(&c->range, fp)) { 1796 ERR(fp->handle, "error reading MLS range " 1797 "of context"); 1798 return -1; 1799 } 1800 } 1801 1802 if (!policydb_context_isvalid(p, c)) { 1803 ERR(fp->handle, "invalid security context"); 1804 context_destroy(c); 1805 return -1; 1806 } 1807 return 0; 1808} 1809 1810/* 1811 * The following *_read functions are used to 1812 * read the symbol data from a policy database 1813 * binary representation file. 1814 */ 1815 1816static int perm_read(policydb_t * p 1817 __attribute__ ((unused)), hashtab_t h, 1818 struct policy_file *fp) 1819{ 1820 char *key = 0; 1821 perm_datum_t *perdatum; 1822 uint32_t buf[2]; 1823 size_t len; 1824 int rc; 1825 1826 perdatum = calloc(1, sizeof(perm_datum_t)); 1827 if (!perdatum) 1828 return -1; 1829 1830 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 1831 if (rc < 0) 1832 goto bad; 1833 1834 len = le32_to_cpu(buf[0]); 1835 perdatum->s.value = le32_to_cpu(buf[1]); 1836 1837 key = malloc(len + 1); 1838 if (!key) 1839 goto bad; 1840 rc = next_entry(key, fp, len); 1841 if (rc < 0) 1842 goto bad; 1843 key[len] = 0; 1844 1845 if (hashtab_insert(h, key, perdatum)) 1846 goto bad; 1847 1848 return 0; 1849 1850 bad: 1851 perm_destroy(key, perdatum, NULL); 1852 return -1; 1853} 1854 1855static int common_read(policydb_t * p, hashtab_t h, struct policy_file *fp) 1856{ 1857 char *key = 0; 1858 common_datum_t *comdatum; 1859 uint32_t buf[4]; 1860 size_t len, nel; 1861 unsigned int i; 1862 int rc; 1863 1864 comdatum = calloc(1, sizeof(common_datum_t)); 1865 if (!comdatum) 1866 return -1; 1867 1868 rc = next_entry(buf, fp, sizeof(uint32_t) * 4); 1869 if (rc < 0) 1870 goto bad; 1871 1872 len = le32_to_cpu(buf[0]); 1873 comdatum->s.value = le32_to_cpu(buf[1]); 1874 1875 if (symtab_init(&comdatum->permissions, PERM_SYMTAB_SIZE)) 1876 goto bad; 1877 comdatum->permissions.nprim = le32_to_cpu(buf[2]); 1878 nel = le32_to_cpu(buf[3]); 1879 1880 key = malloc(len + 1); 1881 if (!key) 1882 goto bad; 1883 rc = next_entry(key, fp, len); 1884 if (rc < 0) 1885 goto bad; 1886 key[len] = 0; 1887 1888 for (i = 0; i < nel; i++) { 1889 if (perm_read(p, comdatum->permissions.table, fp)) 1890 goto bad; 1891 } 1892 1893 if (hashtab_insert(h, key, comdatum)) 1894 goto bad; 1895 1896 return 0; 1897 1898 bad: 1899 common_destroy(key, comdatum, NULL); 1900 return -1; 1901} 1902 1903static int read_cons_helper(policydb_t * p, constraint_node_t ** nodep, 1904 unsigned int ncons, 1905 int allowxtarget, struct policy_file *fp) 1906{ 1907 constraint_node_t *c, *lc; 1908 constraint_expr_t *e, *le; 1909 uint32_t buf[3]; 1910 size_t nexpr; 1911 unsigned int i, j; 1912 int rc, depth; 1913 1914 lc = NULL; 1915 for (i = 0; i < ncons; i++) { 1916 c = calloc(1, sizeof(constraint_node_t)); 1917 if (!c) 1918 return -1; 1919 1920 if (lc) 1921 lc->next = c; 1922 else 1923 *nodep = c; 1924 1925 rc = next_entry(buf, fp, (sizeof(uint32_t) * 2)); 1926 if (rc < 0) 1927 return -1; 1928 c->permissions = le32_to_cpu(buf[0]); 1929 nexpr = le32_to_cpu(buf[1]); 1930 le = NULL; 1931 depth = -1; 1932 for (j = 0; j < nexpr; j++) { 1933 e = malloc(sizeof(constraint_expr_t)); 1934 if (!e) 1935 return -1; 1936 if (constraint_expr_init(e) == -1) { 1937 free(e); 1938 return -1; 1939 } 1940 if (le) { 1941 le->next = e; 1942 } else { 1943 c->expr = e; 1944 } 1945 1946 rc = next_entry(buf, fp, (sizeof(uint32_t) * 3)); 1947 if (rc < 0) 1948 return -1; 1949 e->expr_type = le32_to_cpu(buf[0]); 1950 e->attr = le32_to_cpu(buf[1]); 1951 e->op = le32_to_cpu(buf[2]); 1952 1953 switch (e->expr_type) { 1954 case CEXPR_NOT: 1955 if (depth < 0) 1956 return -1; 1957 break; 1958 case CEXPR_AND: 1959 case CEXPR_OR: 1960 if (depth < 1) 1961 return -1; 1962 depth--; 1963 break; 1964 case CEXPR_ATTR: 1965 if (depth == (CEXPR_MAXDEPTH - 1)) 1966 return -1; 1967 depth++; 1968 break; 1969 case CEXPR_NAMES: 1970 if (!allowxtarget && (e->attr & CEXPR_XTARGET)) 1971 return -1; 1972 if (depth == (CEXPR_MAXDEPTH - 1)) 1973 return -1; 1974 depth++; 1975 if (ebitmap_read(&e->names, fp)) 1976 return -1; 1977 if (p->policy_type != POLICY_KERN && 1978 type_set_read(e->type_names, fp)) 1979 return -1; 1980 break; 1981 default: 1982 return -1; 1983 } 1984 le = e; 1985 } 1986 if (depth != 0) 1987 return -1; 1988 lc = c; 1989 } 1990 1991 return 0; 1992} 1993 1994static int class_read(policydb_t * p, hashtab_t h, struct policy_file *fp) 1995{ 1996 char *key = 0; 1997 class_datum_t *cladatum; 1998 uint32_t buf[6]; 1999 size_t len, len2, ncons, nel; 2000 unsigned int i; 2001 int rc; 2002 2003 cladatum = (class_datum_t *) calloc(1, sizeof(class_datum_t)); 2004 if (!cladatum) 2005 return -1; 2006 2007 rc = next_entry(buf, fp, sizeof(uint32_t) * 6); 2008 if (rc < 0) 2009 goto bad; 2010 2011 len = le32_to_cpu(buf[0]); 2012 len2 = le32_to_cpu(buf[1]); 2013 cladatum->s.value = le32_to_cpu(buf[2]); 2014 2015 if (symtab_init(&cladatum->permissions, PERM_SYMTAB_SIZE)) 2016 goto bad; 2017 cladatum->permissions.nprim = le32_to_cpu(buf[3]); 2018 nel = le32_to_cpu(buf[4]); 2019 2020 ncons = le32_to_cpu(buf[5]); 2021 2022 key = malloc(len + 1); 2023 if (!key) 2024 goto bad; 2025 rc = next_entry(key, fp, len); 2026 if (rc < 0) 2027 goto bad; 2028 key[len] = 0; 2029 2030 if (len2) { 2031 cladatum->comkey = malloc(len2 + 1); 2032 if (!cladatum->comkey) 2033 goto bad; 2034 rc = next_entry(cladatum->comkey, fp, len2); 2035 if (rc < 0) 2036 goto bad; 2037 cladatum->comkey[len2] = 0; 2038 2039 cladatum->comdatum = hashtab_search(p->p_commons.table, 2040 cladatum->comkey); 2041 if (!cladatum->comdatum) { 2042 ERR(fp->handle, "unknown common %s", cladatum->comkey); 2043 goto bad; 2044 } 2045 } 2046 for (i = 0; i < nel; i++) { 2047 if (perm_read(p, cladatum->permissions.table, fp)) 2048 goto bad; 2049 } 2050 2051 if (read_cons_helper(p, &cladatum->constraints, ncons, 0, fp)) 2052 goto bad; 2053 2054 if ((p->policy_type == POLICY_KERN 2055 && p->policyvers >= POLICYDB_VERSION_VALIDATETRANS) 2056 || (p->policy_type == POLICY_BASE 2057 && p->policyvers >= MOD_POLICYDB_VERSION_VALIDATETRANS)) { 2058 /* grab the validatetrans rules */ 2059 rc = next_entry(buf, fp, sizeof(uint32_t)); 2060 if (rc < 0) 2061 goto bad; 2062 ncons = le32_to_cpu(buf[0]); 2063 if (read_cons_helper(p, &cladatum->validatetrans, ncons, 1, fp)) 2064 goto bad; 2065 } 2066 2067 if (hashtab_insert(h, key, cladatum)) 2068 goto bad; 2069 2070 return 0; 2071 2072 bad: 2073 class_destroy(key, cladatum, NULL); 2074 return -1; 2075} 2076 2077static int role_read(policydb_t * p 2078 __attribute__ ((unused)), hashtab_t h, 2079 struct policy_file *fp) 2080{ 2081 char *key = 0; 2082 role_datum_t *role; 2083 uint32_t buf[3]; 2084 size_t len; 2085 int rc, to_read = 2; 2086 2087 role = calloc(1, sizeof(role_datum_t)); 2088 if (!role) 2089 return -1; 2090 2091 if (policydb_has_boundary_feature(p)) 2092 to_read = 3; 2093 2094 rc = next_entry(buf, fp, sizeof(uint32_t) * to_read); 2095 if (rc < 0) 2096 goto bad; 2097 2098 len = le32_to_cpu(buf[0]); 2099 role->s.value = le32_to_cpu(buf[1]); 2100 if (policydb_has_boundary_feature(p)) 2101 role->bounds = le32_to_cpu(buf[2]); 2102 2103 key = malloc(len + 1); 2104 if (!key) 2105 goto bad; 2106 rc = next_entry(key, fp, len); 2107 if (rc < 0) 2108 goto bad; 2109 key[len] = 0; 2110 2111 if (ebitmap_read(&role->dominates, fp)) 2112 goto bad; 2113 2114 if (p->policy_type == POLICY_KERN) { 2115 if (ebitmap_read(&role->types.types, fp)) 2116 goto bad; 2117 } else { 2118 if (type_set_read(&role->types, fp)) 2119 goto bad; 2120 } 2121 2122 if (p->policy_type != POLICY_KERN && 2123 p->policyvers >= MOD_POLICYDB_VERSION_ROLEATTRIB) { 2124 rc = next_entry(buf, fp, sizeof(uint32_t)); 2125 if (rc < 0) 2126 goto bad; 2127 2128 role->flavor = le32_to_cpu(buf[0]); 2129 2130 if (ebitmap_read(&role->roles, fp)) 2131 goto bad; 2132 } 2133 2134 if (strcmp(key, OBJECT_R) == 0) { 2135 if (role->s.value != OBJECT_R_VAL) { 2136 ERR(fp->handle, "role %s has wrong value %d", 2137 OBJECT_R, role->s.value); 2138 role_destroy(key, role, NULL); 2139 return -1; 2140 } 2141 role_destroy(key, role, NULL); 2142 return 0; 2143 } 2144 2145 if (hashtab_insert(h, key, role)) 2146 goto bad; 2147 2148 return 0; 2149 2150 bad: 2151 role_destroy(key, role, NULL); 2152 return -1; 2153} 2154 2155static int type_read(policydb_t * p 2156 __attribute__ ((unused)), hashtab_t h, 2157 struct policy_file *fp) 2158{ 2159 char *key = 0; 2160 type_datum_t *typdatum; 2161 uint32_t buf[5]; 2162 size_t len; 2163 int rc, to_read; 2164 int pos = 0; 2165 2166 typdatum = calloc(1, sizeof(type_datum_t)); 2167 if (!typdatum) 2168 return -1; 2169 2170 if (policydb_has_boundary_feature(p)) { 2171 if (p->policy_type != POLICY_KERN 2172 && p->policyvers >= MOD_POLICYDB_VERSION_BOUNDARY_ALIAS) 2173 to_read = 5; 2174 else 2175 to_read = 4; 2176 } 2177 else if (p->policy_type == POLICY_KERN) 2178 to_read = 3; 2179 else if (p->policyvers >= MOD_POLICYDB_VERSION_PERMISSIVE) 2180 to_read = 5; 2181 else 2182 to_read = 4; 2183 2184 rc = next_entry(buf, fp, sizeof(uint32_t) * to_read); 2185 if (rc < 0) 2186 goto bad; 2187 2188 len = le32_to_cpu(buf[pos]); 2189 typdatum->s.value = le32_to_cpu(buf[++pos]); 2190 if (policydb_has_boundary_feature(p)) { 2191 uint32_t properties; 2192 2193 if (p->policy_type != POLICY_KERN 2194 && p->policyvers >= MOD_POLICYDB_VERSION_BOUNDARY_ALIAS) { 2195 typdatum->primary = le32_to_cpu(buf[++pos]); 2196 properties = le32_to_cpu(buf[++pos]); 2197 } 2198 else { 2199 properties = le32_to_cpu(buf[++pos]); 2200 2201 if (properties & TYPEDATUM_PROPERTY_PRIMARY) 2202 typdatum->primary = 1; 2203 } 2204 2205 if (properties & TYPEDATUM_PROPERTY_ATTRIBUTE) 2206 typdatum->flavor = TYPE_ATTRIB; 2207 if (properties & TYPEDATUM_PROPERTY_ALIAS 2208 && p->policy_type != POLICY_KERN) 2209 typdatum->flavor = TYPE_ALIAS; 2210 if (properties & TYPEDATUM_PROPERTY_PERMISSIVE 2211 && p->policy_type != POLICY_KERN) 2212 typdatum->flags |= TYPE_FLAGS_PERMISSIVE; 2213 2214 typdatum->bounds = le32_to_cpu(buf[++pos]); 2215 } else { 2216 typdatum->primary = le32_to_cpu(buf[++pos]); 2217 if (p->policy_type != POLICY_KERN) { 2218 typdatum->flavor = le32_to_cpu(buf[++pos]); 2219 if (p->policyvers >= MOD_POLICYDB_VERSION_PERMISSIVE) 2220 typdatum->flags = le32_to_cpu(buf[++pos]); 2221 } 2222 } 2223 2224 if (p->policy_type != POLICY_KERN) { 2225 if (ebitmap_read(&typdatum->types, fp)) 2226 goto bad; 2227 } 2228 2229 key = malloc(len + 1); 2230 if (!key) 2231 goto bad; 2232 rc = next_entry(key, fp, len); 2233 if (rc < 0) 2234 goto bad; 2235 key[len] = 0; 2236 2237 if (hashtab_insert(h, key, typdatum)) 2238 goto bad; 2239 2240 return 0; 2241 2242 bad: 2243 type_destroy(key, typdatum, NULL); 2244 return -1; 2245} 2246 2247int role_trans_read(policydb_t *p, struct policy_file *fp) 2248{ 2249 role_trans_t **t = &p->role_tr; 2250 unsigned int i; 2251 uint32_t buf[3], nel; 2252 role_trans_t *tr, *ltr; 2253 int rc; 2254 int new_roletr = (p->policy_type == POLICY_KERN && 2255 p->policyvers >= POLICYDB_VERSION_ROLETRANS); 2256 2257 rc = next_entry(buf, fp, sizeof(uint32_t)); 2258 if (rc < 0) 2259 return -1; 2260 nel = le32_to_cpu(buf[0]); 2261 ltr = NULL; 2262 for (i = 0; i < nel; i++) { 2263 tr = calloc(1, sizeof(struct role_trans)); 2264 if (!tr) { 2265 return -1; 2266 } 2267 if (ltr) { 2268 ltr->next = tr; 2269 } else { 2270 *t = tr; 2271 } 2272 rc = next_entry(buf, fp, sizeof(uint32_t) * 3); 2273 if (rc < 0) 2274 return -1; 2275 tr->role = le32_to_cpu(buf[0]); 2276 tr->type = le32_to_cpu(buf[1]); 2277 tr->new_role = le32_to_cpu(buf[2]); 2278 if (new_roletr) { 2279 rc = next_entry(buf, fp, sizeof(uint32_t)); 2280 if (rc < 0) 2281 return -1; 2282 tr->tclass = le32_to_cpu(buf[0]); 2283 } else 2284 tr->tclass = SECCLASS_PROCESS; 2285 ltr = tr; 2286 } 2287 return 0; 2288} 2289 2290int role_allow_read(role_allow_t ** r, struct policy_file *fp) 2291{ 2292 unsigned int i; 2293 uint32_t buf[2], nel; 2294 role_allow_t *ra, *lra; 2295 int rc; 2296 2297 rc = next_entry(buf, fp, sizeof(uint32_t)); 2298 if (rc < 0) 2299 return -1; 2300 nel = le32_to_cpu(buf[0]); 2301 lra = NULL; 2302 for (i = 0; i < nel; i++) { 2303 ra = calloc(1, sizeof(struct role_allow)); 2304 if (!ra) { 2305 return -1; 2306 } 2307 if (lra) { 2308 lra->next = ra; 2309 } else { 2310 *r = ra; 2311 } 2312 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2313 if (rc < 0) 2314 return -1; 2315 ra->role = le32_to_cpu(buf[0]); 2316 ra->new_role = le32_to_cpu(buf[1]); 2317 lra = ra; 2318 } 2319 return 0; 2320} 2321 2322int filename_trans_read(filename_trans_t **t, struct policy_file *fp) 2323{ 2324 unsigned int i; 2325 uint32_t buf[4], nel, len; 2326 filename_trans_t *ft, *lft; 2327 int rc; 2328 char *name; 2329 2330 rc = next_entry(buf, fp, sizeof(uint32_t)); 2331 if (rc < 0) 2332 return -1; 2333 nel = le32_to_cpu(buf[0]); 2334 2335 lft = NULL; 2336 for (i = 0; i < nel; i++) { 2337 ft = calloc(1, sizeof(struct filename_trans)); 2338 if (!ft) 2339 return -1; 2340 if (lft) 2341 lft->next = ft; 2342 else 2343 *t = ft; 2344 lft = ft; 2345 rc = next_entry(buf, fp, sizeof(uint32_t)); 2346 if (rc < 0) 2347 return -1; 2348 len = le32_to_cpu(buf[0]); 2349 2350 name = calloc(len, sizeof(*name)); 2351 if (!name) 2352 return -1; 2353 2354 ft->name = name; 2355 2356 rc = next_entry(name, fp, len); 2357 if (rc < 0) 2358 return -1; 2359 2360 rc = next_entry(buf, fp, sizeof(uint32_t) * 4); 2361 if (rc < 0) 2362 return -1; 2363 2364 ft->stype = le32_to_cpu(buf[0]); 2365 ft->ttype = le32_to_cpu(buf[1]); 2366 ft->tclass = le32_to_cpu(buf[2]); 2367 ft->otype = le32_to_cpu(buf[3]); 2368 } 2369 return 0; 2370} 2371 2372static int ocontext_read_xen(struct policydb_compat_info *info, 2373 policydb_t *p, struct policy_file *fp) 2374{ 2375 unsigned int i, j; 2376 size_t nel; 2377 ocontext_t *l, *c; 2378 uint32_t buf[8]; 2379 int rc; 2380 2381 for (i = 0; i < info->ocon_num; i++) { 2382 rc = next_entry(buf, fp, sizeof(uint32_t)); 2383 if (rc < 0) 2384 return -1; 2385 nel = le32_to_cpu(buf[0]); 2386 l = NULL; 2387 for (j = 0; j < nel; j++) { 2388 c = calloc(1, sizeof(ocontext_t)); 2389 if (!c) 2390 return -1; 2391 if (l) 2392 l->next = c; 2393 else 2394 p->ocontexts[i] = c; 2395 l = c; 2396 switch (i) { 2397 case OCON_XEN_ISID: 2398 rc = next_entry(buf, fp, sizeof(uint32_t)); 2399 if (rc < 0) 2400 return -1; 2401 c->sid[0] = le32_to_cpu(buf[0]); 2402 if (context_read_and_validate 2403 (&c->context[0], p, fp)) 2404 return -1; 2405 break; 2406 case OCON_XEN_PIRQ: 2407 rc = next_entry(buf, fp, sizeof(uint32_t)); 2408 if (rc < 0) 2409 return -1; 2410 c->u.pirq = le32_to_cpu(buf[0]); 2411 if (context_read_and_validate 2412 (&c->context[0], p, fp)) 2413 return -1; 2414 break; 2415 case OCON_XEN_IOPORT: 2416 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2417 if (rc < 0) 2418 return -1; 2419 c->u.ioport.low_ioport = le32_to_cpu(buf[0]); 2420 c->u.ioport.high_ioport = le32_to_cpu(buf[1]); 2421 if (context_read_and_validate 2422 (&c->context[0], p, fp)) 2423 return -1; 2424 break; 2425 case OCON_XEN_IOMEM: 2426 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2427 if (rc < 0) 2428 return -1; 2429 c->u.iomem.low_iomem = le32_to_cpu(buf[0]); 2430 c->u.iomem.high_iomem = le32_to_cpu(buf[1]); 2431 if (context_read_and_validate 2432 (&c->context[0], p, fp)) 2433 return -1; 2434 break; 2435 case OCON_XEN_PCIDEVICE: 2436 rc = next_entry(buf, fp, sizeof(uint32_t)); 2437 if (rc < 0) 2438 return -1; 2439 c->u.device = le32_to_cpu(buf[0]); 2440 if (context_read_and_validate 2441 (&c->context[0], p, fp)) 2442 return -1; 2443 break; 2444 default: 2445 /* should never get here */ 2446 ERR(fp->handle, "Unknown Xen ocontext"); 2447 return -1; 2448 } 2449 } 2450 } 2451 return 0; 2452} 2453static int ocontext_read_selinux(struct policydb_compat_info *info, 2454 policydb_t * p, struct policy_file *fp) 2455{ 2456 unsigned int i, j; 2457 size_t nel, len; 2458 ocontext_t *l, *c; 2459 uint32_t buf[8]; 2460 int rc; 2461 2462 for (i = 0; i < info->ocon_num; i++) { 2463 rc = next_entry(buf, fp, sizeof(uint32_t)); 2464 if (rc < 0) 2465 return -1; 2466 nel = le32_to_cpu(buf[0]); 2467 l = NULL; 2468 for (j = 0; j < nel; j++) { 2469 c = calloc(1, sizeof(ocontext_t)); 2470 if (!c) { 2471 return -1; 2472 } 2473 if (l) { 2474 l->next = c; 2475 } else { 2476 p->ocontexts[i] = c; 2477 } 2478 l = c; 2479 switch (i) { 2480 case OCON_ISID: 2481 rc = next_entry(buf, fp, sizeof(uint32_t)); 2482 if (rc < 0) 2483 return -1; 2484 c->sid[0] = le32_to_cpu(buf[0]); 2485 if (context_read_and_validate 2486 (&c->context[0], p, fp)) 2487 return -1; 2488 break; 2489 case OCON_FS: 2490 case OCON_NETIF: 2491 rc = next_entry(buf, fp, sizeof(uint32_t)); 2492 if (rc < 0) 2493 return -1; 2494 len = le32_to_cpu(buf[0]); 2495 c->u.name = malloc(len + 1); 2496 if (!c->u.name) 2497 return -1; 2498 rc = next_entry(c->u.name, fp, len); 2499 if (rc < 0) 2500 return -1; 2501 c->u.name[len] = 0; 2502 if (context_read_and_validate 2503 (&c->context[0], p, fp)) 2504 return -1; 2505 if (context_read_and_validate 2506 (&c->context[1], p, fp)) 2507 return -1; 2508 break; 2509 case OCON_PORT: 2510 rc = next_entry(buf, fp, sizeof(uint32_t) * 3); 2511 if (rc < 0) 2512 return -1; 2513 c->u.port.protocol = le32_to_cpu(buf[0]); 2514 c->u.port.low_port = le32_to_cpu(buf[1]); 2515 c->u.port.high_port = le32_to_cpu(buf[2]); 2516 if (context_read_and_validate 2517 (&c->context[0], p, fp)) 2518 return -1; 2519 break; 2520 case OCON_NODE: 2521 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2522 if (rc < 0) 2523 return -1; 2524 c->u.node.addr = buf[0]; /* network order */ 2525 c->u.node.mask = buf[1]; /* network order */ 2526 if (context_read_and_validate 2527 (&c->context[0], p, fp)) 2528 return -1; 2529 break; 2530 case OCON_FSUSE: 2531 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2532 if (rc < 0) 2533 return -1; 2534 c->v.behavior = le32_to_cpu(buf[0]); 2535 len = le32_to_cpu(buf[1]); 2536 c->u.name = malloc(len + 1); 2537 if (!c->u.name) 2538 return -1; 2539 rc = next_entry(c->u.name, fp, len); 2540 if (rc < 0) 2541 return -1; 2542 c->u.name[len] = 0; 2543 if (context_read_and_validate 2544 (&c->context[0], p, fp)) 2545 return -1; 2546 break; 2547 case OCON_NODE6:{ 2548 int k; 2549 2550 rc = next_entry(buf, fp, sizeof(uint32_t) * 8); 2551 if (rc < 0) 2552 return -1; 2553 for (k = 0; k < 4; k++) 2554 /* network order */ 2555 c->u.node6.addr[k] = buf[k]; 2556 for (k = 0; k < 4; k++) 2557 /* network order */ 2558 c->u.node6.mask[k] = buf[k + 4]; 2559 if (context_read_and_validate 2560 (&c->context[0], p, fp)) 2561 return -1; 2562 break; 2563 } 2564 default:{ 2565 ERR(fp->handle, "Unknown SELinux ocontext"); 2566 return -1; 2567 } 2568 } 2569 } 2570 } 2571 return 0; 2572} 2573 2574static int ocontext_read(struct policydb_compat_info *info, 2575 policydb_t *p, struct policy_file *fp) 2576{ 2577 int rc = -1; 2578 switch (p->target_platform) { 2579 case SEPOL_TARGET_SELINUX: 2580 rc = ocontext_read_selinux(info, p, fp); 2581 break; 2582 case SEPOL_TARGET_XEN: 2583 rc = ocontext_read_xen(info, p, fp); 2584 break; 2585 default: 2586 ERR(fp->handle, "Unknown target"); 2587 } 2588 return rc; 2589} 2590 2591static int genfs_read(policydb_t * p, struct policy_file *fp) 2592{ 2593 uint32_t buf[1]; 2594 size_t nel, nel2, len, len2; 2595 genfs_t *genfs_p, *newgenfs, *genfs; 2596 unsigned int i, j; 2597 ocontext_t *l, *c, *newc = NULL; 2598 int rc; 2599 2600 rc = next_entry(buf, fp, sizeof(uint32_t)); 2601 if (rc < 0) 2602 goto bad; 2603 nel = le32_to_cpu(buf[0]); 2604 genfs_p = NULL; 2605 for (i = 0; i < nel; i++) { 2606 rc = next_entry(buf, fp, sizeof(uint32_t)); 2607 if (rc < 0) 2608 goto bad; 2609 len = le32_to_cpu(buf[0]); 2610 newgenfs = calloc(1, sizeof(genfs_t)); 2611 if (!newgenfs) 2612 goto bad; 2613 newgenfs->fstype = malloc(len + 1); 2614 if (!newgenfs->fstype) { 2615 free(newgenfs); 2616 goto bad; 2617 } 2618 rc = next_entry(newgenfs->fstype, fp, len); 2619 if (rc < 0) { 2620 free(newgenfs->fstype); 2621 free(newgenfs); 2622 goto bad; 2623 } 2624 newgenfs->fstype[len] = 0; 2625 for (genfs_p = NULL, genfs = p->genfs; genfs; 2626 genfs_p = genfs, genfs = genfs->next) { 2627 if (strcmp(newgenfs->fstype, genfs->fstype) == 0) { 2628 ERR(fp->handle, "dup genfs fstype %s", 2629 newgenfs->fstype); 2630 free(newgenfs->fstype); 2631 free(newgenfs); 2632 goto bad; 2633 } 2634 if (strcmp(newgenfs->fstype, genfs->fstype) < 0) 2635 break; 2636 } 2637 newgenfs->next = genfs; 2638 if (genfs_p) 2639 genfs_p->next = newgenfs; 2640 else 2641 p->genfs = newgenfs; 2642 rc = next_entry(buf, fp, sizeof(uint32_t)); 2643 if (rc < 0) 2644 goto bad; 2645 nel2 = le32_to_cpu(buf[0]); 2646 for (j = 0; j < nel2; j++) { 2647 newc = calloc(1, sizeof(ocontext_t)); 2648 if (!newc) { 2649 goto bad; 2650 } 2651 rc = next_entry(buf, fp, sizeof(uint32_t)); 2652 if (rc < 0) 2653 goto bad; 2654 len = le32_to_cpu(buf[0]); 2655 newc->u.name = malloc(len + 1); 2656 if (!newc->u.name) { 2657 goto bad; 2658 } 2659 rc = next_entry(newc->u.name, fp, len); 2660 if (rc < 0) 2661 goto bad; 2662 newc->u.name[len] = 0; 2663 rc = next_entry(buf, fp, sizeof(uint32_t)); 2664 if (rc < 0) 2665 goto bad; 2666 newc->v.sclass = le32_to_cpu(buf[0]); 2667 if (context_read_and_validate(&newc->context[0], p, fp)) 2668 goto bad; 2669 for (l = NULL, c = newgenfs->head; c; 2670 l = c, c = c->next) { 2671 if (!strcmp(newc->u.name, c->u.name) && 2672 (!c->v.sclass || !newc->v.sclass || 2673 newc->v.sclass == c->v.sclass)) { 2674 ERR(fp->handle, "dup genfs entry " 2675 "(%s,%s)", newgenfs->fstype, 2676 c->u.name); 2677 goto bad; 2678 } 2679 len = strlen(newc->u.name); 2680 len2 = strlen(c->u.name); 2681 if (len > len2) 2682 break; 2683 } 2684 newc->next = c; 2685 if (l) 2686 l->next = newc; 2687 else 2688 newgenfs->head = newc; 2689 } 2690 } 2691 2692 return 0; 2693 2694 bad: 2695 if (newc) { 2696 context_destroy(&newc->context[0]); 2697 context_destroy(&newc->context[1]); 2698 free(newc->u.name); 2699 free(newc); 2700 } 2701 return -1; 2702} 2703 2704/* 2705 * Read a MLS level structure from a policydb binary 2706 * representation file. 2707 */ 2708static int mls_read_level(mls_level_t * lp, struct policy_file *fp) 2709{ 2710 uint32_t buf[1]; 2711 int rc; 2712 2713 mls_level_init(lp); 2714 2715 rc = next_entry(buf, fp, sizeof(uint32_t)); 2716 if (rc < 0) { 2717 ERR(fp->handle, "truncated level"); 2718 goto bad; 2719 } 2720 lp->sens = le32_to_cpu(buf[0]); 2721 2722 if (ebitmap_read(&lp->cat, fp)) { 2723 ERR(fp->handle, "error reading level categories"); 2724 goto bad; 2725 } 2726 return 0; 2727 2728 bad: 2729 return -EINVAL; 2730} 2731 2732static int user_read(policydb_t * p, hashtab_t h, struct policy_file *fp) 2733{ 2734 char *key = 0; 2735 user_datum_t *usrdatum; 2736 uint32_t buf[3]; 2737 size_t len; 2738 int rc, to_read = 2; 2739 2740 usrdatum = calloc(1, sizeof(user_datum_t)); 2741 if (!usrdatum) 2742 return -1; 2743 2744 if (policydb_has_boundary_feature(p)) 2745 to_read = 3; 2746 2747 rc = next_entry(buf, fp, sizeof(uint32_t) * to_read); 2748 if (rc < 0) 2749 goto bad; 2750 2751 len = le32_to_cpu(buf[0]); 2752 usrdatum->s.value = le32_to_cpu(buf[1]); 2753 if (policydb_has_boundary_feature(p)) 2754 usrdatum->bounds = le32_to_cpu(buf[2]); 2755 2756 key = malloc(len + 1); 2757 if (!key) 2758 goto bad; 2759 rc = next_entry(key, fp, len); 2760 if (rc < 0) 2761 goto bad; 2762 key[len] = 0; 2763 2764 if (p->policy_type == POLICY_KERN) { 2765 if (ebitmap_read(&usrdatum->roles.roles, fp)) 2766 goto bad; 2767 } else { 2768 if (role_set_read(&usrdatum->roles, fp)) 2769 goto bad; 2770 } 2771 2772 /* users were not allowed in mls modules before version 2773 * MOD_POLICYDB_VERSION_MLS_USERS, but they could have been 2774 * required - the mls fields will be empty. user declarations in 2775 * non-mls modules will also have empty mls fields */ 2776 if ((p->policy_type == POLICY_KERN 2777 && p->policyvers >= POLICYDB_VERSION_MLS) 2778 || (p->policy_type == POLICY_MOD 2779 && p->policyvers >= MOD_POLICYDB_VERSION_MLS 2780 && p->policyvers < MOD_POLICYDB_VERSION_MLS_USERS) 2781 || (p->policy_type == POLICY_BASE 2782 && p->policyvers >= MOD_POLICYDB_VERSION_MLS 2783 && p->policyvers < MOD_POLICYDB_VERSION_MLS_USERS)) { 2784 if (mls_read_range_helper(&usrdatum->exp_range, fp)) 2785 goto bad; 2786 if (mls_read_level(&usrdatum->exp_dfltlevel, fp)) 2787 goto bad; 2788 if (p->policy_type != POLICY_KERN) { 2789 if (mls_range_to_semantic(&usrdatum->exp_range, 2790 &usrdatum->range)) 2791 goto bad; 2792 if (mls_level_to_semantic(&usrdatum->exp_dfltlevel, 2793 &usrdatum->dfltlevel)) 2794 goto bad; 2795 } 2796 } else if ((p->policy_type == POLICY_MOD 2797 && p->policyvers >= MOD_POLICYDB_VERSION_MLS_USERS) 2798 || (p->policy_type == POLICY_BASE 2799 && p->policyvers >= MOD_POLICYDB_VERSION_MLS_USERS)) { 2800 if (mls_read_semantic_range_helper(&usrdatum->range, fp)) 2801 goto bad; 2802 if (mls_read_semantic_level_helper(&usrdatum->dfltlevel, fp)) 2803 goto bad; 2804 } 2805 2806 if (hashtab_insert(h, key, usrdatum)) 2807 goto bad; 2808 2809 return 0; 2810 2811 bad: 2812 user_destroy(key, usrdatum, NULL); 2813 return -1; 2814} 2815 2816static int sens_read(policydb_t * p 2817 __attribute__ ((unused)), hashtab_t h, 2818 struct policy_file *fp) 2819{ 2820 char *key = 0; 2821 level_datum_t *levdatum; 2822 uint32_t buf[2], len; 2823 int rc; 2824 2825 levdatum = malloc(sizeof(level_datum_t)); 2826 if (!levdatum) 2827 return -1; 2828 level_datum_init(levdatum); 2829 2830 rc = next_entry(buf, fp, (sizeof(uint32_t) * 2)); 2831 if (rc < 0) 2832 goto bad; 2833 2834 len = le32_to_cpu(buf[0]); 2835 levdatum->isalias = le32_to_cpu(buf[1]); 2836 2837 key = malloc(len + 1); 2838 if (!key) 2839 goto bad; 2840 rc = next_entry(key, fp, len); 2841 if (rc < 0) 2842 goto bad; 2843 key[len] = 0; 2844 2845 levdatum->level = malloc(sizeof(mls_level_t)); 2846 if (!levdatum->level || mls_read_level(levdatum->level, fp)) 2847 goto bad; 2848 2849 if (hashtab_insert(h, key, levdatum)) 2850 goto bad; 2851 2852 return 0; 2853 2854 bad: 2855 sens_destroy(key, levdatum, NULL); 2856 return -1; 2857} 2858 2859static int cat_read(policydb_t * p 2860 __attribute__ ((unused)), hashtab_t h, 2861 struct policy_file *fp) 2862{ 2863 char *key = 0; 2864 cat_datum_t *catdatum; 2865 uint32_t buf[3], len; 2866 int rc; 2867 2868 catdatum = malloc(sizeof(cat_datum_t)); 2869 if (!catdatum) 2870 return -1; 2871 cat_datum_init(catdatum); 2872 2873 rc = next_entry(buf, fp, (sizeof(uint32_t) * 3)); 2874 if (rc < 0) 2875 goto bad; 2876 2877 len = le32_to_cpu(buf[0]); 2878 catdatum->s.value = le32_to_cpu(buf[1]); 2879 catdatum->isalias = le32_to_cpu(buf[2]); 2880 2881 key = malloc(len + 1); 2882 if (!key) 2883 goto bad; 2884 rc = next_entry(key, fp, len); 2885 if (rc < 0) 2886 goto bad; 2887 key[len] = 0; 2888 2889 if (hashtab_insert(h, key, catdatum)) 2890 goto bad; 2891 2892 return 0; 2893 2894 bad: 2895 cat_destroy(key, catdatum, NULL); 2896 return -1; 2897} 2898 2899static int (*read_f[SYM_NUM]) (policydb_t * p, hashtab_t h, 2900 struct policy_file * fp) = { 2901common_read, class_read, role_read, type_read, user_read, 2902 cond_read_bool, sens_read, cat_read,}; 2903 2904/************** module reading functions below **************/ 2905 2906static avrule_t *avrule_read(policydb_t * p 2907 __attribute__ ((unused)), struct policy_file *fp) 2908{ 2909 unsigned int i; 2910 uint32_t buf[2], len; 2911 class_perm_node_t *cur, *tail = NULL; 2912 avrule_t *avrule; 2913 int rc; 2914 2915 avrule = (avrule_t *) malloc(sizeof(avrule_t)); 2916 if (!avrule) 2917 return NULL; 2918 2919 avrule_init(avrule); 2920 2921 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2922 if (rc < 0) 2923 goto bad; 2924 2925 (avrule)->specified = le32_to_cpu(buf[0]); 2926 (avrule)->flags = le32_to_cpu(buf[1]); 2927 2928 if (type_set_read(&avrule->stypes, fp)) 2929 goto bad; 2930 2931 if (type_set_read(&avrule->ttypes, fp)) 2932 goto bad; 2933 2934 rc = next_entry(buf, fp, sizeof(uint32_t)); 2935 if (rc < 0) 2936 goto bad; 2937 len = le32_to_cpu(buf[0]); 2938 2939 for (i = 0; i < len; i++) { 2940 cur = (class_perm_node_t *) malloc(sizeof(class_perm_node_t)); 2941 if (!cur) 2942 goto bad; 2943 class_perm_node_init(cur); 2944 2945 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 2946 if (rc < 0) { 2947 free(cur); 2948 goto bad; 2949 } 2950 2951 cur->class = le32_to_cpu(buf[0]); 2952 cur->data = le32_to_cpu(buf[1]); 2953 2954 if (!tail) { 2955 avrule->perms = cur; 2956 } else { 2957 tail->next = cur; 2958 } 2959 tail = cur; 2960 } 2961 2962 return avrule; 2963 bad: 2964 if (avrule) { 2965 avrule_destroy(avrule); 2966 free(avrule); 2967 } 2968 return NULL; 2969} 2970 2971static int range_read(policydb_t * p, struct policy_file *fp) 2972{ 2973 uint32_t buf[2], nel; 2974 range_trans_t *rt, *lrt; 2975 range_trans_rule_t *rtr, *lrtr = NULL; 2976 unsigned int i; 2977 int new_rangetr = (p->policy_type == POLICY_KERN && 2978 p->policyvers >= POLICYDB_VERSION_RANGETRANS); 2979 int rc; 2980 2981 rc = next_entry(buf, fp, sizeof(uint32_t)); 2982 if (rc < 0) 2983 return -1; 2984 nel = le32_to_cpu(buf[0]); 2985 lrt = NULL; 2986 for (i = 0; i < nel; i++) { 2987 rt = calloc(1, sizeof(range_trans_t)); 2988 if (!rt) 2989 return -1; 2990 if (lrt) 2991 lrt->next = rt; 2992 else 2993 p->range_tr = rt; 2994 rc = next_entry(buf, fp, (sizeof(uint32_t) * 2)); 2995 if (rc < 0) 2996 return -1; 2997 rt->source_type = le32_to_cpu(buf[0]); 2998 rt->target_type = le32_to_cpu(buf[1]); 2999 if (new_rangetr) { 3000 rc = next_entry(buf, fp, (sizeof(uint32_t))); 3001 if (rc < 0) 3002 return -1; 3003 rt->target_class = le32_to_cpu(buf[0]); 3004 } else 3005 rt->target_class = SECCLASS_PROCESS; 3006 if (mls_read_range_helper(&rt->target_range, fp)) 3007 return -1; 3008 lrt = rt; 3009 } 3010 3011 /* if this is a kernel policy, we are done - otherwise we need to 3012 * convert these structs to range_trans_rule_ts */ 3013 if (p->policy_type == POLICY_KERN) 3014 return 0; 3015 3016 /* create range_trans_rules_ts that correspond to the range_trans_ts 3017 * that were just read in from an older policy */ 3018 for (rt = p->range_tr; rt; rt = rt->next) { 3019 rtr = malloc(sizeof(range_trans_rule_t)); 3020 if (!rtr) { 3021 return -1; 3022 } 3023 range_trans_rule_init(rtr); 3024 3025 if (lrtr) 3026 lrtr->next = rtr; 3027 else 3028 p->global->enabled->range_tr_rules = rtr; 3029 3030 if (ebitmap_set_bit(&rtr->stypes.types, rt->source_type - 1, 1)) 3031 return -1; 3032 3033 if (ebitmap_set_bit(&rtr->ttypes.types, rt->target_type - 1, 1)) 3034 return -1; 3035 3036 if (ebitmap_set_bit(&rtr->tclasses, rt->target_class - 1, 1)) 3037 return -1; 3038 3039 if (mls_range_to_semantic(&rt->target_range, &rtr->trange)) 3040 return -1; 3041 3042 lrtr = rtr; 3043 } 3044 3045 /* now destroy the range_trans_ts */ 3046 lrt = NULL; 3047 for (rt = p->range_tr; rt; rt = rt->next) { 3048 if (lrt) { 3049 ebitmap_destroy(&lrt->target_range.level[0].cat); 3050 ebitmap_destroy(&lrt->target_range.level[1].cat); 3051 free(lrt); 3052 } 3053 lrt = rt; 3054 } 3055 if (lrt) { 3056 ebitmap_destroy(&lrt->target_range.level[0].cat); 3057 ebitmap_destroy(&lrt->target_range.level[1].cat); 3058 free(lrt); 3059 } 3060 p->range_tr = NULL; 3061 3062 return 0; 3063} 3064 3065int avrule_read_list(policydb_t * p, avrule_t ** avrules, 3066 struct policy_file *fp) 3067{ 3068 unsigned int i; 3069 avrule_t *cur, *tail; 3070 uint32_t buf[1], len; 3071 int rc; 3072 3073 *avrules = tail = NULL; 3074 3075 rc = next_entry(buf, fp, sizeof(uint32_t)); 3076 if (rc < 0) { 3077 return -1; 3078 } 3079 len = le32_to_cpu(buf[0]); 3080 3081 for (i = 0; i < len; i++) { 3082 cur = avrule_read(p, fp); 3083 if (!cur) { 3084 return -1; 3085 } 3086 3087 if (!tail) { 3088 *avrules = cur; 3089 } else { 3090 tail->next = cur; 3091 } 3092 tail = cur; 3093 } 3094 3095 return 0; 3096} 3097 3098static int role_trans_rule_read(policydb_t *p, role_trans_rule_t ** r, 3099 struct policy_file *fp) 3100{ 3101 uint32_t buf[1], nel; 3102 unsigned int i; 3103 role_trans_rule_t *tr, *ltr; 3104 int rc; 3105 3106 rc = next_entry(buf, fp, sizeof(uint32_t)); 3107 if (rc < 0) 3108 return -1; 3109 nel = le32_to_cpu(buf[0]); 3110 ltr = NULL; 3111 for (i = 0; i < nel; i++) { 3112 tr = malloc(sizeof(role_trans_rule_t)); 3113 if (!tr) { 3114 return -1; 3115 } 3116 role_trans_rule_init(tr); 3117 3118 if (ltr) { 3119 ltr->next = tr; 3120 } else { 3121 *r = tr; 3122 } 3123 3124 if (role_set_read(&tr->roles, fp)) 3125 return -1; 3126 3127 if (type_set_read(&tr->types, fp)) 3128 return -1; 3129 3130 if (p->policyvers >= MOD_POLICYDB_VERSION_ROLETRANS) { 3131 if (ebitmap_read(&tr->classes, fp)) 3132 return -1; 3133 } else { 3134 if (ebitmap_set_bit(&tr->classes, SECCLASS_PROCESS - 1, 1)) 3135 return -1; 3136 } 3137 3138 rc = next_entry(buf, fp, sizeof(uint32_t)); 3139 if (rc < 0) 3140 return -1; 3141 tr->new_role = le32_to_cpu(buf[0]); 3142 ltr = tr; 3143 } 3144 3145 return 0; 3146} 3147 3148static int role_allow_rule_read(role_allow_rule_t ** r, struct policy_file *fp) 3149{ 3150 unsigned int i; 3151 uint32_t buf[1], nel; 3152 role_allow_rule_t *ra, *lra; 3153 int rc; 3154 3155 rc = next_entry(buf, fp, sizeof(uint32_t)); 3156 if (rc < 0) 3157 return -1; 3158 nel = le32_to_cpu(buf[0]); 3159 lra = NULL; 3160 for (i = 0; i < nel; i++) { 3161 ra = malloc(sizeof(role_allow_rule_t)); 3162 if (!ra) { 3163 return -1; 3164 } 3165 role_allow_rule_init(ra); 3166 3167 if (lra) { 3168 lra->next = ra; 3169 } else { 3170 *r = ra; 3171 } 3172 3173 if (role_set_read(&ra->roles, fp)) 3174 return -1; 3175 3176 if (role_set_read(&ra->new_roles, fp)) 3177 return -1; 3178 3179 lra = ra; 3180 } 3181 return 0; 3182} 3183 3184static int filename_trans_rule_read(filename_trans_rule_t ** r, struct policy_file *fp) 3185{ 3186 uint32_t buf[2], nel; 3187 unsigned int i, len; 3188 filename_trans_rule_t *ftr, *lftr; 3189 int rc; 3190 3191 rc = next_entry(buf, fp, sizeof(uint32_t)); 3192 if (rc < 0) 3193 return -1; 3194 nel = le32_to_cpu(buf[0]); 3195 lftr = NULL; 3196 for (i = 0; i < nel; i++) { 3197 ftr = malloc(sizeof(*ftr)); 3198 if (!ftr) 3199 return -1; 3200 3201 filename_trans_rule_init(ftr); 3202 3203 if (lftr) 3204 lftr->next = ftr; 3205 else 3206 *r = ftr; 3207 lftr = ftr; 3208 3209 rc = next_entry(buf, fp, sizeof(uint32_t)); 3210 if (rc < 0) 3211 return -1; 3212 3213 len = le32_to_cpu(buf[0]); 3214 3215 ftr->name = malloc(len + 1); 3216 if (!ftr->name) 3217 return -1; 3218 3219 rc = next_entry(ftr->name, fp, len); 3220 if (rc) 3221 return -1; 3222 ftr->name[len] = 0; 3223 3224 if (type_set_read(&ftr->stypes, fp)) 3225 return -1; 3226 3227 if (type_set_read(&ftr->ttypes, fp)) 3228 return -1; 3229 3230 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 3231 if (rc < 0) 3232 return -1; 3233 ftr->tclass = le32_to_cpu(buf[0]); 3234 ftr->otype = le32_to_cpu(buf[1]); 3235 } 3236 3237 return 0; 3238} 3239 3240static int range_trans_rule_read(range_trans_rule_t ** r, 3241 struct policy_file *fp) 3242{ 3243 uint32_t buf[1], nel; 3244 unsigned int i; 3245 range_trans_rule_t *rt, *lrt = NULL; 3246 int rc; 3247 3248 rc = next_entry(buf, fp, sizeof(uint32_t)); 3249 if (rc < 0) 3250 return -1; 3251 nel = le32_to_cpu(buf[0]); 3252 for (i = 0; i < nel; i++) { 3253 rt = malloc(sizeof(range_trans_rule_t)); 3254 if (!rt) { 3255 return -1; 3256 } 3257 range_trans_rule_init(rt); 3258 3259 if (lrt) 3260 lrt->next = rt; 3261 else 3262 *r = rt; 3263 3264 if (type_set_read(&rt->stypes, fp)) 3265 return -1; 3266 3267 if (type_set_read(&rt->ttypes, fp)) 3268 return -1; 3269 3270 if (ebitmap_read(&rt->tclasses, fp)) 3271 return -1; 3272 3273 if (mls_read_semantic_range_helper(&rt->trange, fp)) 3274 return -1; 3275 3276 lrt = rt; 3277 } 3278 3279 return 0; 3280} 3281 3282static int scope_index_read(scope_index_t * scope_index, 3283 unsigned int num_scope_syms, struct policy_file *fp) 3284{ 3285 unsigned int i; 3286 uint32_t buf[1]; 3287 int rc; 3288 3289 for (i = 0; i < num_scope_syms; i++) { 3290 if (ebitmap_read(scope_index->scope + i, fp) == -1) { 3291 return -1; 3292 } 3293 } 3294 rc = next_entry(buf, fp, sizeof(uint32_t)); 3295 if (rc < 0) 3296 return -1; 3297 scope_index->class_perms_len = le32_to_cpu(buf[0]); 3298 if (scope_index->class_perms_len == 0) { 3299 scope_index->class_perms_map = NULL; 3300 return 0; 3301 } 3302 if ((scope_index->class_perms_map = 3303 calloc(scope_index->class_perms_len, 3304 sizeof(*scope_index->class_perms_map))) == NULL) { 3305 return -1; 3306 } 3307 for (i = 0; i < scope_index->class_perms_len; i++) { 3308 if (ebitmap_read(scope_index->class_perms_map + i, fp) == -1) { 3309 return -1; 3310 } 3311 } 3312 return 0; 3313} 3314 3315static int avrule_decl_read(policydb_t * p, avrule_decl_t * decl, 3316 unsigned int num_scope_syms, struct policy_file *fp) 3317{ 3318 uint32_t buf[2], nprim, nel; 3319 unsigned int i, j; 3320 int rc; 3321 3322 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 3323 if (rc < 0) 3324 return -1; 3325 decl->decl_id = le32_to_cpu(buf[0]); 3326 decl->enabled = le32_to_cpu(buf[1]); 3327 if (cond_read_list(p, &decl->cond_list, fp) == -1 || 3328 avrule_read_list(p, &decl->avrules, fp) == -1 || 3329 role_trans_rule_read(p, &decl->role_tr_rules, fp) == -1 || 3330 role_allow_rule_read(&decl->role_allow_rules, fp) == -1) { 3331 return -1; 3332 } 3333 3334 if (p->policyvers >= MOD_POLICYDB_VERSION_FILENAME_TRANS && 3335 filename_trans_rule_read(&decl->filename_trans_rules, fp)) 3336 return -1; 3337 3338 if (p->policyvers >= MOD_POLICYDB_VERSION_RANGETRANS && 3339 range_trans_rule_read(&decl->range_tr_rules, fp) == -1) { 3340 return -1; 3341 } 3342 if (scope_index_read(&decl->required, num_scope_syms, fp) == -1 || 3343 scope_index_read(&decl->declared, num_scope_syms, fp) == -1) { 3344 return -1; 3345 } 3346 3347 for (i = 0; i < num_scope_syms; i++) { 3348 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 3349 if (rc < 0) 3350 return -1; 3351 nprim = le32_to_cpu(buf[0]); 3352 nel = le32_to_cpu(buf[1]); 3353 for (j = 0; j < nel; j++) { 3354 if (read_f[i] (p, decl->symtab[i].table, fp)) { 3355 return -1; 3356 } 3357 } 3358 decl->symtab[i].nprim = nprim; 3359 } 3360 return 0; 3361} 3362 3363static int avrule_block_read(policydb_t * p, 3364 avrule_block_t ** block, 3365 unsigned int num_scope_syms, 3366 struct policy_file *fp) 3367{ 3368 avrule_block_t *last_block = NULL, *curblock; 3369 uint32_t buf[1], num_blocks, nel; 3370 int rc; 3371 3372 rc = next_entry(buf, fp, sizeof(uint32_t)); 3373 if (rc < 0) 3374 return -1; 3375 num_blocks = le32_to_cpu(buf[0]); 3376 nel = num_blocks; 3377 while (num_blocks > 0) { 3378 avrule_decl_t *last_decl = NULL, *curdecl; 3379 uint32_t num_decls; 3380 if ((curblock = calloc(1, sizeof(*curblock))) == NULL) { 3381 return -1; 3382 } 3383 rc = next_entry(buf, fp, sizeof(uint32_t)); 3384 if (rc < 0) { 3385 free(curblock); 3386 return -1; 3387 } 3388 /* if this is the first block its non-optional, else its optional */ 3389 if (num_blocks != nel) 3390 curblock->flags |= AVRULE_OPTIONAL; 3391 3392 num_decls = le32_to_cpu(buf[0]); 3393 while (num_decls > 0) { 3394 if ((curdecl = avrule_decl_create(0)) == NULL) { 3395 avrule_block_destroy(curblock); 3396 return -1; 3397 } 3398 if (avrule_decl_read(p, curdecl, num_scope_syms, fp) == 3399 -1) { 3400 avrule_decl_destroy(curdecl); 3401 avrule_block_destroy(curblock); 3402 return -1; 3403 } 3404 if (curdecl->enabled) { 3405 if (curblock->enabled != NULL) { 3406 /* probably a corrupt file */ 3407 avrule_decl_destroy(curdecl); 3408 avrule_block_destroy(curblock); 3409 return -1; 3410 } 3411 curblock->enabled = curdecl; 3412 } 3413 /* one must be careful to reconstruct the 3414 * decl chain in its correct order */ 3415 if (curblock->branch_list == NULL) { 3416 curblock->branch_list = curdecl; 3417 } else { 3418 last_decl->next = curdecl; 3419 } 3420 last_decl = curdecl; 3421 num_decls--; 3422 } 3423 3424 if (*block == NULL) { 3425 *block = curblock; 3426 } else { 3427 last_block->next = curblock; 3428 } 3429 last_block = curblock; 3430 3431 num_blocks--; 3432 } 3433 3434 return 0; 3435} 3436 3437static int scope_read(policydb_t * p, int symnum, struct policy_file *fp) 3438{ 3439 scope_datum_t *scope = NULL; 3440 uint32_t buf[2]; 3441 char *key = NULL; 3442 size_t key_len; 3443 unsigned int i; 3444 hashtab_t h = p->scope[symnum].table; 3445 int rc; 3446 3447 rc = next_entry(buf, fp, sizeof(uint32_t)); 3448 if (rc < 0) 3449 goto cleanup; 3450 key_len = le32_to_cpu(buf[0]); 3451 key = malloc(key_len + 1); 3452 if (!key) 3453 goto cleanup; 3454 rc = next_entry(key, fp, key_len); 3455 if (rc < 0) 3456 goto cleanup; 3457 key[key_len] = '\0'; 3458 3459 /* ensure that there already exists a symbol with this key */ 3460 if (hashtab_search(p->symtab[symnum].table, key) == NULL) { 3461 goto cleanup; 3462 } 3463 3464 if ((scope = calloc(1, sizeof(*scope))) == NULL) { 3465 goto cleanup; 3466 } 3467 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 3468 if (rc < 0) 3469 goto cleanup; 3470 scope->scope = le32_to_cpu(buf[0]); 3471 scope->decl_ids_len = le32_to_cpu(buf[1]); 3472 assert(scope->decl_ids_len > 0); 3473 if ((scope->decl_ids = 3474 malloc(scope->decl_ids_len * sizeof(uint32_t))) == NULL) { 3475 goto cleanup; 3476 } 3477 rc = next_entry(scope->decl_ids, fp, sizeof(uint32_t) * scope->decl_ids_len); 3478 if (rc < 0) 3479 goto cleanup; 3480 for (i = 0; i < scope->decl_ids_len; i++) { 3481 scope->decl_ids[i] = le32_to_cpu(scope->decl_ids[i]); 3482 } 3483 3484 if (strcmp(key, "object_r") == 0 && h == p->p_roles_scope.table) { 3485 /* object_r was already added to this table in roles_init() */ 3486 scope_destroy(key, scope, NULL); 3487 } else { 3488 if (hashtab_insert(h, key, scope)) { 3489 goto cleanup; 3490 } 3491 } 3492 3493 return 0; 3494 3495 cleanup: 3496 scope_destroy(key, scope, NULL); 3497 return -1; 3498} 3499 3500/* 3501 * Read the configuration data from a policy database binary 3502 * representation file into a policy database structure. 3503 */ 3504int policydb_read(policydb_t * p, struct policy_file *fp, unsigned verbose) 3505{ 3506 3507 unsigned int i, j, r_policyvers; 3508 uint32_t buf[5]; 3509 size_t len, nprim, nel; 3510 char *policydb_str; 3511 struct policydb_compat_info *info; 3512 unsigned int policy_type, bufindex; 3513 ebitmap_node_t *tnode; 3514 int rc; 3515 3516 /* Read the magic number and string length. */ 3517 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 3518 if (rc < 0) 3519 return POLICYDB_ERROR; 3520 for (i = 0; i < 2; i++) 3521 buf[i] = le32_to_cpu(buf[i]); 3522 3523 if (buf[0] == POLICYDB_MAGIC) { 3524 policy_type = POLICY_KERN; 3525 } else if (buf[0] == POLICYDB_MOD_MAGIC) { 3526 policy_type = POLICY_MOD; 3527 } else { 3528 ERR(fp->handle, "policydb magic number %#08x does not " 3529 "match expected magic number %#08x or %#08x", 3530 buf[0], POLICYDB_MAGIC, POLICYDB_MOD_MAGIC); 3531 return POLICYDB_ERROR; 3532 } 3533 3534 len = buf[1]; 3535 if (len > POLICYDB_STRING_MAX_LENGTH) { 3536 ERR(fp->handle, "policydb string length too long "); 3537 return POLICYDB_ERROR; 3538 } 3539 3540 policydb_str = malloc(len + 1); 3541 if (!policydb_str) { 3542 ERR(fp->handle, "unable to allocate memory for policydb " 3543 "string of length %zu", len); 3544 return POLICYDB_ERROR; 3545 } 3546 rc = next_entry(policydb_str, fp, len); 3547 if (rc < 0) { 3548 ERR(fp->handle, "truncated policydb string identifier"); 3549 free(policydb_str); 3550 return POLICYDB_ERROR; 3551 } 3552 policydb_str[len] = 0; 3553 3554 if (policy_type == POLICY_KERN) { 3555 for (i = 0; i < POLICYDB_TARGET_SZ; i++) { 3556 if ((strcmp(policydb_str, policydb_target_strings[i]) 3557 == 0)) { 3558 policydb_set_target_platform(p, i); 3559 break; 3560 } 3561 } 3562 3563 if (i == POLICYDB_TARGET_SZ) { 3564 ERR(fp->handle, "cannot find a valid target for policy " 3565 "string %s", policydb_str); 3566 free(policydb_str); 3567 return POLICYDB_ERROR; 3568 } 3569 } else { 3570 if (strcmp(policydb_str, POLICYDB_MOD_STRING)) { 3571 ERR(fp->handle, "invalid string identifier %s", 3572 policydb_str); 3573 free(policydb_str); 3574 return POLICYDB_ERROR; 3575 } 3576 } 3577 3578 /* Done with policydb_str. */ 3579 free(policydb_str); 3580 policydb_str = NULL; 3581 3582 /* Read the version, config, and table sizes (and policy type if it's a module). */ 3583 if (policy_type == POLICY_KERN) 3584 nel = 4; 3585 else 3586 nel = 5; 3587 3588 rc = next_entry(buf, fp, sizeof(uint32_t) * nel); 3589 if (rc < 0) 3590 return POLICYDB_ERROR; 3591 for (i = 0; i < nel; i++) 3592 buf[i] = le32_to_cpu(buf[i]); 3593 3594 bufindex = 0; 3595 3596 if (policy_type == POLICY_MOD) { 3597 /* We know it's a module but not whether it's a base 3598 module or regular binary policy module. buf[0] 3599 tells us which. */ 3600 policy_type = buf[bufindex]; 3601 if (policy_type != POLICY_MOD && policy_type != POLICY_BASE) { 3602 ERR(fp->handle, "unknown module type: %#08x", 3603 policy_type); 3604 return POLICYDB_ERROR; 3605 } 3606 bufindex++; 3607 } 3608 3609 r_policyvers = buf[bufindex]; 3610 if (policy_type == POLICY_KERN) { 3611 if (r_policyvers < POLICYDB_VERSION_MIN || 3612 r_policyvers > POLICYDB_VERSION_MAX) { 3613 ERR(fp->handle, "policydb version %d does not match " 3614 "my version range %d-%d", buf[bufindex], 3615 POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX); 3616 return POLICYDB_ERROR; 3617 } 3618 } else if (policy_type == POLICY_BASE || policy_type == POLICY_MOD) { 3619 if (r_policyvers < MOD_POLICYDB_VERSION_MIN || 3620 r_policyvers > MOD_POLICYDB_VERSION_MAX) { 3621 ERR(fp->handle, "policydb module version %d does " 3622 "not match my version range %d-%d", 3623 buf[bufindex], MOD_POLICYDB_VERSION_MIN, 3624 MOD_POLICYDB_VERSION_MAX); 3625 return POLICYDB_ERROR; 3626 } 3627 } else { 3628 assert(0); 3629 } 3630 bufindex++; 3631 3632 /* Set the policy type and version from the read values. */ 3633 p->policy_type = policy_type; 3634 p->policyvers = r_policyvers; 3635 3636 if (buf[bufindex] & POLICYDB_CONFIG_MLS) { 3637 p->mls = 1; 3638 } else { 3639 p->mls = 0; 3640 } 3641 3642 p->handle_unknown = buf[bufindex] & POLICYDB_CONFIG_UNKNOWN_MASK; 3643 3644 bufindex++; 3645 3646 info = policydb_lookup_compat(r_policyvers, policy_type, 3647 p->target_platform); 3648 if (!info) { 3649 ERR(fp->handle, "unable to find policy compat info " 3650 "for version %d", r_policyvers); 3651 goto bad; 3652 } 3653 3654 if (buf[bufindex] != info->sym_num 3655 || buf[bufindex + 1] != info->ocon_num) { 3656 ERR(fp->handle, 3657 "policydb table sizes (%d,%d) do not " "match mine (%d,%d)", 3658 buf[bufindex], buf[bufindex + 1], info->sym_num, 3659 info->ocon_num); 3660 goto bad; 3661 } 3662 3663 if (p->policy_type == POLICY_MOD) { 3664 /* Get the module name and version */ 3665 if ((rc = next_entry(buf, fp, sizeof(uint32_t))) < 0) { 3666 goto bad; 3667 } 3668 len = le32_to_cpu(buf[0]); 3669 if ((p->name = malloc(len + 1)) == NULL) { 3670 goto bad; 3671 } 3672 if ((rc = next_entry(p->name, fp, len)) < 0) { 3673 goto bad; 3674 } 3675 p->name[len] = '\0'; 3676 if ((rc = next_entry(buf, fp, sizeof(uint32_t))) < 0) { 3677 goto bad; 3678 } 3679 len = le32_to_cpu(buf[0]); 3680 if ((p->version = malloc(len + 1)) == NULL) { 3681 goto bad; 3682 } 3683 if ((rc = next_entry(p->version, fp, len)) < 0) { 3684 goto bad; 3685 } 3686 p->version[len] = '\0'; 3687 } 3688 3689 if ((p->policyvers >= POLICYDB_VERSION_POLCAP && 3690 p->policy_type == POLICY_KERN) || 3691 (p->policyvers >= MOD_POLICYDB_VERSION_POLCAP && 3692 p->policy_type == POLICY_BASE) || 3693 (p->policyvers >= MOD_POLICYDB_VERSION_POLCAP && 3694 p->policy_type == POLICY_MOD)) { 3695 if (ebitmap_read(&p->policycaps, fp)) 3696 goto bad; 3697 } 3698 3699 if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE && 3700 p->policy_type == POLICY_KERN) { 3701 if (ebitmap_read(&p->permissive_map, fp)) 3702 goto bad; 3703 } 3704 3705 for (i = 0; i < info->sym_num; i++) { 3706 rc = next_entry(buf, fp, sizeof(uint32_t) * 2); 3707 if (rc < 0) 3708 goto bad; 3709 nprim = le32_to_cpu(buf[0]); 3710 nel = le32_to_cpu(buf[1]); 3711 for (j = 0; j < nel; j++) { 3712 if (read_f[i] (p, p->symtab[i].table, fp)) 3713 goto bad; 3714 } 3715 3716 p->symtab[i].nprim = nprim; 3717 } 3718 3719 if (policy_type == POLICY_KERN) { 3720 if (avtab_read(&p->te_avtab, fp, r_policyvers)) 3721 goto bad; 3722 if (r_policyvers >= POLICYDB_VERSION_BOOL) 3723 if (cond_read_list(p, &p->cond_list, fp)) 3724 goto bad; 3725 if (role_trans_read(p, fp)) 3726 goto bad; 3727 if (role_allow_read(&p->role_allow, fp)) 3728 goto bad; 3729 if (r_policyvers >= POLICYDB_VERSION_FILENAME_TRANS && 3730 filename_trans_read(&p->filename_trans, fp)) 3731 goto bad; 3732 } else { 3733 /* first read the AV rule blocks, then the scope tables */ 3734 avrule_block_destroy(p->global); 3735 p->global = NULL; 3736 if (avrule_block_read(p, &p->global, info->sym_num, fp) == -1) { 3737 goto bad; 3738 } 3739 for (i = 0; i < info->sym_num; i++) { 3740 if ((rc = next_entry(buf, fp, sizeof(uint32_t))) < 0) { 3741 goto bad; 3742 } 3743 nel = le32_to_cpu(buf[0]); 3744 for (j = 0; j < nel; j++) { 3745 if (scope_read(p, i, fp)) 3746 goto bad; 3747 } 3748 } 3749 3750 } 3751 3752 if (policydb_index_decls(p)) 3753 goto bad; 3754 3755 if (policydb_index_classes(p)) 3756 goto bad; 3757 3758 if (policydb_index_others(fp->handle, p, verbose)) 3759 goto bad; 3760 3761 if (ocontext_read(info, p, fp) == -1) { 3762 goto bad; 3763 } 3764 3765 if (genfs_read(p, fp) == -1) { 3766 goto bad; 3767 } 3768 3769 if ((p->policy_type == POLICY_KERN 3770 && p->policyvers >= POLICYDB_VERSION_MLS) 3771 || (p->policy_type == POLICY_BASE 3772 && p->policyvers >= MOD_POLICYDB_VERSION_MLS 3773 && p->policyvers < MOD_POLICYDB_VERSION_RANGETRANS)) { 3774 if (range_read(p, fp)) { 3775 goto bad; 3776 } 3777 } 3778 3779 if (policy_type == POLICY_KERN) { 3780 p->type_attr_map = malloc(p->p_types.nprim * sizeof(ebitmap_t)); 3781 p->attr_type_map = malloc(p->p_types.nprim * sizeof(ebitmap_t)); 3782 if (!p->type_attr_map || !p->attr_type_map) 3783 goto bad; 3784 for (i = 0; i < p->p_types.nprim; i++) { 3785 ebitmap_init(&p->type_attr_map[i]); 3786 ebitmap_init(&p->attr_type_map[i]); 3787 } 3788 for (i = 0; i < p->p_types.nprim; i++) { 3789 if (r_policyvers >= POLICYDB_VERSION_AVTAB) { 3790 if (ebitmap_read(&p->type_attr_map[i], fp)) 3791 goto bad; 3792 ebitmap_for_each_bit(&p->type_attr_map[i], 3793 tnode, j) { 3794 if (!ebitmap_node_get_bit(tnode, j) 3795 || i == j) 3796 continue; 3797 if (ebitmap_set_bit 3798 (&p->attr_type_map[j], i, 1)) 3799 goto bad; 3800 } 3801 } 3802 /* add the type itself as the degenerate case */ 3803 if (ebitmap_set_bit(&p->type_attr_map[i], i, 1)) 3804 goto bad; 3805 } 3806 } 3807 3808 return POLICYDB_SUCCESS; 3809 bad: 3810 return POLICYDB_ERROR; 3811} 3812 3813int policydb_reindex_users(policydb_t * p) 3814{ 3815 unsigned int i = SYM_USERS; 3816 3817 if (p->user_val_to_struct) 3818 free(p->user_val_to_struct); 3819 if (p->sym_val_to_name[i]) 3820 free(p->sym_val_to_name[i]); 3821 3822 p->user_val_to_struct = (user_datum_t **) 3823 malloc(p->p_users.nprim * sizeof(user_datum_t *)); 3824 if (!p->user_val_to_struct) 3825 return -1; 3826 3827 p->sym_val_to_name[i] = (char **) 3828 malloc(p->symtab[i].nprim * sizeof(char *)); 3829 if (!p->sym_val_to_name[i]) 3830 return -1; 3831 3832 if (hashtab_map(p->symtab[i].table, index_f[i], p)) 3833 return -1; 3834 3835 /* Expand user roles for context validity checking */ 3836 if (hashtab_map(p->p_users.table, policydb_user_cache, p)) 3837 return -1; 3838 3839 return 0; 3840} 3841 3842void policy_file_init(policy_file_t *pf) 3843{ 3844 memset(pf, 0, sizeof(policy_file_t)); 3845} 3846 3847int policydb_set_target_platform(policydb_t *p, int platform) 3848{ 3849 if (platform == SEPOL_TARGET_SELINUX) 3850 p->target_platform = SEPOL_TARGET_SELINUX; 3851 else if (platform == SEPOL_TARGET_XEN) 3852 p->target_platform = SEPOL_TARGET_XEN; 3853 else 3854 return -1; 3855 3856 return 0; 3857} 3858 3859