1 /* 2 * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, version 2. 7 * 8 * Authors: 9 * Casey Schaufler <casey@schaufler-ca.com> 10 * Ahmed S. Darwish <darwish.07@gmail.com> 11 * 12 * Special thanks to the authors of selinuxfs. 13 * 14 * Karl MacMillan <kmacmillan@tresys.com> 15 * James Morris <jmorris@redhat.com> 16 * 17 */ 18 19 #include <linux/kernel.h> 20 #include <linux/vmalloc.h> 21 #include <linux/security.h> 22 #include <linux/mutex.h> 23 #include <linux/slab.h> 24 #include <net/net_namespace.h> 25 #include <net/cipso_ipv4.h> 26 #include <linux/seq_file.h> 27 #include <linux/ctype.h> 28 #include <linux/audit.h> 29 #include <linux/magic.h> 30 #include "smack.h" 31 32 /* 33 * smackfs pseudo filesystem. 34 */ 35 36 enum smk_inos { 37 SMK_ROOT_INO = 2, 38 SMK_LOAD = 3, /* load policy */ 39 SMK_CIPSO = 4, /* load label -> CIPSO mapping */ 40 SMK_DOI = 5, /* CIPSO DOI */ 41 SMK_DIRECT = 6, /* CIPSO level indicating direct label */ 42 SMK_AMBIENT = 7, /* internet ambient label */ 43 SMK_NETLBLADDR = 8, /* single label hosts */ 44 SMK_ONLYCAP = 9, /* the only "capable" label */ 45 SMK_LOGGING = 10, /* logging */ 46 SMK_LOAD_SELF = 11, /* task specific rules */ 47 SMK_ACCESSES = 12, /* access policy */ 48 SMK_MAPPED = 13, /* CIPSO level indicating mapped label */ 49 SMK_LOAD2 = 14, /* load policy with long labels */ 50 SMK_LOAD_SELF2 = 15, /* load task specific rules with long labels */ 51 SMK_ACCESS2 = 16, /* make an access check with long labels */ 52 SMK_CIPSO2 = 17, /* load long label -> CIPSO mapping */ 53 SMK_REVOKE_SUBJ = 18, /* set rules with subject label to '-' */ 54 SMK_CHANGE_RULE = 19, /* change or add rules (long labels) */ 55 }; 56 57 /* 58 * List locks 59 */ 60 static DEFINE_MUTEX(smack_cipso_lock); 61 static DEFINE_MUTEX(smack_ambient_lock); 62 static DEFINE_MUTEX(smk_netlbladdr_lock); 63 64 /* 65 * This is the "ambient" label for network traffic. 66 * If it isn't somehow marked, use this. 67 * It can be reset via smackfs/ambient 68 */ 69 struct smack_known *smack_net_ambient; 70 71 /* 72 * This is the level in a CIPSO header that indicates a 73 * smack label is contained directly in the category set. 74 * It can be reset via smackfs/direct 75 */ 76 int smack_cipso_direct = SMACK_CIPSO_DIRECT_DEFAULT; 77 78 /* 79 * This is the level in a CIPSO header that indicates a 80 * secid is contained directly in the category set. 81 * It can be reset via smackfs/mapped 82 */ 83 int smack_cipso_mapped = SMACK_CIPSO_MAPPED_DEFAULT; 84 85 /* 86 * Unless a process is running with this label even 87 * having CAP_MAC_OVERRIDE isn't enough to grant 88 * privilege to violate MAC policy. If no label is 89 * designated (the NULL case) capabilities apply to 90 * everyone. It is expected that the hat (^) label 91 * will be used if any label is used. 92 */ 93 char *smack_onlycap; 94 95 /* 96 * Certain IP addresses may be designated as single label hosts. 97 * Packets are sent there unlabeled, but only from tasks that 98 * can write to the specified label. 99 */ 100 101 LIST_HEAD(smk_netlbladdr_list); 102 103 /* 104 * Rule lists are maintained for each label. 105 * This master list is just for reading /smack/load and /smack/load2. 106 */ 107 struct smack_master_list { 108 struct list_head list; 109 struct smack_rule *smk_rule; 110 }; 111 112 LIST_HEAD(smack_rule_list); 113 114 struct smack_parsed_rule { 115 struct smack_known *smk_subject; 116 char *smk_object; 117 int smk_access1; 118 int smk_access2; 119 }; 120 121 static int smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT; 122 123 const char *smack_cipso_option = SMACK_CIPSO_OPTION; 124 125 /* 126 * Values for parsing cipso rules 127 * SMK_DIGITLEN: Length of a digit field in a rule. 128 * SMK_CIPSOMIN: Minimum possible cipso rule length. 129 * SMK_CIPSOMAX: Maximum possible cipso rule length. 130 */ 131 #define SMK_DIGITLEN 4 132 #define SMK_CIPSOMIN (SMK_LABELLEN + 2 * SMK_DIGITLEN) 133 #define SMK_CIPSOMAX (SMK_CIPSOMIN + SMACK_CIPSO_MAXCATNUM * SMK_DIGITLEN) 134 135 /* 136 * Values for parsing MAC rules 137 * SMK_ACCESS: Maximum possible combination of access permissions 138 * SMK_ACCESSLEN: Maximum length for a rule access field 139 * SMK_LOADLEN: Smack rule length 140 */ 141 #define SMK_OACCESS "rwxa" 142 #define SMK_ACCESS "rwxat" 143 #define SMK_OACCESSLEN (sizeof(SMK_OACCESS) - 1) 144 #define SMK_ACCESSLEN (sizeof(SMK_ACCESS) - 1) 145 #define SMK_OLOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_OACCESSLEN) 146 #define SMK_LOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSLEN) 147 148 /* 149 * Stricly for CIPSO level manipulation. 150 * Set the category bit number in a smack label sized buffer. 151 */ 152 static inline void smack_catset_bit(unsigned int cat, char *catsetp) 153 { 154 if (cat == 0 || cat > (SMK_CIPSOLEN * 8)) 155 return; 156 157 catsetp[(cat - 1) / 8] |= 0x80 >> ((cat - 1) % 8); 158 } 159 160 /** 161 * smk_netlabel_audit_set - fill a netlbl_audit struct 162 * @nap: structure to fill 163 */ 164 static void smk_netlabel_audit_set(struct netlbl_audit *nap) 165 { 166 struct smack_known *skp = smk_of_current(); 167 168 nap->loginuid = audit_get_loginuid(current); 169 nap->sessionid = audit_get_sessionid(current); 170 nap->secid = skp->smk_secid; 171 } 172 173 /* 174 * Value for parsing single label host rules 175 * "1.2.3.4 X" 176 */ 177 #define SMK_NETLBLADDRMIN 9 178 179 /** 180 * smk_set_access - add a rule to the rule list or replace an old rule 181 * @srp: the rule to add or replace 182 * @rule_list: the list of rules 183 * @rule_lock: the rule list lock 184 * @global: if non-zero, indicates a global rule 185 * 186 * Looks through the current subject/object/access list for 187 * the subject/object pair and replaces the access that was 188 * there. If the pair isn't found add it with the specified 189 * access. 190 * 191 * Returns 0 if nothing goes wrong or -ENOMEM if it fails 192 * during the allocation of the new pair to add. 193 */ 194 static int smk_set_access(struct smack_parsed_rule *srp, 195 struct list_head *rule_list, 196 struct mutex *rule_lock, int global) 197 { 198 struct smack_rule *sp; 199 struct smack_master_list *smlp; 200 int found = 0; 201 int rc = 0; 202 203 mutex_lock(rule_lock); 204 205 /* 206 * Because the object label is less likely to match 207 * than the subject label check it first 208 */ 209 list_for_each_entry_rcu(sp, rule_list, list) { 210 if (sp->smk_object == srp->smk_object && 211 sp->smk_subject == srp->smk_subject) { 212 found = 1; 213 sp->smk_access |= srp->smk_access1; 214 sp->smk_access &= ~srp->smk_access2; 215 break; 216 } 217 } 218 219 if (found == 0) { 220 sp = kzalloc(sizeof(*sp), GFP_KERNEL); 221 if (sp == NULL) { 222 rc = -ENOMEM; 223 goto out; 224 } 225 226 sp->smk_subject = srp->smk_subject; 227 sp->smk_object = srp->smk_object; 228 sp->smk_access = srp->smk_access1 & ~srp->smk_access2; 229 230 list_add_rcu(&sp->list, rule_list); 231 /* 232 * If this is a global as opposed to self and a new rule 233 * it needs to get added for reporting. 234 */ 235 if (global) { 236 smlp = kzalloc(sizeof(*smlp), GFP_KERNEL); 237 if (smlp != NULL) { 238 smlp->smk_rule = sp; 239 list_add_rcu(&smlp->list, &smack_rule_list); 240 } else 241 rc = -ENOMEM; 242 } 243 } 244 245 out: 246 mutex_unlock(rule_lock); 247 return rc; 248 } 249 250 /** 251 * smk_perm_from_str - parse smack accesses from a text string 252 * @string: a text string that contains a Smack accesses code 253 * 254 * Returns an integer with respective bits set for specified accesses. 255 */ 256 static int smk_perm_from_str(const char *string) 257 { 258 int perm = 0; 259 const char *cp; 260 261 for (cp = string; ; cp++) 262 switch (*cp) { 263 case '-': 264 break; 265 case 'r': 266 case 'R': 267 perm |= MAY_READ; 268 break; 269 case 'w': 270 case 'W': 271 perm |= MAY_WRITE; 272 break; 273 case 'x': 274 case 'X': 275 perm |= MAY_EXEC; 276 break; 277 case 'a': 278 case 'A': 279 perm |= MAY_APPEND; 280 break; 281 case 't': 282 case 'T': 283 perm |= MAY_TRANSMUTE; 284 break; 285 default: 286 return perm; 287 } 288 } 289 290 /** 291 * smk_fill_rule - Fill Smack rule from strings 292 * @subject: subject label string 293 * @object: object label string 294 * @access1: access string 295 * @access2: string with permissions to be removed 296 * @rule: Smack rule 297 * @import: if non-zero, import labels 298 * @len: label length limit 299 * 300 * Returns 0 on success, -1 on failure 301 */ 302 static int smk_fill_rule(const char *subject, const char *object, 303 const char *access1, const char *access2, 304 struct smack_parsed_rule *rule, int import, 305 int len) 306 { 307 const char *cp; 308 struct smack_known *skp; 309 310 if (import) { 311 rule->smk_subject = smk_import_entry(subject, len); 312 if (rule->smk_subject == NULL) 313 return -1; 314 315 rule->smk_object = smk_import(object, len); 316 if (rule->smk_object == NULL) 317 return -1; 318 } else { 319 cp = smk_parse_smack(subject, len); 320 if (cp == NULL) 321 return -1; 322 skp = smk_find_entry(cp); 323 kfree(cp); 324 if (skp == NULL) 325 return -1; 326 rule->smk_subject = skp; 327 328 cp = smk_parse_smack(object, len); 329 if (cp == NULL) 330 return -1; 331 skp = smk_find_entry(cp); 332 kfree(cp); 333 if (skp == NULL) 334 return -1; 335 rule->smk_object = skp->smk_known; 336 } 337 338 rule->smk_access1 = smk_perm_from_str(access1); 339 if (access2) 340 rule->smk_access2 = smk_perm_from_str(access2); 341 else 342 rule->smk_access2 = ~rule->smk_access1; 343 344 return 0; 345 } 346 347 /** 348 * smk_parse_rule - parse Smack rule from load string 349 * @data: string to be parsed whose size is SMK_LOADLEN 350 * @rule: Smack rule 351 * @import: if non-zero, import labels 352 * 353 * Returns 0 on success, -1 on errors. 354 */ 355 static int smk_parse_rule(const char *data, struct smack_parsed_rule *rule, 356 int import) 357 { 358 int rc; 359 360 rc = smk_fill_rule(data, data + SMK_LABELLEN, 361 data + SMK_LABELLEN + SMK_LABELLEN, NULL, rule, 362 import, SMK_LABELLEN); 363 return rc; 364 } 365 366 /** 367 * smk_parse_long_rule - parse Smack rule from rule string 368 * @data: string to be parsed, null terminated 369 * @rule: Will be filled with Smack parsed rule 370 * @import: if non-zero, import labels 371 * @tokens: numer of substrings expected in data 372 * 373 * Returns number of processed bytes on success, -1 on failure. 374 */ 375 static ssize_t smk_parse_long_rule(char *data, struct smack_parsed_rule *rule, 376 int import, int tokens) 377 { 378 ssize_t cnt = 0; 379 char *tok[4]; 380 int i; 381 382 /* 383 * Parsing the rule in-place, filling all white-spaces with '\0' 384 */ 385 for (i = 0; i < tokens; ++i) { 386 while (isspace(data[cnt])) 387 data[cnt++] = '\0'; 388 389 if (data[cnt] == '\0') 390 /* Unexpected end of data */ 391 return -1; 392 393 tok[i] = data + cnt; 394 395 while (data[cnt] && !isspace(data[cnt])) 396 ++cnt; 397 } 398 while (isspace(data[cnt])) 399 data[cnt++] = '\0'; 400 401 while (i < 4) 402 tok[i++] = NULL; 403 404 if (smk_fill_rule(tok[0], tok[1], tok[2], tok[3], rule, import, 0)) 405 return -1; 406 407 return cnt; 408 } 409 410 #define SMK_FIXED24_FMT 0 /* Fixed 24byte label format */ 411 #define SMK_LONG_FMT 1 /* Variable long label format */ 412 #define SMK_CHANGE_FMT 2 /* Rule modification format */ 413 /** 414 * smk_write_rules_list - write() for any /smack rule file 415 * @file: file pointer, not actually used 416 * @buf: where to get the data from 417 * @count: bytes sent 418 * @ppos: where to start - must be 0 419 * @rule_list: the list of rules to write to 420 * @rule_lock: lock for the rule list 421 * @format: /smack/load or /smack/load2 or /smack/change-rule format. 422 * 423 * Get one smack access rule from above. 424 * The format for SMK_LONG_FMT is: 425 * "subject<whitespace>object<whitespace>access[<whitespace>...]" 426 * The format for SMK_FIXED24_FMT is exactly: 427 * "subject object rwxat" 428 * The format for SMK_CHANGE_FMT is: 429 * "subject<whitespace>object<whitespace> 430 * acc_enable<whitespace>acc_disable[<whitespace>...]" 431 */ 432 static ssize_t smk_write_rules_list(struct file *file, const char __user *buf, 433 size_t count, loff_t *ppos, 434 struct list_head *rule_list, 435 struct mutex *rule_lock, int format) 436 { 437 struct smack_parsed_rule rule; 438 char *data; 439 int rc; 440 int trunc = 0; 441 int tokens; 442 ssize_t cnt = 0; 443 444 /* 445 * No partial writes. 446 * Enough data must be present. 447 */ 448 if (*ppos != 0) 449 return -EINVAL; 450 451 if (format == SMK_FIXED24_FMT) { 452 /* 453 * Minor hack for backward compatibility 454 */ 455 if (count != SMK_OLOADLEN && count != SMK_LOADLEN) 456 return -EINVAL; 457 } else { 458 if (count >= PAGE_SIZE) { 459 count = PAGE_SIZE - 1; 460 trunc = 1; 461 } 462 } 463 464 data = kmalloc(count + 1, GFP_KERNEL); 465 if (data == NULL) 466 return -ENOMEM; 467 468 if (copy_from_user(data, buf, count) != 0) { 469 rc = -EFAULT; 470 goto out; 471 } 472 473 /* 474 * In case of parsing only part of user buf, 475 * avoid having partial rule at the data buffer 476 */ 477 if (trunc) { 478 while (count > 0 && (data[count - 1] != '\n')) 479 --count; 480 if (count == 0) { 481 rc = -EINVAL; 482 goto out; 483 } 484 } 485 486 data[count] = '\0'; 487 tokens = (format == SMK_CHANGE_FMT ? 4 : 3); 488 while (cnt < count) { 489 if (format == SMK_FIXED24_FMT) { 490 rc = smk_parse_rule(data, &rule, 1); 491 if (rc != 0) { 492 rc = -EINVAL; 493 goto out; 494 } 495 cnt = count; 496 } else { 497 rc = smk_parse_long_rule(data + cnt, &rule, 1, tokens); 498 if (rc <= 0) { 499 rc = -EINVAL; 500 goto out; 501 } 502 cnt += rc; 503 } 504 505 if (rule_list == NULL) 506 rc = smk_set_access(&rule, &rule.smk_subject->smk_rules, 507 &rule.smk_subject->smk_rules_lock, 1); 508 else 509 rc = smk_set_access(&rule, rule_list, rule_lock, 0); 510 511 if (rc) 512 goto out; 513 } 514 515 rc = cnt; 516 out: 517 kfree(data); 518 return rc; 519 } 520 521 /* 522 * Core logic for smackfs seq list operations. 523 */ 524 525 static void *smk_seq_start(struct seq_file *s, loff_t *pos, 526 struct list_head *head) 527 { 528 struct list_head *list; 529 530 /* 531 * This is 0 the first time through. 532 */ 533 if (s->index == 0) 534 s->private = head; 535 536 if (s->private == NULL) 537 return NULL; 538 539 list = s->private; 540 if (list_empty(list)) 541 return NULL; 542 543 if (s->index == 0) 544 return list->next; 545 return list; 546 } 547 548 static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos, 549 struct list_head *head) 550 { 551 struct list_head *list = v; 552 553 if (list_is_last(list, head)) { 554 s->private = NULL; 555 return NULL; 556 } 557 s->private = list->next; 558 return list->next; 559 } 560 561 static void smk_seq_stop(struct seq_file *s, void *v) 562 { 563 /* No-op */ 564 } 565 566 static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max) 567 { 568 /* 569 * Don't show any rules with label names too long for 570 * interface file (/smack/load or /smack/load2) 571 * because you should expect to be able to write 572 * anything you read back. 573 */ 574 if (strlen(srp->smk_subject->smk_known) >= max || 575 strlen(srp->smk_object) >= max) 576 return; 577 578 if (srp->smk_access == 0) 579 return; 580 581 seq_printf(s, "%s %s", srp->smk_subject->smk_known, srp->smk_object); 582 583 seq_putc(s, ' '); 584 585 if (srp->smk_access & MAY_READ) 586 seq_putc(s, 'r'); 587 if (srp->smk_access & MAY_WRITE) 588 seq_putc(s, 'w'); 589 if (srp->smk_access & MAY_EXEC) 590 seq_putc(s, 'x'); 591 if (srp->smk_access & MAY_APPEND) 592 seq_putc(s, 'a'); 593 if (srp->smk_access & MAY_TRANSMUTE) 594 seq_putc(s, 't'); 595 596 seq_putc(s, '\n'); 597 } 598 599 /* 600 * Seq_file read operations for /smack/load 601 */ 602 603 static void *load2_seq_start(struct seq_file *s, loff_t *pos) 604 { 605 return smk_seq_start(s, pos, &smack_rule_list); 606 } 607 608 static void *load2_seq_next(struct seq_file *s, void *v, loff_t *pos) 609 { 610 return smk_seq_next(s, v, pos, &smack_rule_list); 611 } 612 613 static int load_seq_show(struct seq_file *s, void *v) 614 { 615 struct list_head *list = v; 616 struct smack_master_list *smlp = 617 list_entry(list, struct smack_master_list, list); 618 619 smk_rule_show(s, smlp->smk_rule, SMK_LABELLEN); 620 621 return 0; 622 } 623 624 static const struct seq_operations load_seq_ops = { 625 .start = load2_seq_start, 626 .next = load2_seq_next, 627 .show = load_seq_show, 628 .stop = smk_seq_stop, 629 }; 630 631 /** 632 * smk_open_load - open() for /smack/load 633 * @inode: inode structure representing file 634 * @file: "load" file pointer 635 * 636 * For reading, use load_seq_* seq_file reading operations. 637 */ 638 static int smk_open_load(struct inode *inode, struct file *file) 639 { 640 return seq_open(file, &load_seq_ops); 641 } 642 643 /** 644 * smk_write_load - write() for /smack/load 645 * @file: file pointer, not actually used 646 * @buf: where to get the data from 647 * @count: bytes sent 648 * @ppos: where to start - must be 0 649 * 650 */ 651 static ssize_t smk_write_load(struct file *file, const char __user *buf, 652 size_t count, loff_t *ppos) 653 { 654 /* 655 * Must have privilege. 656 * No partial writes. 657 * Enough data must be present. 658 */ 659 if (!smack_privileged(CAP_MAC_ADMIN)) 660 return -EPERM; 661 662 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL, 663 SMK_FIXED24_FMT); 664 } 665 666 static const struct file_operations smk_load_ops = { 667 .open = smk_open_load, 668 .read = seq_read, 669 .llseek = seq_lseek, 670 .write = smk_write_load, 671 .release = seq_release, 672 }; 673 674 /** 675 * smk_cipso_doi - initialize the CIPSO domain 676 */ 677 static void smk_cipso_doi(void) 678 { 679 int rc; 680 struct cipso_v4_doi *doip; 681 struct netlbl_audit nai; 682 683 smk_netlabel_audit_set(&nai); 684 685 rc = netlbl_cfg_map_del(NULL, PF_INET, NULL, NULL, &nai); 686 if (rc != 0) 687 printk(KERN_WARNING "%s:%d remove rc = %d\n", 688 __func__, __LINE__, rc); 689 690 doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL); 691 if (doip == NULL) 692 panic("smack: Failed to initialize cipso DOI.\n"); 693 doip->map.std = NULL; 694 doip->doi = smk_cipso_doi_value; 695 doip->type = CIPSO_V4_MAP_PASS; 696 doip->tags[0] = CIPSO_V4_TAG_RBITMAP; 697 for (rc = 1; rc < CIPSO_V4_TAG_MAXCNT; rc++) 698 doip->tags[rc] = CIPSO_V4_TAG_INVALID; 699 700 rc = netlbl_cfg_cipsov4_add(doip, &nai); 701 if (rc != 0) { 702 printk(KERN_WARNING "%s:%d cipso add rc = %d\n", 703 __func__, __LINE__, rc); 704 kfree(doip); 705 return; 706 } 707 rc = netlbl_cfg_cipsov4_map_add(doip->doi, NULL, NULL, NULL, &nai); 708 if (rc != 0) { 709 printk(KERN_WARNING "%s:%d map add rc = %d\n", 710 __func__, __LINE__, rc); 711 kfree(doip); 712 return; 713 } 714 } 715 716 /** 717 * smk_unlbl_ambient - initialize the unlabeled domain 718 * @oldambient: previous domain string 719 */ 720 static void smk_unlbl_ambient(char *oldambient) 721 { 722 int rc; 723 struct netlbl_audit nai; 724 725 smk_netlabel_audit_set(&nai); 726 727 if (oldambient != NULL) { 728 rc = netlbl_cfg_map_del(oldambient, PF_INET, NULL, NULL, &nai); 729 if (rc != 0) 730 printk(KERN_WARNING "%s:%d remove rc = %d\n", 731 __func__, __LINE__, rc); 732 } 733 if (smack_net_ambient == NULL) 734 smack_net_ambient = &smack_known_floor; 735 736 rc = netlbl_cfg_unlbl_map_add(smack_net_ambient->smk_known, PF_INET, 737 NULL, NULL, &nai); 738 if (rc != 0) 739 printk(KERN_WARNING "%s:%d add rc = %d\n", 740 __func__, __LINE__, rc); 741 } 742 743 /* 744 * Seq_file read operations for /smack/cipso 745 */ 746 747 static void *cipso_seq_start(struct seq_file *s, loff_t *pos) 748 { 749 return smk_seq_start(s, pos, &smack_known_list); 750 } 751 752 static void *cipso_seq_next(struct seq_file *s, void *v, loff_t *pos) 753 { 754 return smk_seq_next(s, v, pos, &smack_known_list); 755 } 756 757 /* 758 * Print cipso labels in format: 759 * label level[/cat[,cat]] 760 */ 761 static int cipso_seq_show(struct seq_file *s, void *v) 762 { 763 struct list_head *list = v; 764 struct smack_known *skp = 765 list_entry(list, struct smack_known, list); 766 struct netlbl_lsm_secattr_catmap *cmp = skp->smk_netlabel.attr.mls.cat; 767 char sep = '/'; 768 int i; 769 770 /* 771 * Don't show a label that could not have been set using 772 * /smack/cipso. This is in support of the notion that 773 * anything read from /smack/cipso ought to be writeable 774 * to /smack/cipso. 775 * 776 * /smack/cipso2 should be used instead. 777 */ 778 if (strlen(skp->smk_known) >= SMK_LABELLEN) 779 return 0; 780 781 seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl); 782 783 for (i = netlbl_secattr_catmap_walk(cmp, 0); i >= 0; 784 i = netlbl_secattr_catmap_walk(cmp, i + 1)) { 785 seq_printf(s, "%c%d", sep, i); 786 sep = ','; 787 } 788 789 seq_putc(s, '\n'); 790 791 return 0; 792 } 793 794 static const struct seq_operations cipso_seq_ops = { 795 .start = cipso_seq_start, 796 .next = cipso_seq_next, 797 .show = cipso_seq_show, 798 .stop = smk_seq_stop, 799 }; 800 801 /** 802 * smk_open_cipso - open() for /smack/cipso 803 * @inode: inode structure representing file 804 * @file: "cipso" file pointer 805 * 806 * Connect our cipso_seq_* operations with /smack/cipso 807 * file_operations 808 */ 809 static int smk_open_cipso(struct inode *inode, struct file *file) 810 { 811 return seq_open(file, &cipso_seq_ops); 812 } 813 814 /** 815 * smk_set_cipso - do the work for write() for cipso and cipso2 816 * @file: file pointer, not actually used 817 * @buf: where to get the data from 818 * @count: bytes sent 819 * @ppos: where to start 820 * @format: /smack/cipso or /smack/cipso2 821 * 822 * Accepts only one cipso rule per write call. 823 * Returns number of bytes written or error code, as appropriate 824 */ 825 static ssize_t smk_set_cipso(struct file *file, const char __user *buf, 826 size_t count, loff_t *ppos, int format) 827 { 828 struct smack_known *skp; 829 struct netlbl_lsm_secattr ncats; 830 char mapcatset[SMK_CIPSOLEN]; 831 int maplevel; 832 unsigned int cat; 833 int catlen; 834 ssize_t rc = -EINVAL; 835 char *data = NULL; 836 char *rule; 837 int ret; 838 int i; 839 840 /* 841 * Must have privilege. 842 * No partial writes. 843 * Enough data must be present. 844 */ 845 if (!smack_privileged(CAP_MAC_ADMIN)) 846 return -EPERM; 847 if (*ppos != 0) 848 return -EINVAL; 849 if (format == SMK_FIXED24_FMT && 850 (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX)) 851 return -EINVAL; 852 853 data = kzalloc(count + 1, GFP_KERNEL); 854 if (data == NULL) 855 return -ENOMEM; 856 857 if (copy_from_user(data, buf, count) != 0) { 858 rc = -EFAULT; 859 goto unlockedout; 860 } 861 862 data[count] = '\0'; 863 rule = data; 864 /* 865 * Only allow one writer at a time. Writes should be 866 * quite rare and small in any case. 867 */ 868 mutex_lock(&smack_cipso_lock); 869 870 skp = smk_import_entry(rule, 0); 871 if (skp == NULL) 872 goto out; 873 874 if (format == SMK_FIXED24_FMT) 875 rule += SMK_LABELLEN; 876 else 877 rule += strlen(skp->smk_known) + 1; 878 879 ret = sscanf(rule, "%d", &maplevel); 880 if (ret != 1 || maplevel > SMACK_CIPSO_MAXLEVEL) 881 goto out; 882 883 rule += SMK_DIGITLEN; 884 ret = sscanf(rule, "%d", &catlen); 885 if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM) 886 goto out; 887 888 if (format == SMK_FIXED24_FMT && 889 count != (SMK_CIPSOMIN + catlen * SMK_DIGITLEN)) 890 goto out; 891 892 memset(mapcatset, 0, sizeof(mapcatset)); 893 894 for (i = 0; i < catlen; i++) { 895 rule += SMK_DIGITLEN; 896 ret = sscanf(rule, "%u", &cat); 897 if (ret != 1 || cat > SMACK_CIPSO_MAXCATNUM) 898 goto out; 899 900 smack_catset_bit(cat, mapcatset); 901 } 902 903 rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN); 904 if (rc >= 0) { 905 netlbl_secattr_catmap_free(skp->smk_netlabel.attr.mls.cat); 906 skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat; 907 skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl; 908 rc = count; 909 } 910 911 out: 912 mutex_unlock(&smack_cipso_lock); 913 unlockedout: 914 kfree(data); 915 return rc; 916 } 917 918 /** 919 * smk_write_cipso - write() for /smack/cipso 920 * @file: file pointer, not actually used 921 * @buf: where to get the data from 922 * @count: bytes sent 923 * @ppos: where to start 924 * 925 * Accepts only one cipso rule per write call. 926 * Returns number of bytes written or error code, as appropriate 927 */ 928 static ssize_t smk_write_cipso(struct file *file, const char __user *buf, 929 size_t count, loff_t *ppos) 930 { 931 return smk_set_cipso(file, buf, count, ppos, SMK_FIXED24_FMT); 932 } 933 934 static const struct file_operations smk_cipso_ops = { 935 .open = smk_open_cipso, 936 .read = seq_read, 937 .llseek = seq_lseek, 938 .write = smk_write_cipso, 939 .release = seq_release, 940 }; 941 942 /* 943 * Seq_file read operations for /smack/cipso2 944 */ 945 946 /* 947 * Print cipso labels in format: 948 * label level[/cat[,cat]] 949 */ 950 static int cipso2_seq_show(struct seq_file *s, void *v) 951 { 952 struct list_head *list = v; 953 struct smack_known *skp = 954 list_entry(list, struct smack_known, list); 955 struct netlbl_lsm_secattr_catmap *cmp = skp->smk_netlabel.attr.mls.cat; 956 char sep = '/'; 957 int i; 958 959 seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl); 960 961 for (i = netlbl_secattr_catmap_walk(cmp, 0); i >= 0; 962 i = netlbl_secattr_catmap_walk(cmp, i + 1)) { 963 seq_printf(s, "%c%d", sep, i); 964 sep = ','; 965 } 966 967 seq_putc(s, '\n'); 968 969 return 0; 970 } 971 972 static const struct seq_operations cipso2_seq_ops = { 973 .start = cipso_seq_start, 974 .next = cipso_seq_next, 975 .show = cipso2_seq_show, 976 .stop = smk_seq_stop, 977 }; 978 979 /** 980 * smk_open_cipso2 - open() for /smack/cipso2 981 * @inode: inode structure representing file 982 * @file: "cipso2" file pointer 983 * 984 * Connect our cipso_seq_* operations with /smack/cipso2 985 * file_operations 986 */ 987 static int smk_open_cipso2(struct inode *inode, struct file *file) 988 { 989 return seq_open(file, &cipso2_seq_ops); 990 } 991 992 /** 993 * smk_write_cipso2 - write() for /smack/cipso2 994 * @file: file pointer, not actually used 995 * @buf: where to get the data from 996 * @count: bytes sent 997 * @ppos: where to start 998 * 999 * Accepts only one cipso rule per write call. 1000 * Returns number of bytes written or error code, as appropriate 1001 */ 1002 static ssize_t smk_write_cipso2(struct file *file, const char __user *buf, 1003 size_t count, loff_t *ppos) 1004 { 1005 return smk_set_cipso(file, buf, count, ppos, SMK_LONG_FMT); 1006 } 1007 1008 static const struct file_operations smk_cipso2_ops = { 1009 .open = smk_open_cipso2, 1010 .read = seq_read, 1011 .llseek = seq_lseek, 1012 .write = smk_write_cipso2, 1013 .release = seq_release, 1014 }; 1015 1016 /* 1017 * Seq_file read operations for /smack/netlabel 1018 */ 1019 1020 static void *netlbladdr_seq_start(struct seq_file *s, loff_t *pos) 1021 { 1022 return smk_seq_start(s, pos, &smk_netlbladdr_list); 1023 } 1024 1025 static void *netlbladdr_seq_next(struct seq_file *s, void *v, loff_t *pos) 1026 { 1027 return smk_seq_next(s, v, pos, &smk_netlbladdr_list); 1028 } 1029 #define BEBITS (sizeof(__be32) * 8) 1030 1031 /* 1032 * Print host/label pairs 1033 */ 1034 static int netlbladdr_seq_show(struct seq_file *s, void *v) 1035 { 1036 struct list_head *list = v; 1037 struct smk_netlbladdr *skp = 1038 list_entry(list, struct smk_netlbladdr, list); 1039 unsigned char *hp = (char *) &skp->smk_host.sin_addr.s_addr; 1040 int maskn; 1041 u32 temp_mask = be32_to_cpu(skp->smk_mask.s_addr); 1042 1043 for (maskn = 0; temp_mask; temp_mask <<= 1, maskn++); 1044 1045 seq_printf(s, "%u.%u.%u.%u/%d %s\n", 1046 hp[0], hp[1], hp[2], hp[3], maskn, skp->smk_label); 1047 1048 return 0; 1049 } 1050 1051 static const struct seq_operations netlbladdr_seq_ops = { 1052 .start = netlbladdr_seq_start, 1053 .next = netlbladdr_seq_next, 1054 .show = netlbladdr_seq_show, 1055 .stop = smk_seq_stop, 1056 }; 1057 1058 /** 1059 * smk_open_netlbladdr - open() for /smack/netlabel 1060 * @inode: inode structure representing file 1061 * @file: "netlabel" file pointer 1062 * 1063 * Connect our netlbladdr_seq_* operations with /smack/netlabel 1064 * file_operations 1065 */ 1066 static int smk_open_netlbladdr(struct inode *inode, struct file *file) 1067 { 1068 return seq_open(file, &netlbladdr_seq_ops); 1069 } 1070 1071 /** 1072 * smk_netlbladdr_insert 1073 * @new : netlabel to insert 1074 * 1075 * This helper insert netlabel in the smack_netlbladdrs list 1076 * sorted by netmask length (longest to smallest) 1077 * locked by &smk_netlbladdr_lock in smk_write_netlbladdr 1078 * 1079 */ 1080 static void smk_netlbladdr_insert(struct smk_netlbladdr *new) 1081 { 1082 struct smk_netlbladdr *m, *m_next; 1083 1084 if (list_empty(&smk_netlbladdr_list)) { 1085 list_add_rcu(&new->list, &smk_netlbladdr_list); 1086 return; 1087 } 1088 1089 m = list_entry_rcu(smk_netlbladdr_list.next, 1090 struct smk_netlbladdr, list); 1091 1092 /* the comparison '>' is a bit hacky, but works */ 1093 if (new->smk_mask.s_addr > m->smk_mask.s_addr) { 1094 list_add_rcu(&new->list, &smk_netlbladdr_list); 1095 return; 1096 } 1097 1098 list_for_each_entry_rcu(m, &smk_netlbladdr_list, list) { 1099 if (list_is_last(&m->list, &smk_netlbladdr_list)) { 1100 list_add_rcu(&new->list, &m->list); 1101 return; 1102 } 1103 m_next = list_entry_rcu(m->list.next, 1104 struct smk_netlbladdr, list); 1105 if (new->smk_mask.s_addr > m_next->smk_mask.s_addr) { 1106 list_add_rcu(&new->list, &m->list); 1107 return; 1108 } 1109 } 1110 } 1111 1112 1113 /** 1114 * smk_write_netlbladdr - write() for /smack/netlabel 1115 * @file: file pointer, not actually used 1116 * @buf: where to get the data from 1117 * @count: bytes sent 1118 * @ppos: where to start 1119 * 1120 * Accepts only one netlbladdr per write call. 1121 * Returns number of bytes written or error code, as appropriate 1122 */ 1123 static ssize_t smk_write_netlbladdr(struct file *file, const char __user *buf, 1124 size_t count, loff_t *ppos) 1125 { 1126 struct smk_netlbladdr *skp; 1127 struct sockaddr_in newname; 1128 char *smack; 1129 char *sp; 1130 char *data; 1131 char *host = (char *)&newname.sin_addr.s_addr; 1132 int rc; 1133 struct netlbl_audit audit_info; 1134 struct in_addr mask; 1135 unsigned int m; 1136 int found; 1137 u32 mask_bits = (1<<31); 1138 __be32 nsa; 1139 u32 temp_mask; 1140 1141 /* 1142 * Must have privilege. 1143 * No partial writes. 1144 * Enough data must be present. 1145 * "<addr/mask, as a.b.c.d/e><space><label>" 1146 * "<addr, as a.b.c.d><space><label>" 1147 */ 1148 if (!smack_privileged(CAP_MAC_ADMIN)) 1149 return -EPERM; 1150 if (*ppos != 0) 1151 return -EINVAL; 1152 if (count < SMK_NETLBLADDRMIN) 1153 return -EINVAL; 1154 1155 data = kzalloc(count + 1, GFP_KERNEL); 1156 if (data == NULL) 1157 return -ENOMEM; 1158 1159 if (copy_from_user(data, buf, count) != 0) { 1160 rc = -EFAULT; 1161 goto free_data_out; 1162 } 1163 1164 smack = kzalloc(count + 1, GFP_KERNEL); 1165 if (smack == NULL) { 1166 rc = -ENOMEM; 1167 goto free_data_out; 1168 } 1169 1170 data[count] = '\0'; 1171 1172 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%d %s", 1173 &host[0], &host[1], &host[2], &host[3], &m, smack); 1174 if (rc != 6) { 1175 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd %s", 1176 &host[0], &host[1], &host[2], &host[3], smack); 1177 if (rc != 5) { 1178 rc = -EINVAL; 1179 goto free_out; 1180 } 1181 m = BEBITS; 1182 } 1183 if (m > BEBITS) { 1184 rc = -EINVAL; 1185 goto free_out; 1186 } 1187 1188 /* 1189 * If smack begins with '-', it is an option, don't import it 1190 */ 1191 if (smack[0] != '-') { 1192 sp = smk_import(smack, 0); 1193 if (sp == NULL) { 1194 rc = -EINVAL; 1195 goto free_out; 1196 } 1197 } else { 1198 /* check known options */ 1199 if (strcmp(smack, smack_cipso_option) == 0) 1200 sp = (char *)smack_cipso_option; 1201 else { 1202 rc = -EINVAL; 1203 goto free_out; 1204 } 1205 } 1206 1207 for (temp_mask = 0; m > 0; m--) { 1208 temp_mask |= mask_bits; 1209 mask_bits >>= 1; 1210 } 1211 mask.s_addr = cpu_to_be32(temp_mask); 1212 1213 newname.sin_addr.s_addr &= mask.s_addr; 1214 /* 1215 * Only allow one writer at a time. Writes should be 1216 * quite rare and small in any case. 1217 */ 1218 mutex_lock(&smk_netlbladdr_lock); 1219 1220 nsa = newname.sin_addr.s_addr; 1221 /* try to find if the prefix is already in the list */ 1222 found = 0; 1223 list_for_each_entry_rcu(skp, &smk_netlbladdr_list, list) { 1224 if (skp->smk_host.sin_addr.s_addr == nsa && 1225 skp->smk_mask.s_addr == mask.s_addr) { 1226 found = 1; 1227 break; 1228 } 1229 } 1230 smk_netlabel_audit_set(&audit_info); 1231 1232 if (found == 0) { 1233 skp = kzalloc(sizeof(*skp), GFP_KERNEL); 1234 if (skp == NULL) 1235 rc = -ENOMEM; 1236 else { 1237 rc = 0; 1238 skp->smk_host.sin_addr.s_addr = newname.sin_addr.s_addr; 1239 skp->smk_mask.s_addr = mask.s_addr; 1240 skp->smk_label = sp; 1241 smk_netlbladdr_insert(skp); 1242 } 1243 } else { 1244 /* we delete the unlabeled entry, only if the previous label 1245 * wasn't the special CIPSO option */ 1246 if (skp->smk_label != smack_cipso_option) 1247 rc = netlbl_cfg_unlbl_static_del(&init_net, NULL, 1248 &skp->smk_host.sin_addr, &skp->smk_mask, 1249 PF_INET, &audit_info); 1250 else 1251 rc = 0; 1252 skp->smk_label = sp; 1253 } 1254 1255 /* 1256 * Now tell netlabel about the single label nature of 1257 * this host so that incoming packets get labeled. 1258 * but only if we didn't get the special CIPSO option 1259 */ 1260 if (rc == 0 && sp != smack_cipso_option) 1261 rc = netlbl_cfg_unlbl_static_add(&init_net, NULL, 1262 &skp->smk_host.sin_addr, &skp->smk_mask, PF_INET, 1263 smack_to_secid(skp->smk_label), &audit_info); 1264 1265 if (rc == 0) 1266 rc = count; 1267 1268 mutex_unlock(&smk_netlbladdr_lock); 1269 1270 free_out: 1271 kfree(smack); 1272 free_data_out: 1273 kfree(data); 1274 1275 return rc; 1276 } 1277 1278 static const struct file_operations smk_netlbladdr_ops = { 1279 .open = smk_open_netlbladdr, 1280 .read = seq_read, 1281 .llseek = seq_lseek, 1282 .write = smk_write_netlbladdr, 1283 .release = seq_release, 1284 }; 1285 1286 /** 1287 * smk_read_doi - read() for /smack/doi 1288 * @filp: file pointer, not actually used 1289 * @buf: where to put the result 1290 * @count: maximum to send along 1291 * @ppos: where to start 1292 * 1293 * Returns number of bytes read or error code, as appropriate 1294 */ 1295 static ssize_t smk_read_doi(struct file *filp, char __user *buf, 1296 size_t count, loff_t *ppos) 1297 { 1298 char temp[80]; 1299 ssize_t rc; 1300 1301 if (*ppos != 0) 1302 return 0; 1303 1304 sprintf(temp, "%d", smk_cipso_doi_value); 1305 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1306 1307 return rc; 1308 } 1309 1310 /** 1311 * smk_write_doi - write() for /smack/doi 1312 * @file: file pointer, not actually used 1313 * @buf: where to get the data from 1314 * @count: bytes sent 1315 * @ppos: where to start 1316 * 1317 * Returns number of bytes written or error code, as appropriate 1318 */ 1319 static ssize_t smk_write_doi(struct file *file, const char __user *buf, 1320 size_t count, loff_t *ppos) 1321 { 1322 char temp[80]; 1323 int i; 1324 1325 if (!smack_privileged(CAP_MAC_ADMIN)) 1326 return -EPERM; 1327 1328 if (count >= sizeof(temp) || count == 0) 1329 return -EINVAL; 1330 1331 if (copy_from_user(temp, buf, count) != 0) 1332 return -EFAULT; 1333 1334 temp[count] = '\0'; 1335 1336 if (sscanf(temp, "%d", &i) != 1) 1337 return -EINVAL; 1338 1339 smk_cipso_doi_value = i; 1340 1341 smk_cipso_doi(); 1342 1343 return count; 1344 } 1345 1346 static const struct file_operations smk_doi_ops = { 1347 .read = smk_read_doi, 1348 .write = smk_write_doi, 1349 .llseek = default_llseek, 1350 }; 1351 1352 /** 1353 * smk_read_direct - read() for /smack/direct 1354 * @filp: file pointer, not actually used 1355 * @buf: where to put the result 1356 * @count: maximum to send along 1357 * @ppos: where to start 1358 * 1359 * Returns number of bytes read or error code, as appropriate 1360 */ 1361 static ssize_t smk_read_direct(struct file *filp, char __user *buf, 1362 size_t count, loff_t *ppos) 1363 { 1364 char temp[80]; 1365 ssize_t rc; 1366 1367 if (*ppos != 0) 1368 return 0; 1369 1370 sprintf(temp, "%d", smack_cipso_direct); 1371 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1372 1373 return rc; 1374 } 1375 1376 /** 1377 * smk_write_direct - write() for /smack/direct 1378 * @file: file pointer, not actually used 1379 * @buf: where to get the data from 1380 * @count: bytes sent 1381 * @ppos: where to start 1382 * 1383 * Returns number of bytes written or error code, as appropriate 1384 */ 1385 static ssize_t smk_write_direct(struct file *file, const char __user *buf, 1386 size_t count, loff_t *ppos) 1387 { 1388 struct smack_known *skp; 1389 char temp[80]; 1390 int i; 1391 1392 if (!smack_privileged(CAP_MAC_ADMIN)) 1393 return -EPERM; 1394 1395 if (count >= sizeof(temp) || count == 0) 1396 return -EINVAL; 1397 1398 if (copy_from_user(temp, buf, count) != 0) 1399 return -EFAULT; 1400 1401 temp[count] = '\0'; 1402 1403 if (sscanf(temp, "%d", &i) != 1) 1404 return -EINVAL; 1405 1406 /* 1407 * Don't do anything if the value hasn't actually changed. 1408 * If it is changing reset the level on entries that were 1409 * set up to be direct when they were created. 1410 */ 1411 if (smack_cipso_direct != i) { 1412 mutex_lock(&smack_known_lock); 1413 list_for_each_entry_rcu(skp, &smack_known_list, list) 1414 if (skp->smk_netlabel.attr.mls.lvl == 1415 smack_cipso_direct) 1416 skp->smk_netlabel.attr.mls.lvl = i; 1417 smack_cipso_direct = i; 1418 mutex_unlock(&smack_known_lock); 1419 } 1420 1421 return count; 1422 } 1423 1424 static const struct file_operations smk_direct_ops = { 1425 .read = smk_read_direct, 1426 .write = smk_write_direct, 1427 .llseek = default_llseek, 1428 }; 1429 1430 /** 1431 * smk_read_mapped - read() for /smack/mapped 1432 * @filp: file pointer, not actually used 1433 * @buf: where to put the result 1434 * @count: maximum to send along 1435 * @ppos: where to start 1436 * 1437 * Returns number of bytes read or error code, as appropriate 1438 */ 1439 static ssize_t smk_read_mapped(struct file *filp, char __user *buf, 1440 size_t count, loff_t *ppos) 1441 { 1442 char temp[80]; 1443 ssize_t rc; 1444 1445 if (*ppos != 0) 1446 return 0; 1447 1448 sprintf(temp, "%d", smack_cipso_mapped); 1449 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1450 1451 return rc; 1452 } 1453 1454 /** 1455 * smk_write_mapped - write() for /smack/mapped 1456 * @file: file pointer, not actually used 1457 * @buf: where to get the data from 1458 * @count: bytes sent 1459 * @ppos: where to start 1460 * 1461 * Returns number of bytes written or error code, as appropriate 1462 */ 1463 static ssize_t smk_write_mapped(struct file *file, const char __user *buf, 1464 size_t count, loff_t *ppos) 1465 { 1466 struct smack_known *skp; 1467 char temp[80]; 1468 int i; 1469 1470 if (!smack_privileged(CAP_MAC_ADMIN)) 1471 return -EPERM; 1472 1473 if (count >= sizeof(temp) || count == 0) 1474 return -EINVAL; 1475 1476 if (copy_from_user(temp, buf, count) != 0) 1477 return -EFAULT; 1478 1479 temp[count] = '\0'; 1480 1481 if (sscanf(temp, "%d", &i) != 1) 1482 return -EINVAL; 1483 1484 /* 1485 * Don't do anything if the value hasn't actually changed. 1486 * If it is changing reset the level on entries that were 1487 * set up to be mapped when they were created. 1488 */ 1489 if (smack_cipso_mapped != i) { 1490 mutex_lock(&smack_known_lock); 1491 list_for_each_entry_rcu(skp, &smack_known_list, list) 1492 if (skp->smk_netlabel.attr.mls.lvl == 1493 smack_cipso_mapped) 1494 skp->smk_netlabel.attr.mls.lvl = i; 1495 smack_cipso_mapped = i; 1496 mutex_unlock(&smack_known_lock); 1497 } 1498 1499 return count; 1500 } 1501 1502 static const struct file_operations smk_mapped_ops = { 1503 .read = smk_read_mapped, 1504 .write = smk_write_mapped, 1505 .llseek = default_llseek, 1506 }; 1507 1508 /** 1509 * smk_read_ambient - read() for /smack/ambient 1510 * @filp: file pointer, not actually used 1511 * @buf: where to put the result 1512 * @cn: maximum to send along 1513 * @ppos: where to start 1514 * 1515 * Returns number of bytes read or error code, as appropriate 1516 */ 1517 static ssize_t smk_read_ambient(struct file *filp, char __user *buf, 1518 size_t cn, loff_t *ppos) 1519 { 1520 ssize_t rc; 1521 int asize; 1522 1523 if (*ppos != 0) 1524 return 0; 1525 /* 1526 * Being careful to avoid a problem in the case where 1527 * smack_net_ambient gets changed in midstream. 1528 */ 1529 mutex_lock(&smack_ambient_lock); 1530 1531 asize = strlen(smack_net_ambient->smk_known) + 1; 1532 1533 if (cn >= asize) 1534 rc = simple_read_from_buffer(buf, cn, ppos, 1535 smack_net_ambient->smk_known, 1536 asize); 1537 else 1538 rc = -EINVAL; 1539 1540 mutex_unlock(&smack_ambient_lock); 1541 1542 return rc; 1543 } 1544 1545 /** 1546 * smk_write_ambient - write() for /smack/ambient 1547 * @file: file pointer, not actually used 1548 * @buf: where to get the data from 1549 * @count: bytes sent 1550 * @ppos: where to start 1551 * 1552 * Returns number of bytes written or error code, as appropriate 1553 */ 1554 static ssize_t smk_write_ambient(struct file *file, const char __user *buf, 1555 size_t count, loff_t *ppos) 1556 { 1557 struct smack_known *skp; 1558 char *oldambient; 1559 char *data; 1560 int rc = count; 1561 1562 if (!smack_privileged(CAP_MAC_ADMIN)) 1563 return -EPERM; 1564 1565 data = kzalloc(count + 1, GFP_KERNEL); 1566 if (data == NULL) 1567 return -ENOMEM; 1568 1569 if (copy_from_user(data, buf, count) != 0) { 1570 rc = -EFAULT; 1571 goto out; 1572 } 1573 1574 skp = smk_import_entry(data, count); 1575 if (skp == NULL) { 1576 rc = -EINVAL; 1577 goto out; 1578 } 1579 1580 mutex_lock(&smack_ambient_lock); 1581 1582 oldambient = smack_net_ambient->smk_known; 1583 smack_net_ambient = skp; 1584 smk_unlbl_ambient(oldambient); 1585 1586 mutex_unlock(&smack_ambient_lock); 1587 1588 out: 1589 kfree(data); 1590 return rc; 1591 } 1592 1593 static const struct file_operations smk_ambient_ops = { 1594 .read = smk_read_ambient, 1595 .write = smk_write_ambient, 1596 .llseek = default_llseek, 1597 }; 1598 1599 /** 1600 * smk_read_onlycap - read() for /smack/onlycap 1601 * @filp: file pointer, not actually used 1602 * @buf: where to put the result 1603 * @cn: maximum to send along 1604 * @ppos: where to start 1605 * 1606 * Returns number of bytes read or error code, as appropriate 1607 */ 1608 static ssize_t smk_read_onlycap(struct file *filp, char __user *buf, 1609 size_t cn, loff_t *ppos) 1610 { 1611 char *smack = ""; 1612 ssize_t rc = -EINVAL; 1613 int asize; 1614 1615 if (*ppos != 0) 1616 return 0; 1617 1618 if (smack_onlycap != NULL) 1619 smack = smack_onlycap; 1620 1621 asize = strlen(smack) + 1; 1622 1623 if (cn >= asize) 1624 rc = simple_read_from_buffer(buf, cn, ppos, smack, asize); 1625 1626 return rc; 1627 } 1628 1629 /** 1630 * smk_write_onlycap - write() for /smack/onlycap 1631 * @file: file pointer, not actually used 1632 * @buf: where to get the data from 1633 * @count: bytes sent 1634 * @ppos: where to start 1635 * 1636 * Returns number of bytes written or error code, as appropriate 1637 */ 1638 static ssize_t smk_write_onlycap(struct file *file, const char __user *buf, 1639 size_t count, loff_t *ppos) 1640 { 1641 char *data; 1642 struct smack_known *skp = smk_of_task(current->cred->security); 1643 int rc = count; 1644 1645 if (!smack_privileged(CAP_MAC_ADMIN)) 1646 return -EPERM; 1647 1648 /* 1649 * This can be done using smk_access() but is done 1650 * explicitly for clarity. The smk_access() implementation 1651 * would use smk_access(smack_onlycap, MAY_WRITE) 1652 */ 1653 if (smack_onlycap != NULL && smack_onlycap != skp->smk_known) 1654 return -EPERM; 1655 1656 data = kzalloc(count, GFP_KERNEL); 1657 if (data == NULL) 1658 return -ENOMEM; 1659 1660 /* 1661 * Should the null string be passed in unset the onlycap value. 1662 * This seems like something to be careful with as usually 1663 * smk_import only expects to return NULL for errors. It 1664 * is usually the case that a nullstring or "\n" would be 1665 * bad to pass to smk_import but in fact this is useful here. 1666 * 1667 * smk_import will also reject a label beginning with '-', 1668 * so "-usecapabilities" will also work. 1669 */ 1670 if (copy_from_user(data, buf, count) != 0) 1671 rc = -EFAULT; 1672 else 1673 smack_onlycap = smk_import(data, count); 1674 1675 kfree(data); 1676 return rc; 1677 } 1678 1679 static const struct file_operations smk_onlycap_ops = { 1680 .read = smk_read_onlycap, 1681 .write = smk_write_onlycap, 1682 .llseek = default_llseek, 1683 }; 1684 1685 /** 1686 * smk_read_logging - read() for /smack/logging 1687 * @filp: file pointer, not actually used 1688 * @buf: where to put the result 1689 * @cn: maximum to send along 1690 * @ppos: where to start 1691 * 1692 * Returns number of bytes read or error code, as appropriate 1693 */ 1694 static ssize_t smk_read_logging(struct file *filp, char __user *buf, 1695 size_t count, loff_t *ppos) 1696 { 1697 char temp[32]; 1698 ssize_t rc; 1699 1700 if (*ppos != 0) 1701 return 0; 1702 1703 sprintf(temp, "%d\n", log_policy); 1704 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1705 return rc; 1706 } 1707 1708 /** 1709 * smk_write_logging - write() for /smack/logging 1710 * @file: file pointer, not actually used 1711 * @buf: where to get the data from 1712 * @count: bytes sent 1713 * @ppos: where to start 1714 * 1715 * Returns number of bytes written or error code, as appropriate 1716 */ 1717 static ssize_t smk_write_logging(struct file *file, const char __user *buf, 1718 size_t count, loff_t *ppos) 1719 { 1720 char temp[32]; 1721 int i; 1722 1723 if (!smack_privileged(CAP_MAC_ADMIN)) 1724 return -EPERM; 1725 1726 if (count >= sizeof(temp) || count == 0) 1727 return -EINVAL; 1728 1729 if (copy_from_user(temp, buf, count) != 0) 1730 return -EFAULT; 1731 1732 temp[count] = '\0'; 1733 1734 if (sscanf(temp, "%d", &i) != 1) 1735 return -EINVAL; 1736 if (i < 0 || i > 3) 1737 return -EINVAL; 1738 log_policy = i; 1739 return count; 1740 } 1741 1742 1743 1744 static const struct file_operations smk_logging_ops = { 1745 .read = smk_read_logging, 1746 .write = smk_write_logging, 1747 .llseek = default_llseek, 1748 }; 1749 1750 /* 1751 * Seq_file read operations for /smack/load-self 1752 */ 1753 1754 static void *load_self_seq_start(struct seq_file *s, loff_t *pos) 1755 { 1756 struct task_smack *tsp = current_security(); 1757 1758 return smk_seq_start(s, pos, &tsp->smk_rules); 1759 } 1760 1761 static void *load_self_seq_next(struct seq_file *s, void *v, loff_t *pos) 1762 { 1763 struct task_smack *tsp = current_security(); 1764 1765 return smk_seq_next(s, v, pos, &tsp->smk_rules); 1766 } 1767 1768 static int load_self_seq_show(struct seq_file *s, void *v) 1769 { 1770 struct list_head *list = v; 1771 struct smack_rule *srp = 1772 list_entry(list, struct smack_rule, list); 1773 1774 smk_rule_show(s, srp, SMK_LABELLEN); 1775 1776 return 0; 1777 } 1778 1779 static const struct seq_operations load_self_seq_ops = { 1780 .start = load_self_seq_start, 1781 .next = load_self_seq_next, 1782 .show = load_self_seq_show, 1783 .stop = smk_seq_stop, 1784 }; 1785 1786 1787 /** 1788 * smk_open_load_self - open() for /smack/load-self2 1789 * @inode: inode structure representing file 1790 * @file: "load" file pointer 1791 * 1792 * For reading, use load_seq_* seq_file reading operations. 1793 */ 1794 static int smk_open_load_self(struct inode *inode, struct file *file) 1795 { 1796 return seq_open(file, &load_self_seq_ops); 1797 } 1798 1799 /** 1800 * smk_write_load_self - write() for /smack/load-self 1801 * @file: file pointer, not actually used 1802 * @buf: where to get the data from 1803 * @count: bytes sent 1804 * @ppos: where to start - must be 0 1805 * 1806 */ 1807 static ssize_t smk_write_load_self(struct file *file, const char __user *buf, 1808 size_t count, loff_t *ppos) 1809 { 1810 struct task_smack *tsp = current_security(); 1811 1812 return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules, 1813 &tsp->smk_rules_lock, SMK_FIXED24_FMT); 1814 } 1815 1816 static const struct file_operations smk_load_self_ops = { 1817 .open = smk_open_load_self, 1818 .read = seq_read, 1819 .llseek = seq_lseek, 1820 .write = smk_write_load_self, 1821 .release = seq_release, 1822 }; 1823 1824 /** 1825 * smk_user_access - handle access check transaction 1826 * @file: file pointer 1827 * @buf: data from user space 1828 * @count: bytes sent 1829 * @ppos: where to start - must be 0 1830 */ 1831 static ssize_t smk_user_access(struct file *file, const char __user *buf, 1832 size_t count, loff_t *ppos, int format) 1833 { 1834 struct smack_parsed_rule rule; 1835 char *data; 1836 int res; 1837 1838 data = simple_transaction_get(file, buf, count); 1839 if (IS_ERR(data)) 1840 return PTR_ERR(data); 1841 1842 if (format == SMK_FIXED24_FMT) { 1843 if (count < SMK_LOADLEN) 1844 return -EINVAL; 1845 res = smk_parse_rule(data, &rule, 0); 1846 } else { 1847 /* 1848 * simple_transaction_get() returns null-terminated data 1849 */ 1850 res = smk_parse_long_rule(data, &rule, 0, 3); 1851 } 1852 1853 if (res < 0) 1854 return -EINVAL; 1855 1856 res = smk_access(rule.smk_subject, rule.smk_object, 1857 rule.smk_access1, NULL); 1858 data[0] = res == 0 ? '1' : '0'; 1859 data[1] = '\0'; 1860 1861 simple_transaction_set(file, 2); 1862 1863 if (format == SMK_FIXED24_FMT) 1864 return SMK_LOADLEN; 1865 return count; 1866 } 1867 1868 /** 1869 * smk_write_access - handle access check transaction 1870 * @file: file pointer 1871 * @buf: data from user space 1872 * @count: bytes sent 1873 * @ppos: where to start - must be 0 1874 */ 1875 static ssize_t smk_write_access(struct file *file, const char __user *buf, 1876 size_t count, loff_t *ppos) 1877 { 1878 return smk_user_access(file, buf, count, ppos, SMK_FIXED24_FMT); 1879 } 1880 1881 static const struct file_operations smk_access_ops = { 1882 .write = smk_write_access, 1883 .read = simple_transaction_read, 1884 .release = simple_transaction_release, 1885 .llseek = generic_file_llseek, 1886 }; 1887 1888 1889 /* 1890 * Seq_file read operations for /smack/load2 1891 */ 1892 1893 static int load2_seq_show(struct seq_file *s, void *v) 1894 { 1895 struct list_head *list = v; 1896 struct smack_master_list *smlp = 1897 list_entry(list, struct smack_master_list, list); 1898 1899 smk_rule_show(s, smlp->smk_rule, SMK_LONGLABEL); 1900 1901 return 0; 1902 } 1903 1904 static const struct seq_operations load2_seq_ops = { 1905 .start = load2_seq_start, 1906 .next = load2_seq_next, 1907 .show = load2_seq_show, 1908 .stop = smk_seq_stop, 1909 }; 1910 1911 /** 1912 * smk_open_load2 - open() for /smack/load2 1913 * @inode: inode structure representing file 1914 * @file: "load2" file pointer 1915 * 1916 * For reading, use load2_seq_* seq_file reading operations. 1917 */ 1918 static int smk_open_load2(struct inode *inode, struct file *file) 1919 { 1920 return seq_open(file, &load2_seq_ops); 1921 } 1922 1923 /** 1924 * smk_write_load2 - write() for /smack/load2 1925 * @file: file pointer, not actually used 1926 * @buf: where to get the data from 1927 * @count: bytes sent 1928 * @ppos: where to start - must be 0 1929 * 1930 */ 1931 static ssize_t smk_write_load2(struct file *file, const char __user *buf, 1932 size_t count, loff_t *ppos) 1933 { 1934 /* 1935 * Must have privilege. 1936 */ 1937 if (!smack_privileged(CAP_MAC_ADMIN)) 1938 return -EPERM; 1939 1940 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL, 1941 SMK_LONG_FMT); 1942 } 1943 1944 static const struct file_operations smk_load2_ops = { 1945 .open = smk_open_load2, 1946 .read = seq_read, 1947 .llseek = seq_lseek, 1948 .write = smk_write_load2, 1949 .release = seq_release, 1950 }; 1951 1952 /* 1953 * Seq_file read operations for /smack/load-self2 1954 */ 1955 1956 static void *load_self2_seq_start(struct seq_file *s, loff_t *pos) 1957 { 1958 struct task_smack *tsp = current_security(); 1959 1960 return smk_seq_start(s, pos, &tsp->smk_rules); 1961 } 1962 1963 static void *load_self2_seq_next(struct seq_file *s, void *v, loff_t *pos) 1964 { 1965 struct task_smack *tsp = current_security(); 1966 1967 return smk_seq_next(s, v, pos, &tsp->smk_rules); 1968 } 1969 1970 static int load_self2_seq_show(struct seq_file *s, void *v) 1971 { 1972 struct list_head *list = v; 1973 struct smack_rule *srp = 1974 list_entry(list, struct smack_rule, list); 1975 1976 smk_rule_show(s, srp, SMK_LONGLABEL); 1977 1978 return 0; 1979 } 1980 1981 static const struct seq_operations load_self2_seq_ops = { 1982 .start = load_self2_seq_start, 1983 .next = load_self2_seq_next, 1984 .show = load_self2_seq_show, 1985 .stop = smk_seq_stop, 1986 }; 1987 1988 /** 1989 * smk_open_load_self2 - open() for /smack/load-self2 1990 * @inode: inode structure representing file 1991 * @file: "load" file pointer 1992 * 1993 * For reading, use load_seq_* seq_file reading operations. 1994 */ 1995 static int smk_open_load_self2(struct inode *inode, struct file *file) 1996 { 1997 return seq_open(file, &load_self2_seq_ops); 1998 } 1999 2000 /** 2001 * smk_write_load_self2 - write() for /smack/load-self2 2002 * @file: file pointer, not actually used 2003 * @buf: where to get the data from 2004 * @count: bytes sent 2005 * @ppos: where to start - must be 0 2006 * 2007 */ 2008 static ssize_t smk_write_load_self2(struct file *file, const char __user *buf, 2009 size_t count, loff_t *ppos) 2010 { 2011 struct task_smack *tsp = current_security(); 2012 2013 return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules, 2014 &tsp->smk_rules_lock, SMK_LONG_FMT); 2015 } 2016 2017 static const struct file_operations smk_load_self2_ops = { 2018 .open = smk_open_load_self2, 2019 .read = seq_read, 2020 .llseek = seq_lseek, 2021 .write = smk_write_load_self2, 2022 .release = seq_release, 2023 }; 2024 2025 /** 2026 * smk_write_access2 - handle access check transaction 2027 * @file: file pointer 2028 * @buf: data from user space 2029 * @count: bytes sent 2030 * @ppos: where to start - must be 0 2031 */ 2032 static ssize_t smk_write_access2(struct file *file, const char __user *buf, 2033 size_t count, loff_t *ppos) 2034 { 2035 return smk_user_access(file, buf, count, ppos, SMK_LONG_FMT); 2036 } 2037 2038 static const struct file_operations smk_access2_ops = { 2039 .write = smk_write_access2, 2040 .read = simple_transaction_read, 2041 .release = simple_transaction_release, 2042 .llseek = generic_file_llseek, 2043 }; 2044 2045 /** 2046 * smk_write_revoke_subj - write() for /smack/revoke-subject 2047 * @file: file pointer 2048 * @buf: data from user space 2049 * @count: bytes sent 2050 * @ppos: where to start - must be 0 2051 */ 2052 static ssize_t smk_write_revoke_subj(struct file *file, const char __user *buf, 2053 size_t count, loff_t *ppos) 2054 { 2055 char *data = NULL; 2056 const char *cp = NULL; 2057 struct smack_known *skp; 2058 struct smack_rule *sp; 2059 struct list_head *rule_list; 2060 struct mutex *rule_lock; 2061 int rc = count; 2062 2063 if (*ppos != 0) 2064 return -EINVAL; 2065 2066 if (!smack_privileged(CAP_MAC_ADMIN)) 2067 return -EPERM; 2068 2069 if (count == 0 || count > SMK_LONGLABEL) 2070 return -EINVAL; 2071 2072 data = kzalloc(count, GFP_KERNEL); 2073 if (data == NULL) 2074 return -ENOMEM; 2075 2076 if (copy_from_user(data, buf, count) != 0) { 2077 rc = -EFAULT; 2078 goto free_out; 2079 } 2080 2081 cp = smk_parse_smack(data, count); 2082 if (cp == NULL) { 2083 rc = -EINVAL; 2084 goto free_out; 2085 } 2086 2087 skp = smk_find_entry(cp); 2088 if (skp == NULL) 2089 goto free_out; 2090 2091 rule_list = &skp->smk_rules; 2092 rule_lock = &skp->smk_rules_lock; 2093 2094 mutex_lock(rule_lock); 2095 2096 list_for_each_entry_rcu(sp, rule_list, list) 2097 sp->smk_access = 0; 2098 2099 mutex_unlock(rule_lock); 2100 2101 free_out: 2102 kfree(data); 2103 kfree(cp); 2104 return rc; 2105 } 2106 2107 static const struct file_operations smk_revoke_subj_ops = { 2108 .write = smk_write_revoke_subj, 2109 .read = simple_transaction_read, 2110 .release = simple_transaction_release, 2111 .llseek = generic_file_llseek, 2112 }; 2113 2114 static struct kset *smackfs_kset; 2115 /** 2116 * smk_init_sysfs - initialize /sys/fs/smackfs 2117 * 2118 */ 2119 static int smk_init_sysfs(void) 2120 { 2121 smackfs_kset = kset_create_and_add("smackfs", NULL, fs_kobj); 2122 if (!smackfs_kset) 2123 return -ENOMEM; 2124 return 0; 2125 } 2126 2127 /** 2128 * smk_write_change_rule - write() for /smack/change-rule 2129 * @file: file pointer 2130 * @buf: data from user space 2131 * @count: bytes sent 2132 * @ppos: where to start - must be 0 2133 */ 2134 static ssize_t smk_write_change_rule(struct file *file, const char __user *buf, 2135 size_t count, loff_t *ppos) 2136 { 2137 /* 2138 * Must have privilege. 2139 */ 2140 if (!capable(CAP_MAC_ADMIN)) 2141 return -EPERM; 2142 2143 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL, 2144 SMK_CHANGE_FMT); 2145 } 2146 2147 static const struct file_operations smk_change_rule_ops = { 2148 .write = smk_write_change_rule, 2149 .read = simple_transaction_read, 2150 .release = simple_transaction_release, 2151 .llseek = generic_file_llseek, 2152 }; 2153 2154 /** 2155 * smk_fill_super - fill the /smackfs superblock 2156 * @sb: the empty superblock 2157 * @data: unused 2158 * @silent: unused 2159 * 2160 * Fill in the well known entries for /smack 2161 * 2162 * Returns 0 on success, an error code on failure 2163 */ 2164 static int smk_fill_super(struct super_block *sb, void *data, int silent) 2165 { 2166 int rc; 2167 struct inode *root_inode; 2168 2169 static struct tree_descr smack_files[] = { 2170 [SMK_LOAD] = { 2171 "load", &smk_load_ops, S_IRUGO|S_IWUSR}, 2172 [SMK_CIPSO] = { 2173 "cipso", &smk_cipso_ops, S_IRUGO|S_IWUSR}, 2174 [SMK_DOI] = { 2175 "doi", &smk_doi_ops, S_IRUGO|S_IWUSR}, 2176 [SMK_DIRECT] = { 2177 "direct", &smk_direct_ops, S_IRUGO|S_IWUSR}, 2178 [SMK_AMBIENT] = { 2179 "ambient", &smk_ambient_ops, S_IRUGO|S_IWUSR}, 2180 [SMK_NETLBLADDR] = { 2181 "netlabel", &smk_netlbladdr_ops, S_IRUGO|S_IWUSR}, 2182 [SMK_ONLYCAP] = { 2183 "onlycap", &smk_onlycap_ops, S_IRUGO|S_IWUSR}, 2184 [SMK_LOGGING] = { 2185 "logging", &smk_logging_ops, S_IRUGO|S_IWUSR}, 2186 [SMK_LOAD_SELF] = { 2187 "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO}, 2188 [SMK_ACCESSES] = { 2189 "access", &smk_access_ops, S_IRUGO|S_IWUGO}, 2190 [SMK_MAPPED] = { 2191 "mapped", &smk_mapped_ops, S_IRUGO|S_IWUSR}, 2192 [SMK_LOAD2] = { 2193 "load2", &smk_load2_ops, S_IRUGO|S_IWUSR}, 2194 [SMK_LOAD_SELF2] = { 2195 "load-self2", &smk_load_self2_ops, S_IRUGO|S_IWUGO}, 2196 [SMK_ACCESS2] = { 2197 "access2", &smk_access2_ops, S_IRUGO|S_IWUGO}, 2198 [SMK_CIPSO2] = { 2199 "cipso2", &smk_cipso2_ops, S_IRUGO|S_IWUSR}, 2200 [SMK_REVOKE_SUBJ] = { 2201 "revoke-subject", &smk_revoke_subj_ops, 2202 S_IRUGO|S_IWUSR}, 2203 [SMK_CHANGE_RULE] = { 2204 "change-rule", &smk_change_rule_ops, S_IRUGO|S_IWUSR}, 2205 /* last one */ 2206 {""} 2207 }; 2208 2209 rc = simple_fill_super(sb, SMACK_MAGIC, smack_files); 2210 if (rc != 0) { 2211 printk(KERN_ERR "%s failed %d while creating inodes\n", 2212 __func__, rc); 2213 return rc; 2214 } 2215 2216 root_inode = sb->s_root->d_inode; 2217 2218 return 0; 2219 } 2220 2221 /** 2222 * smk_mount - get the smackfs superblock 2223 * @fs_type: passed along without comment 2224 * @flags: passed along without comment 2225 * @dev_name: passed along without comment 2226 * @data: passed along without comment 2227 * 2228 * Just passes everything along. 2229 * 2230 * Returns what the lower level code does. 2231 */ 2232 static struct dentry *smk_mount(struct file_system_type *fs_type, 2233 int flags, const char *dev_name, void *data) 2234 { 2235 return mount_single(fs_type, flags, data, smk_fill_super); 2236 } 2237 2238 static struct file_system_type smk_fs_type = { 2239 .name = "smackfs", 2240 .mount = smk_mount, 2241 .kill_sb = kill_litter_super, 2242 }; 2243 2244 static struct vfsmount *smackfs_mount; 2245 2246 static int __init smk_preset_netlabel(struct smack_known *skp) 2247 { 2248 skp->smk_netlabel.domain = skp->smk_known; 2249 skp->smk_netlabel.flags = 2250 NETLBL_SECATTR_DOMAIN | NETLBL_SECATTR_MLS_LVL; 2251 return smk_netlbl_mls(smack_cipso_direct, skp->smk_known, 2252 &skp->smk_netlabel, strlen(skp->smk_known)); 2253 } 2254 2255 /** 2256 * init_smk_fs - get the smackfs superblock 2257 * 2258 * register the smackfs 2259 * 2260 * Do not register smackfs if Smack wasn't enabled 2261 * on boot. We can not put this method normally under the 2262 * smack_init() code path since the security subsystem get 2263 * initialized before the vfs caches. 2264 * 2265 * Returns true if we were not chosen on boot or if 2266 * we were chosen and filesystem registration succeeded. 2267 */ 2268 static int __init init_smk_fs(void) 2269 { 2270 int err; 2271 int rc; 2272 2273 if (!security_module_enable(&smack_ops)) 2274 return 0; 2275 2276 err = smk_init_sysfs(); 2277 if (err) 2278 printk(KERN_ERR "smackfs: sysfs mountpoint problem.\n"); 2279 2280 err = register_filesystem(&smk_fs_type); 2281 if (!err) { 2282 smackfs_mount = kern_mount(&smk_fs_type); 2283 if (IS_ERR(smackfs_mount)) { 2284 printk(KERN_ERR "smackfs: could not mount!\n"); 2285 err = PTR_ERR(smackfs_mount); 2286 smackfs_mount = NULL; 2287 } 2288 } 2289 2290 smk_cipso_doi(); 2291 smk_unlbl_ambient(NULL); 2292 2293 rc = smk_preset_netlabel(&smack_known_floor); 2294 if (err == 0 && rc < 0) 2295 err = rc; 2296 rc = smk_preset_netlabel(&smack_known_hat); 2297 if (err == 0 && rc < 0) 2298 err = rc; 2299 rc = smk_preset_netlabel(&smack_known_huh); 2300 if (err == 0 && rc < 0) 2301 err = rc; 2302 rc = smk_preset_netlabel(&smack_known_invalid); 2303 if (err == 0 && rc < 0) 2304 err = rc; 2305 rc = smk_preset_netlabel(&smack_known_star); 2306 if (err == 0 && rc < 0) 2307 err = rc; 2308 rc = smk_preset_netlabel(&smack_known_web); 2309 if (err == 0 && rc < 0) 2310 err = rc; 2311 2312 return err; 2313 } 2314 2315 __initcall(init_smk_fs); 2316