1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com> 4 * 5 * Authors: 6 * Casey Schaufler <casey@schaufler-ca.com> 7 * Ahmed S. Darwish <darwish.07@gmail.com> 8 * 9 * Special thanks to the authors of selinuxfs. 10 * 11 * Karl MacMillan <kmacmillan@tresys.com> 12 * James Morris <jmorris@redhat.com> 13 */ 14 15 #include <linux/kernel.h> 16 #include <linux/vmalloc.h> 17 #include <linux/security.h> 18 #include <linux/mutex.h> 19 #include <linux/slab.h> 20 #include <net/net_namespace.h> 21 #include <net/cipso_ipv4.h> 22 #include <linux/seq_file.h> 23 #include <linux/ctype.h> 24 #include <linux/audit.h> 25 #include <linux/magic.h> 26 #include "smack.h" 27 28 #define BEBITS (sizeof(__be32) * 8) 29 /* 30 * smackfs pseudo filesystem. 31 */ 32 33 enum smk_inos { 34 SMK_ROOT_INO = 2, 35 SMK_LOAD = 3, /* load policy */ 36 SMK_CIPSO = 4, /* load label -> CIPSO mapping */ 37 SMK_DOI = 5, /* CIPSO DOI */ 38 SMK_DIRECT = 6, /* CIPSO level indicating direct label */ 39 SMK_AMBIENT = 7, /* internet ambient label */ 40 SMK_NET4ADDR = 8, /* single label hosts */ 41 SMK_ONLYCAP = 9, /* the only "capable" label */ 42 SMK_LOGGING = 10, /* logging */ 43 SMK_LOAD_SELF = 11, /* task specific rules */ 44 SMK_ACCESSES = 12, /* access policy */ 45 SMK_MAPPED = 13, /* CIPSO level indicating mapped label */ 46 SMK_LOAD2 = 14, /* load policy with long labels */ 47 SMK_LOAD_SELF2 = 15, /* load task specific rules with long labels */ 48 SMK_ACCESS2 = 16, /* make an access check with long labels */ 49 SMK_CIPSO2 = 17, /* load long label -> CIPSO mapping */ 50 SMK_REVOKE_SUBJ = 18, /* set rules with subject label to '-' */ 51 SMK_CHANGE_RULE = 19, /* change or add rules (long labels) */ 52 SMK_SYSLOG = 20, /* change syslog label) */ 53 SMK_PTRACE = 21, /* set ptrace rule */ 54 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 55 SMK_UNCONFINED = 22, /* define an unconfined label */ 56 #endif 57 #if IS_ENABLED(CONFIG_IPV6) 58 SMK_NET6ADDR = 23, /* single label IPv6 hosts */ 59 #endif /* CONFIG_IPV6 */ 60 SMK_RELABEL_SELF = 24, /* relabel possible without CAP_MAC_ADMIN */ 61 }; 62 63 /* 64 * List locks 65 */ 66 static DEFINE_MUTEX(smack_cipso_lock); 67 static DEFINE_MUTEX(smack_ambient_lock); 68 static DEFINE_MUTEX(smk_net4addr_lock); 69 #if IS_ENABLED(CONFIG_IPV6) 70 static DEFINE_MUTEX(smk_net6addr_lock); 71 #endif /* CONFIG_IPV6 */ 72 73 /* 74 * This is the "ambient" label for network traffic. 75 * If it isn't somehow marked, use this. 76 * It can be reset via smackfs/ambient 77 */ 78 struct smack_known *smack_net_ambient; 79 80 /* 81 * This is the level in a CIPSO header that indicates a 82 * smack label is contained directly in the category set. 83 * It can be reset via smackfs/direct 84 */ 85 int smack_cipso_direct = SMACK_CIPSO_DIRECT_DEFAULT; 86 87 /* 88 * This is the level in a CIPSO header that indicates a 89 * secid is contained directly in the category set. 90 * It can be reset via smackfs/mapped 91 */ 92 int smack_cipso_mapped = SMACK_CIPSO_MAPPED_DEFAULT; 93 94 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 95 /* 96 * Allow one label to be unconfined. This is for 97 * debugging and application bring-up purposes only. 98 * It is bad and wrong, but everyone seems to expect 99 * to have it. 100 */ 101 struct smack_known *smack_unconfined; 102 #endif 103 104 /* 105 * If this value is set restrict syslog use to the label specified. 106 * It can be reset via smackfs/syslog 107 */ 108 struct smack_known *smack_syslog_label; 109 110 /* 111 * Ptrace current rule 112 * SMACK_PTRACE_DEFAULT regular smack ptrace rules (/proc based) 113 * SMACK_PTRACE_EXACT labels must match, but can be overriden with 114 * CAP_SYS_PTRACE 115 * SMACK_PTRACE_DRACONIAN lables must match, CAP_SYS_PTRACE has no effect 116 */ 117 int smack_ptrace_rule = SMACK_PTRACE_DEFAULT; 118 119 /* 120 * Certain IP addresses may be designated as single label hosts. 121 * Packets are sent there unlabeled, but only from tasks that 122 * can write to the specified label. 123 */ 124 125 LIST_HEAD(smk_net4addr_list); 126 #if IS_ENABLED(CONFIG_IPV6) 127 LIST_HEAD(smk_net6addr_list); 128 #endif /* CONFIG_IPV6 */ 129 130 /* 131 * Rule lists are maintained for each label. 132 */ 133 struct smack_parsed_rule { 134 struct smack_known *smk_subject; 135 struct smack_known *smk_object; 136 int smk_access1; 137 int smk_access2; 138 }; 139 140 static int smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT; 141 142 /* 143 * Values for parsing cipso rules 144 * SMK_DIGITLEN: Length of a digit field in a rule. 145 * SMK_CIPSOMIN: Minimum possible cipso rule length. 146 * SMK_CIPSOMAX: Maximum possible cipso rule length. 147 */ 148 #define SMK_DIGITLEN 4 149 #define SMK_CIPSOMIN (SMK_LABELLEN + 2 * SMK_DIGITLEN) 150 #define SMK_CIPSOMAX (SMK_CIPSOMIN + SMACK_CIPSO_MAXCATNUM * SMK_DIGITLEN) 151 152 /* 153 * Values for parsing MAC rules 154 * SMK_ACCESS: Maximum possible combination of access permissions 155 * SMK_ACCESSLEN: Maximum length for a rule access field 156 * SMK_LOADLEN: Smack rule length 157 */ 158 #define SMK_OACCESS "rwxa" 159 #define SMK_ACCESS "rwxatl" 160 #define SMK_OACCESSLEN (sizeof(SMK_OACCESS) - 1) 161 #define SMK_ACCESSLEN (sizeof(SMK_ACCESS) - 1) 162 #define SMK_OLOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_OACCESSLEN) 163 #define SMK_LOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSLEN) 164 165 /* 166 * Stricly for CIPSO level manipulation. 167 * Set the category bit number in a smack label sized buffer. 168 */ 169 static inline void smack_catset_bit(unsigned int cat, char *catsetp) 170 { 171 if (cat == 0 || cat > (SMK_CIPSOLEN * 8)) 172 return; 173 174 catsetp[(cat - 1) / 8] |= 0x80 >> ((cat - 1) % 8); 175 } 176 177 /** 178 * smk_netlabel_audit_set - fill a netlbl_audit struct 179 * @nap: structure to fill 180 */ 181 static void smk_netlabel_audit_set(struct netlbl_audit *nap) 182 { 183 struct smack_known *skp = smk_of_current(); 184 185 nap->loginuid = audit_get_loginuid(current); 186 nap->sessionid = audit_get_sessionid(current); 187 nap->secid = skp->smk_secid; 188 } 189 190 /* 191 * Value for parsing single label host rules 192 * "1.2.3.4 X" 193 */ 194 #define SMK_NETLBLADDRMIN 9 195 196 /** 197 * smk_set_access - add a rule to the rule list or replace an old rule 198 * @srp: the rule to add or replace 199 * @rule_list: the list of rules 200 * @rule_lock: the rule list lock 201 * 202 * Looks through the current subject/object/access list for 203 * the subject/object pair and replaces the access that was 204 * there. If the pair isn't found add it with the specified 205 * access. 206 * 207 * Returns 0 if nothing goes wrong or -ENOMEM if it fails 208 * during the allocation of the new pair to add. 209 */ 210 static int smk_set_access(struct smack_parsed_rule *srp, 211 struct list_head *rule_list, 212 struct mutex *rule_lock) 213 { 214 struct smack_rule *sp; 215 int found = 0; 216 int rc = 0; 217 218 mutex_lock(rule_lock); 219 220 /* 221 * Because the object label is less likely to match 222 * than the subject label check it first 223 */ 224 list_for_each_entry_rcu(sp, rule_list, list) { 225 if (sp->smk_object == srp->smk_object && 226 sp->smk_subject == srp->smk_subject) { 227 found = 1; 228 sp->smk_access |= srp->smk_access1; 229 sp->smk_access &= ~srp->smk_access2; 230 break; 231 } 232 } 233 234 if (found == 0) { 235 sp = kmem_cache_zalloc(smack_rule_cache, GFP_KERNEL); 236 if (sp == NULL) { 237 rc = -ENOMEM; 238 goto out; 239 } 240 241 sp->smk_subject = srp->smk_subject; 242 sp->smk_object = srp->smk_object; 243 sp->smk_access = srp->smk_access1 & ~srp->smk_access2; 244 245 list_add_rcu(&sp->list, rule_list); 246 } 247 248 out: 249 mutex_unlock(rule_lock); 250 return rc; 251 } 252 253 /** 254 * smk_perm_from_str - parse smack accesses from a text string 255 * @string: a text string that contains a Smack accesses code 256 * 257 * Returns an integer with respective bits set for specified accesses. 258 */ 259 static int smk_perm_from_str(const char *string) 260 { 261 int perm = 0; 262 const char *cp; 263 264 for (cp = string; ; cp++) 265 switch (*cp) { 266 case '-': 267 break; 268 case 'r': 269 case 'R': 270 perm |= MAY_READ; 271 break; 272 case 'w': 273 case 'W': 274 perm |= MAY_WRITE; 275 break; 276 case 'x': 277 case 'X': 278 perm |= MAY_EXEC; 279 break; 280 case 'a': 281 case 'A': 282 perm |= MAY_APPEND; 283 break; 284 case 't': 285 case 'T': 286 perm |= MAY_TRANSMUTE; 287 break; 288 case 'l': 289 case 'L': 290 perm |= MAY_LOCK; 291 break; 292 case 'b': 293 case 'B': 294 perm |= MAY_BRINGUP; 295 break; 296 default: 297 return perm; 298 } 299 } 300 301 /** 302 * smk_fill_rule - Fill Smack rule from strings 303 * @subject: subject label string 304 * @object: object label string 305 * @access1: access string 306 * @access2: string with permissions to be removed 307 * @rule: Smack rule 308 * @import: if non-zero, import labels 309 * @len: label length limit 310 * 311 * Returns 0 on success, appropriate error code on failure. 312 */ 313 static int smk_fill_rule(const char *subject, const char *object, 314 const char *access1, const char *access2, 315 struct smack_parsed_rule *rule, int import, 316 int len) 317 { 318 const char *cp; 319 struct smack_known *skp; 320 321 if (import) { 322 rule->smk_subject = smk_import_entry(subject, len); 323 if (IS_ERR(rule->smk_subject)) 324 return PTR_ERR(rule->smk_subject); 325 326 rule->smk_object = smk_import_entry(object, len); 327 if (IS_ERR(rule->smk_object)) 328 return PTR_ERR(rule->smk_object); 329 } else { 330 cp = smk_parse_smack(subject, len); 331 if (IS_ERR(cp)) 332 return PTR_ERR(cp); 333 skp = smk_find_entry(cp); 334 kfree(cp); 335 if (skp == NULL) 336 return -ENOENT; 337 rule->smk_subject = skp; 338 339 cp = smk_parse_smack(object, len); 340 if (IS_ERR(cp)) 341 return PTR_ERR(cp); 342 skp = smk_find_entry(cp); 343 kfree(cp); 344 if (skp == NULL) 345 return -ENOENT; 346 rule->smk_object = skp; 347 } 348 349 rule->smk_access1 = smk_perm_from_str(access1); 350 if (access2) 351 rule->smk_access2 = smk_perm_from_str(access2); 352 else 353 rule->smk_access2 = ~rule->smk_access1; 354 355 return 0; 356 } 357 358 /** 359 * smk_parse_rule - parse Smack rule from load string 360 * @data: string to be parsed whose size is SMK_LOADLEN 361 * @rule: Smack rule 362 * @import: if non-zero, import labels 363 * 364 * Returns 0 on success, -1 on errors. 365 */ 366 static int smk_parse_rule(const char *data, struct smack_parsed_rule *rule, 367 int import) 368 { 369 int rc; 370 371 rc = smk_fill_rule(data, data + SMK_LABELLEN, 372 data + SMK_LABELLEN + SMK_LABELLEN, NULL, rule, 373 import, SMK_LABELLEN); 374 return rc; 375 } 376 377 /** 378 * smk_parse_long_rule - parse Smack rule from rule string 379 * @data: string to be parsed, null terminated 380 * @rule: Will be filled with Smack parsed rule 381 * @import: if non-zero, import labels 382 * @tokens: numer of substrings expected in data 383 * 384 * Returns number of processed bytes on success, -ERRNO on failure. 385 */ 386 static ssize_t smk_parse_long_rule(char *data, struct smack_parsed_rule *rule, 387 int import, int tokens) 388 { 389 ssize_t cnt = 0; 390 char *tok[4]; 391 int rc; 392 int i; 393 394 /* 395 * Parsing the rule in-place, filling all white-spaces with '\0' 396 */ 397 for (i = 0; i < tokens; ++i) { 398 while (isspace(data[cnt])) 399 data[cnt++] = '\0'; 400 401 if (data[cnt] == '\0') 402 /* Unexpected end of data */ 403 return -EINVAL; 404 405 tok[i] = data + cnt; 406 407 while (data[cnt] && !isspace(data[cnt])) 408 ++cnt; 409 } 410 while (isspace(data[cnt])) 411 data[cnt++] = '\0'; 412 413 while (i < 4) 414 tok[i++] = NULL; 415 416 rc = smk_fill_rule(tok[0], tok[1], tok[2], tok[3], rule, import, 0); 417 return rc == 0 ? cnt : rc; 418 } 419 420 #define SMK_FIXED24_FMT 0 /* Fixed 24byte label format */ 421 #define SMK_LONG_FMT 1 /* Variable long label format */ 422 #define SMK_CHANGE_FMT 2 /* Rule modification format */ 423 /** 424 * smk_write_rules_list - write() for any /smack rule file 425 * @file: file pointer, not actually used 426 * @buf: where to get the data from 427 * @count: bytes sent 428 * @ppos: where to start - must be 0 429 * @rule_list: the list of rules to write to 430 * @rule_lock: lock for the rule list 431 * @format: /smack/load or /smack/load2 or /smack/change-rule format. 432 * 433 * Get one smack access rule from above. 434 * The format for SMK_LONG_FMT is: 435 * "subject<whitespace>object<whitespace>access[<whitespace>...]" 436 * The format for SMK_FIXED24_FMT is exactly: 437 * "subject object rwxat" 438 * The format for SMK_CHANGE_FMT is: 439 * "subject<whitespace>object<whitespace> 440 * acc_enable<whitespace>acc_disable[<whitespace>...]" 441 */ 442 static ssize_t smk_write_rules_list(struct file *file, const char __user *buf, 443 size_t count, loff_t *ppos, 444 struct list_head *rule_list, 445 struct mutex *rule_lock, int format) 446 { 447 struct smack_parsed_rule rule; 448 char *data; 449 int rc; 450 int trunc = 0; 451 int tokens; 452 ssize_t cnt = 0; 453 454 /* 455 * No partial writes. 456 * Enough data must be present. 457 */ 458 if (*ppos != 0) 459 return -EINVAL; 460 461 if (format == SMK_FIXED24_FMT) { 462 /* 463 * Minor hack for backward compatibility 464 */ 465 if (count < SMK_OLOADLEN || count > SMK_LOADLEN) 466 return -EINVAL; 467 } else { 468 if (count >= PAGE_SIZE) { 469 count = PAGE_SIZE - 1; 470 trunc = 1; 471 } 472 } 473 474 data = memdup_user_nul(buf, count); 475 if (IS_ERR(data)) 476 return PTR_ERR(data); 477 478 /* 479 * In case of parsing only part of user buf, 480 * avoid having partial rule at the data buffer 481 */ 482 if (trunc) { 483 while (count > 0 && (data[count - 1] != '\n')) 484 --count; 485 if (count == 0) { 486 rc = -EINVAL; 487 goto out; 488 } 489 } 490 491 data[count] = '\0'; 492 tokens = (format == SMK_CHANGE_FMT ? 4 : 3); 493 while (cnt < count) { 494 if (format == SMK_FIXED24_FMT) { 495 rc = smk_parse_rule(data, &rule, 1); 496 if (rc < 0) 497 goto out; 498 cnt = count; 499 } else { 500 rc = smk_parse_long_rule(data + cnt, &rule, 1, tokens); 501 if (rc < 0) 502 goto out; 503 if (rc == 0) { 504 rc = -EINVAL; 505 goto out; 506 } 507 cnt += rc; 508 } 509 510 if (rule_list == NULL) 511 rc = smk_set_access(&rule, &rule.smk_subject->smk_rules, 512 &rule.smk_subject->smk_rules_lock); 513 else 514 rc = smk_set_access(&rule, rule_list, rule_lock); 515 516 if (rc) 517 goto out; 518 } 519 520 rc = cnt; 521 out: 522 kfree(data); 523 return rc; 524 } 525 526 /* 527 * Core logic for smackfs seq list operations. 528 */ 529 530 static void *smk_seq_start(struct seq_file *s, loff_t *pos, 531 struct list_head *head) 532 { 533 struct list_head *list; 534 int i = *pos; 535 536 rcu_read_lock(); 537 for (list = rcu_dereference(list_next_rcu(head)); 538 list != head; 539 list = rcu_dereference(list_next_rcu(list))) { 540 if (i-- == 0) 541 return list; 542 } 543 544 return NULL; 545 } 546 547 static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos, 548 struct list_head *head) 549 { 550 struct list_head *list = v; 551 552 ++*pos; 553 list = rcu_dereference(list_next_rcu(list)); 554 555 return (list == head) ? NULL : list; 556 } 557 558 static void smk_seq_stop(struct seq_file *s, void *v) 559 { 560 rcu_read_unlock(); 561 } 562 563 static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max) 564 { 565 /* 566 * Don't show any rules with label names too long for 567 * interface file (/smack/load or /smack/load2) 568 * because you should expect to be able to write 569 * anything you read back. 570 */ 571 if (strlen(srp->smk_subject->smk_known) >= max || 572 strlen(srp->smk_object->smk_known) >= max) 573 return; 574 575 if (srp->smk_access == 0) 576 return; 577 578 seq_printf(s, "%s %s", 579 srp->smk_subject->smk_known, 580 srp->smk_object->smk_known); 581 582 seq_putc(s, ' '); 583 584 if (srp->smk_access & MAY_READ) 585 seq_putc(s, 'r'); 586 if (srp->smk_access & MAY_WRITE) 587 seq_putc(s, 'w'); 588 if (srp->smk_access & MAY_EXEC) 589 seq_putc(s, 'x'); 590 if (srp->smk_access & MAY_APPEND) 591 seq_putc(s, 'a'); 592 if (srp->smk_access & MAY_TRANSMUTE) 593 seq_putc(s, 't'); 594 if (srp->smk_access & MAY_LOCK) 595 seq_putc(s, 'l'); 596 if (srp->smk_access & MAY_BRINGUP) 597 seq_putc(s, 'b'); 598 599 seq_putc(s, '\n'); 600 } 601 602 /* 603 * Seq_file read operations for /smack/load 604 */ 605 606 static void *load2_seq_start(struct seq_file *s, loff_t *pos) 607 { 608 return smk_seq_start(s, pos, &smack_known_list); 609 } 610 611 static void *load2_seq_next(struct seq_file *s, void *v, loff_t *pos) 612 { 613 return smk_seq_next(s, v, pos, &smack_known_list); 614 } 615 616 static int load_seq_show(struct seq_file *s, void *v) 617 { 618 struct list_head *list = v; 619 struct smack_rule *srp; 620 struct smack_known *skp = 621 list_entry_rcu(list, struct smack_known, list); 622 623 list_for_each_entry_rcu(srp, &skp->smk_rules, list) 624 smk_rule_show(s, srp, SMK_LABELLEN); 625 626 return 0; 627 } 628 629 static const struct seq_operations load_seq_ops = { 630 .start = load2_seq_start, 631 .next = load2_seq_next, 632 .show = load_seq_show, 633 .stop = smk_seq_stop, 634 }; 635 636 /** 637 * smk_open_load - open() for /smack/load 638 * @inode: inode structure representing file 639 * @file: "load" file pointer 640 * 641 * For reading, use load_seq_* seq_file reading operations. 642 */ 643 static int smk_open_load(struct inode *inode, struct file *file) 644 { 645 return seq_open(file, &load_seq_ops); 646 } 647 648 /** 649 * smk_write_load - write() for /smack/load 650 * @file: file pointer, not actually used 651 * @buf: where to get the data from 652 * @count: bytes sent 653 * @ppos: where to start - must be 0 654 * 655 */ 656 static ssize_t smk_write_load(struct file *file, const char __user *buf, 657 size_t count, loff_t *ppos) 658 { 659 /* 660 * Must have privilege. 661 * No partial writes. 662 * Enough data must be present. 663 */ 664 if (!smack_privileged(CAP_MAC_ADMIN)) 665 return -EPERM; 666 667 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL, 668 SMK_FIXED24_FMT); 669 } 670 671 static const struct file_operations smk_load_ops = { 672 .open = smk_open_load, 673 .read = seq_read, 674 .llseek = seq_lseek, 675 .write = smk_write_load, 676 .release = seq_release, 677 }; 678 679 /** 680 * smk_cipso_doi - initialize the CIPSO domain 681 */ 682 static void smk_cipso_doi(void) 683 { 684 int rc; 685 struct cipso_v4_doi *doip; 686 struct netlbl_audit nai; 687 688 smk_netlabel_audit_set(&nai); 689 690 rc = netlbl_cfg_map_del(NULL, PF_INET, NULL, NULL, &nai); 691 if (rc != 0) 692 printk(KERN_WARNING "%s:%d remove rc = %d\n", 693 __func__, __LINE__, rc); 694 695 doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL); 696 if (doip == NULL) 697 panic("smack: Failed to initialize cipso DOI.\n"); 698 doip->map.std = NULL; 699 doip->doi = smk_cipso_doi_value; 700 doip->type = CIPSO_V4_MAP_PASS; 701 doip->tags[0] = CIPSO_V4_TAG_RBITMAP; 702 for (rc = 1; rc < CIPSO_V4_TAG_MAXCNT; rc++) 703 doip->tags[rc] = CIPSO_V4_TAG_INVALID; 704 705 rc = netlbl_cfg_cipsov4_add(doip, &nai); 706 if (rc != 0) { 707 printk(KERN_WARNING "%s:%d cipso add rc = %d\n", 708 __func__, __LINE__, rc); 709 kfree(doip); 710 return; 711 } 712 rc = netlbl_cfg_cipsov4_map_add(doip->doi, NULL, NULL, NULL, &nai); 713 if (rc != 0) { 714 printk(KERN_WARNING "%s:%d map add rc = %d\n", 715 __func__, __LINE__, rc); 716 kfree(doip); 717 return; 718 } 719 } 720 721 /** 722 * smk_unlbl_ambient - initialize the unlabeled domain 723 * @oldambient: previous domain string 724 */ 725 static void smk_unlbl_ambient(char *oldambient) 726 { 727 int rc; 728 struct netlbl_audit nai; 729 730 smk_netlabel_audit_set(&nai); 731 732 if (oldambient != NULL) { 733 rc = netlbl_cfg_map_del(oldambient, PF_INET, NULL, NULL, &nai); 734 if (rc != 0) 735 printk(KERN_WARNING "%s:%d remove rc = %d\n", 736 __func__, __LINE__, rc); 737 } 738 if (smack_net_ambient == NULL) 739 smack_net_ambient = &smack_known_floor; 740 741 rc = netlbl_cfg_unlbl_map_add(smack_net_ambient->smk_known, PF_INET, 742 NULL, NULL, &nai); 743 if (rc != 0) 744 printk(KERN_WARNING "%s:%d add rc = %d\n", 745 __func__, __LINE__, rc); 746 } 747 748 /* 749 * Seq_file read operations for /smack/cipso 750 */ 751 752 static void *cipso_seq_start(struct seq_file *s, loff_t *pos) 753 { 754 return smk_seq_start(s, pos, &smack_known_list); 755 } 756 757 static void *cipso_seq_next(struct seq_file *s, void *v, loff_t *pos) 758 { 759 return smk_seq_next(s, v, pos, &smack_known_list); 760 } 761 762 /* 763 * Print cipso labels in format: 764 * label level[/cat[,cat]] 765 */ 766 static int cipso_seq_show(struct seq_file *s, void *v) 767 { 768 struct list_head *list = v; 769 struct smack_known *skp = 770 list_entry_rcu(list, struct smack_known, list); 771 struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat; 772 char sep = '/'; 773 int i; 774 775 /* 776 * Don't show a label that could not have been set using 777 * /smack/cipso. This is in support of the notion that 778 * anything read from /smack/cipso ought to be writeable 779 * to /smack/cipso. 780 * 781 * /smack/cipso2 should be used instead. 782 */ 783 if (strlen(skp->smk_known) >= SMK_LABELLEN) 784 return 0; 785 786 seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl); 787 788 for (i = netlbl_catmap_walk(cmp, 0); i >= 0; 789 i = netlbl_catmap_walk(cmp, i + 1)) { 790 seq_printf(s, "%c%d", sep, i); 791 sep = ','; 792 } 793 794 seq_putc(s, '\n'); 795 796 return 0; 797 } 798 799 static const struct seq_operations cipso_seq_ops = { 800 .start = cipso_seq_start, 801 .next = cipso_seq_next, 802 .show = cipso_seq_show, 803 .stop = smk_seq_stop, 804 }; 805 806 /** 807 * smk_open_cipso - open() for /smack/cipso 808 * @inode: inode structure representing file 809 * @file: "cipso" file pointer 810 * 811 * Connect our cipso_seq_* operations with /smack/cipso 812 * file_operations 813 */ 814 static int smk_open_cipso(struct inode *inode, struct file *file) 815 { 816 return seq_open(file, &cipso_seq_ops); 817 } 818 819 /** 820 * smk_set_cipso - do the work for write() for cipso and cipso2 821 * @file: file pointer, not actually used 822 * @buf: where to get the data from 823 * @count: bytes sent 824 * @ppos: where to start 825 * @format: /smack/cipso or /smack/cipso2 826 * 827 * Accepts only one cipso rule per write call. 828 * Returns number of bytes written or error code, as appropriate 829 */ 830 static ssize_t smk_set_cipso(struct file *file, const char __user *buf, 831 size_t count, loff_t *ppos, int format) 832 { 833 struct smack_known *skp; 834 struct netlbl_lsm_secattr ncats; 835 char mapcatset[SMK_CIPSOLEN]; 836 int maplevel; 837 unsigned int cat; 838 int catlen; 839 ssize_t rc = -EINVAL; 840 char *data = NULL; 841 char *rule; 842 int ret; 843 int i; 844 845 /* 846 * Must have privilege. 847 * No partial writes. 848 * Enough data must be present. 849 */ 850 if (!smack_privileged(CAP_MAC_ADMIN)) 851 return -EPERM; 852 if (*ppos != 0) 853 return -EINVAL; 854 if (format == SMK_FIXED24_FMT && 855 (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX)) 856 return -EINVAL; 857 858 data = memdup_user_nul(buf, count); 859 if (IS_ERR(data)) 860 return PTR_ERR(data); 861 862 rule = data; 863 /* 864 * Only allow one writer at a time. Writes should be 865 * quite rare and small in any case. 866 */ 867 mutex_lock(&smack_cipso_lock); 868 869 skp = smk_import_entry(rule, 0); 870 if (IS_ERR(skp)) { 871 rc = PTR_ERR(skp); 872 goto out; 873 } 874 875 if (format == SMK_FIXED24_FMT) 876 rule += SMK_LABELLEN; 877 else 878 rule += strlen(skp->smk_known) + 1; 879 880 ret = sscanf(rule, "%d", &maplevel); 881 if (ret != 1 || maplevel > SMACK_CIPSO_MAXLEVEL) 882 goto out; 883 884 rule += SMK_DIGITLEN; 885 ret = sscanf(rule, "%d", &catlen); 886 if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM) 887 goto out; 888 889 if (format == SMK_FIXED24_FMT && 890 count != (SMK_CIPSOMIN + catlen * SMK_DIGITLEN)) 891 goto out; 892 893 memset(mapcatset, 0, sizeof(mapcatset)); 894 895 for (i = 0; i < catlen; i++) { 896 rule += SMK_DIGITLEN; 897 ret = sscanf(rule, "%u", &cat); 898 if (ret != 1 || cat > SMACK_CIPSO_MAXCATNUM) 899 goto out; 900 901 smack_catset_bit(cat, mapcatset); 902 } 903 904 rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN); 905 if (rc >= 0) { 906 netlbl_catmap_free(skp->smk_netlabel.attr.mls.cat); 907 skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat; 908 skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl; 909 rc = count; 910 } 911 912 out: 913 mutex_unlock(&smack_cipso_lock); 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_rcu(list, struct smack_known, list); 955 struct netlbl_lsm_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_catmap_walk(cmp, 0); i >= 0; 962 i = netlbl_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 *net4addr_seq_start(struct seq_file *s, loff_t *pos) 1021 { 1022 return smk_seq_start(s, pos, &smk_net4addr_list); 1023 } 1024 1025 static void *net4addr_seq_next(struct seq_file *s, void *v, loff_t *pos) 1026 { 1027 return smk_seq_next(s, v, pos, &smk_net4addr_list); 1028 } 1029 1030 /* 1031 * Print host/label pairs 1032 */ 1033 static int net4addr_seq_show(struct seq_file *s, void *v) 1034 { 1035 struct list_head *list = v; 1036 struct smk_net4addr *skp = 1037 list_entry_rcu(list, struct smk_net4addr, list); 1038 char *kp = SMACK_CIPSO_OPTION; 1039 1040 if (skp->smk_label != NULL) 1041 kp = skp->smk_label->smk_known; 1042 seq_printf(s, "%pI4/%d %s\n", &skp->smk_host.s_addr, 1043 skp->smk_masks, kp); 1044 1045 return 0; 1046 } 1047 1048 static const struct seq_operations net4addr_seq_ops = { 1049 .start = net4addr_seq_start, 1050 .next = net4addr_seq_next, 1051 .show = net4addr_seq_show, 1052 .stop = smk_seq_stop, 1053 }; 1054 1055 /** 1056 * smk_open_net4addr - open() for /smack/netlabel 1057 * @inode: inode structure representing file 1058 * @file: "netlabel" file pointer 1059 * 1060 * Connect our net4addr_seq_* operations with /smack/netlabel 1061 * file_operations 1062 */ 1063 static int smk_open_net4addr(struct inode *inode, struct file *file) 1064 { 1065 return seq_open(file, &net4addr_seq_ops); 1066 } 1067 1068 /** 1069 * smk_net4addr_insert 1070 * @new : netlabel to insert 1071 * 1072 * This helper insert netlabel in the smack_net4addrs list 1073 * sorted by netmask length (longest to smallest) 1074 * locked by &smk_net4addr_lock in smk_write_net4addr 1075 * 1076 */ 1077 static void smk_net4addr_insert(struct smk_net4addr *new) 1078 { 1079 struct smk_net4addr *m; 1080 struct smk_net4addr *m_next; 1081 1082 if (list_empty(&smk_net4addr_list)) { 1083 list_add_rcu(&new->list, &smk_net4addr_list); 1084 return; 1085 } 1086 1087 m = list_entry_rcu(smk_net4addr_list.next, 1088 struct smk_net4addr, list); 1089 1090 /* the comparison '>' is a bit hacky, but works */ 1091 if (new->smk_masks > m->smk_masks) { 1092 list_add_rcu(&new->list, &smk_net4addr_list); 1093 return; 1094 } 1095 1096 list_for_each_entry_rcu(m, &smk_net4addr_list, list) { 1097 if (list_is_last(&m->list, &smk_net4addr_list)) { 1098 list_add_rcu(&new->list, &m->list); 1099 return; 1100 } 1101 m_next = list_entry_rcu(m->list.next, 1102 struct smk_net4addr, list); 1103 if (new->smk_masks > m_next->smk_masks) { 1104 list_add_rcu(&new->list, &m->list); 1105 return; 1106 } 1107 } 1108 } 1109 1110 1111 /** 1112 * smk_write_net4addr - write() for /smack/netlabel 1113 * @file: file pointer, not actually used 1114 * @buf: where to get the data from 1115 * @count: bytes sent 1116 * @ppos: where to start 1117 * 1118 * Accepts only one net4addr per write call. 1119 * Returns number of bytes written or error code, as appropriate 1120 */ 1121 static ssize_t smk_write_net4addr(struct file *file, const char __user *buf, 1122 size_t count, loff_t *ppos) 1123 { 1124 struct smk_net4addr *snp; 1125 struct sockaddr_in newname; 1126 char *smack; 1127 struct smack_known *skp = NULL; 1128 char *data; 1129 char *host = (char *)&newname.sin_addr.s_addr; 1130 int rc; 1131 struct netlbl_audit audit_info; 1132 struct in_addr mask; 1133 unsigned int m; 1134 unsigned int masks; 1135 int found; 1136 u32 mask_bits = (1<<31); 1137 __be32 nsa; 1138 u32 temp_mask; 1139 1140 /* 1141 * Must have privilege. 1142 * No partial writes. 1143 * Enough data must be present. 1144 * "<addr/mask, as a.b.c.d/e><space><label>" 1145 * "<addr, as a.b.c.d><space><label>" 1146 */ 1147 if (!smack_privileged(CAP_MAC_ADMIN)) 1148 return -EPERM; 1149 if (*ppos != 0) 1150 return -EINVAL; 1151 if (count < SMK_NETLBLADDRMIN) 1152 return -EINVAL; 1153 1154 data = memdup_user_nul(buf, count); 1155 if (IS_ERR(data)) 1156 return PTR_ERR(data); 1157 1158 smack = kzalloc(count + 1, GFP_KERNEL); 1159 if (smack == NULL) { 1160 rc = -ENOMEM; 1161 goto free_data_out; 1162 } 1163 1164 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%u %s", 1165 &host[0], &host[1], &host[2], &host[3], &masks, smack); 1166 if (rc != 6) { 1167 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd %s", 1168 &host[0], &host[1], &host[2], &host[3], smack); 1169 if (rc != 5) { 1170 rc = -EINVAL; 1171 goto free_out; 1172 } 1173 m = BEBITS; 1174 masks = 32; 1175 } 1176 if (masks > BEBITS) { 1177 rc = -EINVAL; 1178 goto free_out; 1179 } 1180 1181 /* 1182 * If smack begins with '-', it is an option, don't import it 1183 */ 1184 if (smack[0] != '-') { 1185 skp = smk_import_entry(smack, 0); 1186 if (IS_ERR(skp)) { 1187 rc = PTR_ERR(skp); 1188 goto free_out; 1189 } 1190 } else { 1191 /* 1192 * Only the -CIPSO option is supported for IPv4 1193 */ 1194 if (strcmp(smack, SMACK_CIPSO_OPTION) != 0) { 1195 rc = -EINVAL; 1196 goto free_out; 1197 } 1198 } 1199 1200 for (m = masks, temp_mask = 0; m > 0; m--) { 1201 temp_mask |= mask_bits; 1202 mask_bits >>= 1; 1203 } 1204 mask.s_addr = cpu_to_be32(temp_mask); 1205 1206 newname.sin_addr.s_addr &= mask.s_addr; 1207 /* 1208 * Only allow one writer at a time. Writes should be 1209 * quite rare and small in any case. 1210 */ 1211 mutex_lock(&smk_net4addr_lock); 1212 1213 nsa = newname.sin_addr.s_addr; 1214 /* try to find if the prefix is already in the list */ 1215 found = 0; 1216 list_for_each_entry_rcu(snp, &smk_net4addr_list, list) { 1217 if (snp->smk_host.s_addr == nsa && snp->smk_masks == masks) { 1218 found = 1; 1219 break; 1220 } 1221 } 1222 smk_netlabel_audit_set(&audit_info); 1223 1224 if (found == 0) { 1225 snp = kzalloc(sizeof(*snp), GFP_KERNEL); 1226 if (snp == NULL) 1227 rc = -ENOMEM; 1228 else { 1229 rc = 0; 1230 snp->smk_host.s_addr = newname.sin_addr.s_addr; 1231 snp->smk_mask.s_addr = mask.s_addr; 1232 snp->smk_label = skp; 1233 snp->smk_masks = masks; 1234 smk_net4addr_insert(snp); 1235 } 1236 } else { 1237 /* 1238 * Delete the unlabeled entry, only if the previous label 1239 * wasn't the special CIPSO option 1240 */ 1241 if (snp->smk_label != NULL) 1242 rc = netlbl_cfg_unlbl_static_del(&init_net, NULL, 1243 &snp->smk_host, &snp->smk_mask, 1244 PF_INET, &audit_info); 1245 else 1246 rc = 0; 1247 snp->smk_label = skp; 1248 } 1249 1250 /* 1251 * Now tell netlabel about the single label nature of 1252 * this host so that incoming packets get labeled. 1253 * but only if we didn't get the special CIPSO option 1254 */ 1255 if (rc == 0 && skp != NULL) 1256 rc = netlbl_cfg_unlbl_static_add(&init_net, NULL, 1257 &snp->smk_host, &snp->smk_mask, PF_INET, 1258 snp->smk_label->smk_secid, &audit_info); 1259 1260 if (rc == 0) 1261 rc = count; 1262 1263 mutex_unlock(&smk_net4addr_lock); 1264 1265 free_out: 1266 kfree(smack); 1267 free_data_out: 1268 kfree(data); 1269 1270 return rc; 1271 } 1272 1273 static const struct file_operations smk_net4addr_ops = { 1274 .open = smk_open_net4addr, 1275 .read = seq_read, 1276 .llseek = seq_lseek, 1277 .write = smk_write_net4addr, 1278 .release = seq_release, 1279 }; 1280 1281 #if IS_ENABLED(CONFIG_IPV6) 1282 /* 1283 * Seq_file read operations for /smack/netlabel6 1284 */ 1285 1286 static void *net6addr_seq_start(struct seq_file *s, loff_t *pos) 1287 { 1288 return smk_seq_start(s, pos, &smk_net6addr_list); 1289 } 1290 1291 static void *net6addr_seq_next(struct seq_file *s, void *v, loff_t *pos) 1292 { 1293 return smk_seq_next(s, v, pos, &smk_net6addr_list); 1294 } 1295 1296 /* 1297 * Print host/label pairs 1298 */ 1299 static int net6addr_seq_show(struct seq_file *s, void *v) 1300 { 1301 struct list_head *list = v; 1302 struct smk_net6addr *skp = 1303 list_entry(list, struct smk_net6addr, list); 1304 1305 if (skp->smk_label != NULL) 1306 seq_printf(s, "%pI6/%d %s\n", &skp->smk_host, skp->smk_masks, 1307 skp->smk_label->smk_known); 1308 1309 return 0; 1310 } 1311 1312 static const struct seq_operations net6addr_seq_ops = { 1313 .start = net6addr_seq_start, 1314 .next = net6addr_seq_next, 1315 .show = net6addr_seq_show, 1316 .stop = smk_seq_stop, 1317 }; 1318 1319 /** 1320 * smk_open_net6addr - open() for /smack/netlabel 1321 * @inode: inode structure representing file 1322 * @file: "netlabel" file pointer 1323 * 1324 * Connect our net6addr_seq_* operations with /smack/netlabel 1325 * file_operations 1326 */ 1327 static int smk_open_net6addr(struct inode *inode, struct file *file) 1328 { 1329 return seq_open(file, &net6addr_seq_ops); 1330 } 1331 1332 /** 1333 * smk_net6addr_insert 1334 * @new : entry to insert 1335 * 1336 * This inserts an entry in the smack_net6addrs list 1337 * sorted by netmask length (longest to smallest) 1338 * locked by &smk_net6addr_lock in smk_write_net6addr 1339 * 1340 */ 1341 static void smk_net6addr_insert(struct smk_net6addr *new) 1342 { 1343 struct smk_net6addr *m_next; 1344 struct smk_net6addr *m; 1345 1346 if (list_empty(&smk_net6addr_list)) { 1347 list_add_rcu(&new->list, &smk_net6addr_list); 1348 return; 1349 } 1350 1351 m = list_entry_rcu(smk_net6addr_list.next, 1352 struct smk_net6addr, list); 1353 1354 if (new->smk_masks > m->smk_masks) { 1355 list_add_rcu(&new->list, &smk_net6addr_list); 1356 return; 1357 } 1358 1359 list_for_each_entry_rcu(m, &smk_net6addr_list, list) { 1360 if (list_is_last(&m->list, &smk_net6addr_list)) { 1361 list_add_rcu(&new->list, &m->list); 1362 return; 1363 } 1364 m_next = list_entry_rcu(m->list.next, 1365 struct smk_net6addr, list); 1366 if (new->smk_masks > m_next->smk_masks) { 1367 list_add_rcu(&new->list, &m->list); 1368 return; 1369 } 1370 } 1371 } 1372 1373 1374 /** 1375 * smk_write_net6addr - write() for /smack/netlabel 1376 * @file: file pointer, not actually used 1377 * @buf: where to get the data from 1378 * @count: bytes sent 1379 * @ppos: where to start 1380 * 1381 * Accepts only one net6addr per write call. 1382 * Returns number of bytes written or error code, as appropriate 1383 */ 1384 static ssize_t smk_write_net6addr(struct file *file, const char __user *buf, 1385 size_t count, loff_t *ppos) 1386 { 1387 struct smk_net6addr *snp; 1388 struct in6_addr newname; 1389 struct in6_addr fullmask; 1390 struct smack_known *skp = NULL; 1391 char *smack; 1392 char *data; 1393 int rc = 0; 1394 int found = 0; 1395 int i; 1396 unsigned int scanned[8]; 1397 unsigned int m; 1398 unsigned int mask = 128; 1399 1400 /* 1401 * Must have privilege. 1402 * No partial writes. 1403 * Enough data must be present. 1404 * "<addr/mask, as a:b:c:d:e:f:g:h/e><space><label>" 1405 * "<addr, as a:b:c:d:e:f:g:h><space><label>" 1406 */ 1407 if (!smack_privileged(CAP_MAC_ADMIN)) 1408 return -EPERM; 1409 if (*ppos != 0) 1410 return -EINVAL; 1411 if (count < SMK_NETLBLADDRMIN) 1412 return -EINVAL; 1413 1414 data = memdup_user_nul(buf, count); 1415 if (IS_ERR(data)) 1416 return PTR_ERR(data); 1417 1418 smack = kzalloc(count + 1, GFP_KERNEL); 1419 if (smack == NULL) { 1420 rc = -ENOMEM; 1421 goto free_data_out; 1422 } 1423 1424 i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x/%u %s", 1425 &scanned[0], &scanned[1], &scanned[2], &scanned[3], 1426 &scanned[4], &scanned[5], &scanned[6], &scanned[7], 1427 &mask, smack); 1428 if (i != 10) { 1429 i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x %s", 1430 &scanned[0], &scanned[1], &scanned[2], 1431 &scanned[3], &scanned[4], &scanned[5], 1432 &scanned[6], &scanned[7], smack); 1433 if (i != 9) { 1434 rc = -EINVAL; 1435 goto free_out; 1436 } 1437 } 1438 if (mask > 128) { 1439 rc = -EINVAL; 1440 goto free_out; 1441 } 1442 for (i = 0; i < 8; i++) { 1443 if (scanned[i] > 0xffff) { 1444 rc = -EINVAL; 1445 goto free_out; 1446 } 1447 newname.s6_addr16[i] = htons(scanned[i]); 1448 } 1449 1450 /* 1451 * If smack begins with '-', it is an option, don't import it 1452 */ 1453 if (smack[0] != '-') { 1454 skp = smk_import_entry(smack, 0); 1455 if (IS_ERR(skp)) { 1456 rc = PTR_ERR(skp); 1457 goto free_out; 1458 } 1459 } else { 1460 /* 1461 * Only -DELETE is supported for IPv6 1462 */ 1463 if (strcmp(smack, SMACK_DELETE_OPTION) != 0) { 1464 rc = -EINVAL; 1465 goto free_out; 1466 } 1467 } 1468 1469 for (i = 0, m = mask; i < 8; i++) { 1470 if (m >= 16) { 1471 fullmask.s6_addr16[i] = 0xffff; 1472 m -= 16; 1473 } else if (m > 0) { 1474 fullmask.s6_addr16[i] = (1 << m) - 1; 1475 m = 0; 1476 } else 1477 fullmask.s6_addr16[i] = 0; 1478 newname.s6_addr16[i] &= fullmask.s6_addr16[i]; 1479 } 1480 1481 /* 1482 * Only allow one writer at a time. Writes should be 1483 * quite rare and small in any case. 1484 */ 1485 mutex_lock(&smk_net6addr_lock); 1486 /* 1487 * Try to find the prefix in the list 1488 */ 1489 list_for_each_entry_rcu(snp, &smk_net6addr_list, list) { 1490 if (mask != snp->smk_masks) 1491 continue; 1492 for (found = 1, i = 0; i < 8; i++) { 1493 if (newname.s6_addr16[i] != 1494 snp->smk_host.s6_addr16[i]) { 1495 found = 0; 1496 break; 1497 } 1498 } 1499 if (found == 1) 1500 break; 1501 } 1502 if (found == 0) { 1503 snp = kzalloc(sizeof(*snp), GFP_KERNEL); 1504 if (snp == NULL) 1505 rc = -ENOMEM; 1506 else { 1507 snp->smk_host = newname; 1508 snp->smk_mask = fullmask; 1509 snp->smk_masks = mask; 1510 snp->smk_label = skp; 1511 smk_net6addr_insert(snp); 1512 } 1513 } else { 1514 snp->smk_label = skp; 1515 } 1516 1517 if (rc == 0) 1518 rc = count; 1519 1520 mutex_unlock(&smk_net6addr_lock); 1521 1522 free_out: 1523 kfree(smack); 1524 free_data_out: 1525 kfree(data); 1526 1527 return rc; 1528 } 1529 1530 static const struct file_operations smk_net6addr_ops = { 1531 .open = smk_open_net6addr, 1532 .read = seq_read, 1533 .llseek = seq_lseek, 1534 .write = smk_write_net6addr, 1535 .release = seq_release, 1536 }; 1537 #endif /* CONFIG_IPV6 */ 1538 1539 /** 1540 * smk_read_doi - read() for /smack/doi 1541 * @filp: file pointer, not actually used 1542 * @buf: where to put the result 1543 * @count: maximum to send along 1544 * @ppos: where to start 1545 * 1546 * Returns number of bytes read or error code, as appropriate 1547 */ 1548 static ssize_t smk_read_doi(struct file *filp, char __user *buf, 1549 size_t count, loff_t *ppos) 1550 { 1551 char temp[80]; 1552 ssize_t rc; 1553 1554 if (*ppos != 0) 1555 return 0; 1556 1557 sprintf(temp, "%d", smk_cipso_doi_value); 1558 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1559 1560 return rc; 1561 } 1562 1563 /** 1564 * smk_write_doi - write() for /smack/doi 1565 * @file: file pointer, not actually used 1566 * @buf: where to get the data from 1567 * @count: bytes sent 1568 * @ppos: where to start 1569 * 1570 * Returns number of bytes written or error code, as appropriate 1571 */ 1572 static ssize_t smk_write_doi(struct file *file, const char __user *buf, 1573 size_t count, loff_t *ppos) 1574 { 1575 char temp[80]; 1576 int i; 1577 1578 if (!smack_privileged(CAP_MAC_ADMIN)) 1579 return -EPERM; 1580 1581 if (count >= sizeof(temp) || count == 0) 1582 return -EINVAL; 1583 1584 if (copy_from_user(temp, buf, count) != 0) 1585 return -EFAULT; 1586 1587 temp[count] = '\0'; 1588 1589 if (sscanf(temp, "%d", &i) != 1) 1590 return -EINVAL; 1591 1592 smk_cipso_doi_value = i; 1593 1594 smk_cipso_doi(); 1595 1596 return count; 1597 } 1598 1599 static const struct file_operations smk_doi_ops = { 1600 .read = smk_read_doi, 1601 .write = smk_write_doi, 1602 .llseek = default_llseek, 1603 }; 1604 1605 /** 1606 * smk_read_direct - read() for /smack/direct 1607 * @filp: file pointer, not actually used 1608 * @buf: where to put the result 1609 * @count: maximum to send along 1610 * @ppos: where to start 1611 * 1612 * Returns number of bytes read or error code, as appropriate 1613 */ 1614 static ssize_t smk_read_direct(struct file *filp, char __user *buf, 1615 size_t count, loff_t *ppos) 1616 { 1617 char temp[80]; 1618 ssize_t rc; 1619 1620 if (*ppos != 0) 1621 return 0; 1622 1623 sprintf(temp, "%d", smack_cipso_direct); 1624 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1625 1626 return rc; 1627 } 1628 1629 /** 1630 * smk_write_direct - write() for /smack/direct 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_direct(struct file *file, const char __user *buf, 1639 size_t count, loff_t *ppos) 1640 { 1641 struct smack_known *skp; 1642 char temp[80]; 1643 int i; 1644 1645 if (!smack_privileged(CAP_MAC_ADMIN)) 1646 return -EPERM; 1647 1648 if (count >= sizeof(temp) || count == 0) 1649 return -EINVAL; 1650 1651 if (copy_from_user(temp, buf, count) != 0) 1652 return -EFAULT; 1653 1654 temp[count] = '\0'; 1655 1656 if (sscanf(temp, "%d", &i) != 1) 1657 return -EINVAL; 1658 1659 /* 1660 * Don't do anything if the value hasn't actually changed. 1661 * If it is changing reset the level on entries that were 1662 * set up to be direct when they were created. 1663 */ 1664 if (smack_cipso_direct != i) { 1665 mutex_lock(&smack_known_lock); 1666 list_for_each_entry_rcu(skp, &smack_known_list, list) 1667 if (skp->smk_netlabel.attr.mls.lvl == 1668 smack_cipso_direct) 1669 skp->smk_netlabel.attr.mls.lvl = i; 1670 smack_cipso_direct = i; 1671 mutex_unlock(&smack_known_lock); 1672 } 1673 1674 return count; 1675 } 1676 1677 static const struct file_operations smk_direct_ops = { 1678 .read = smk_read_direct, 1679 .write = smk_write_direct, 1680 .llseek = default_llseek, 1681 }; 1682 1683 /** 1684 * smk_read_mapped - read() for /smack/mapped 1685 * @filp: file pointer, not actually used 1686 * @buf: where to put the result 1687 * @count: maximum to send along 1688 * @ppos: where to start 1689 * 1690 * Returns number of bytes read or error code, as appropriate 1691 */ 1692 static ssize_t smk_read_mapped(struct file *filp, char __user *buf, 1693 size_t count, loff_t *ppos) 1694 { 1695 char temp[80]; 1696 ssize_t rc; 1697 1698 if (*ppos != 0) 1699 return 0; 1700 1701 sprintf(temp, "%d", smack_cipso_mapped); 1702 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 1703 1704 return rc; 1705 } 1706 1707 /** 1708 * smk_write_mapped - write() for /smack/mapped 1709 * @file: file pointer, not actually used 1710 * @buf: where to get the data from 1711 * @count: bytes sent 1712 * @ppos: where to start 1713 * 1714 * Returns number of bytes written or error code, as appropriate 1715 */ 1716 static ssize_t smk_write_mapped(struct file *file, const char __user *buf, 1717 size_t count, loff_t *ppos) 1718 { 1719 struct smack_known *skp; 1720 char temp[80]; 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 1737 /* 1738 * Don't do anything if the value hasn't actually changed. 1739 * If it is changing reset the level on entries that were 1740 * set up to be mapped when they were created. 1741 */ 1742 if (smack_cipso_mapped != i) { 1743 mutex_lock(&smack_known_lock); 1744 list_for_each_entry_rcu(skp, &smack_known_list, list) 1745 if (skp->smk_netlabel.attr.mls.lvl == 1746 smack_cipso_mapped) 1747 skp->smk_netlabel.attr.mls.lvl = i; 1748 smack_cipso_mapped = i; 1749 mutex_unlock(&smack_known_lock); 1750 } 1751 1752 return count; 1753 } 1754 1755 static const struct file_operations smk_mapped_ops = { 1756 .read = smk_read_mapped, 1757 .write = smk_write_mapped, 1758 .llseek = default_llseek, 1759 }; 1760 1761 /** 1762 * smk_read_ambient - read() for /smack/ambient 1763 * @filp: file pointer, not actually used 1764 * @buf: where to put the result 1765 * @cn: maximum to send along 1766 * @ppos: where to start 1767 * 1768 * Returns number of bytes read or error code, as appropriate 1769 */ 1770 static ssize_t smk_read_ambient(struct file *filp, char __user *buf, 1771 size_t cn, loff_t *ppos) 1772 { 1773 ssize_t rc; 1774 int asize; 1775 1776 if (*ppos != 0) 1777 return 0; 1778 /* 1779 * Being careful to avoid a problem in the case where 1780 * smack_net_ambient gets changed in midstream. 1781 */ 1782 mutex_lock(&smack_ambient_lock); 1783 1784 asize = strlen(smack_net_ambient->smk_known) + 1; 1785 1786 if (cn >= asize) 1787 rc = simple_read_from_buffer(buf, cn, ppos, 1788 smack_net_ambient->smk_known, 1789 asize); 1790 else 1791 rc = -EINVAL; 1792 1793 mutex_unlock(&smack_ambient_lock); 1794 1795 return rc; 1796 } 1797 1798 /** 1799 * smk_write_ambient - write() for /smack/ambient 1800 * @file: file pointer, not actually used 1801 * @buf: where to get the data from 1802 * @count: bytes sent 1803 * @ppos: where to start 1804 * 1805 * Returns number of bytes written or error code, as appropriate 1806 */ 1807 static ssize_t smk_write_ambient(struct file *file, const char __user *buf, 1808 size_t count, loff_t *ppos) 1809 { 1810 struct smack_known *skp; 1811 char *oldambient; 1812 char *data; 1813 int rc = count; 1814 1815 if (!smack_privileged(CAP_MAC_ADMIN)) 1816 return -EPERM; 1817 1818 data = memdup_user_nul(buf, count); 1819 if (IS_ERR(data)) 1820 return PTR_ERR(data); 1821 1822 skp = smk_import_entry(data, count); 1823 if (IS_ERR(skp)) { 1824 rc = PTR_ERR(skp); 1825 goto out; 1826 } 1827 1828 mutex_lock(&smack_ambient_lock); 1829 1830 oldambient = smack_net_ambient->smk_known; 1831 smack_net_ambient = skp; 1832 smk_unlbl_ambient(oldambient); 1833 1834 mutex_unlock(&smack_ambient_lock); 1835 1836 out: 1837 kfree(data); 1838 return rc; 1839 } 1840 1841 static const struct file_operations smk_ambient_ops = { 1842 .read = smk_read_ambient, 1843 .write = smk_write_ambient, 1844 .llseek = default_llseek, 1845 }; 1846 1847 /* 1848 * Seq_file operations for /smack/onlycap 1849 */ 1850 static void *onlycap_seq_start(struct seq_file *s, loff_t *pos) 1851 { 1852 return smk_seq_start(s, pos, &smack_onlycap_list); 1853 } 1854 1855 static void *onlycap_seq_next(struct seq_file *s, void *v, loff_t *pos) 1856 { 1857 return smk_seq_next(s, v, pos, &smack_onlycap_list); 1858 } 1859 1860 static int onlycap_seq_show(struct seq_file *s, void *v) 1861 { 1862 struct list_head *list = v; 1863 struct smack_known_list_elem *sklep = 1864 list_entry_rcu(list, struct smack_known_list_elem, list); 1865 1866 seq_puts(s, sklep->smk_label->smk_known); 1867 seq_putc(s, ' '); 1868 1869 return 0; 1870 } 1871 1872 static const struct seq_operations onlycap_seq_ops = { 1873 .start = onlycap_seq_start, 1874 .next = onlycap_seq_next, 1875 .show = onlycap_seq_show, 1876 .stop = smk_seq_stop, 1877 }; 1878 1879 static int smk_open_onlycap(struct inode *inode, struct file *file) 1880 { 1881 return seq_open(file, &onlycap_seq_ops); 1882 } 1883 1884 /** 1885 * smk_list_swap_rcu - swap public list with a private one in RCU-safe way 1886 * The caller must hold appropriate mutex to prevent concurrent modifications 1887 * to the public list. 1888 * Private list is assumed to be not accessible to other threads yet. 1889 * 1890 * @public: public list 1891 * @private: private list 1892 */ 1893 static void smk_list_swap_rcu(struct list_head *public, 1894 struct list_head *private) 1895 { 1896 struct list_head *first, *last; 1897 1898 if (list_empty(public)) { 1899 list_splice_init_rcu(private, public, synchronize_rcu); 1900 } else { 1901 /* Remember public list before replacing it */ 1902 first = public->next; 1903 last = public->prev; 1904 1905 /* Publish private list in place of public in RCU-safe way */ 1906 private->prev->next = public; 1907 private->next->prev = public; 1908 rcu_assign_pointer(public->next, private->next); 1909 public->prev = private->prev; 1910 1911 synchronize_rcu(); 1912 1913 /* When all readers are done with the old public list, 1914 * attach it in place of private */ 1915 private->next = first; 1916 private->prev = last; 1917 first->prev = private; 1918 last->next = private; 1919 } 1920 } 1921 1922 /** 1923 * smk_parse_label_list - parse list of Smack labels, separated by spaces 1924 * 1925 * @data: the string to parse 1926 * @private: destination list 1927 * 1928 * Returns zero on success or error code, as appropriate 1929 */ 1930 static int smk_parse_label_list(char *data, struct list_head *list) 1931 { 1932 char *tok; 1933 struct smack_known *skp; 1934 struct smack_known_list_elem *sklep; 1935 1936 while ((tok = strsep(&data, " ")) != NULL) { 1937 if (!*tok) 1938 continue; 1939 1940 skp = smk_import_entry(tok, 0); 1941 if (IS_ERR(skp)) 1942 return PTR_ERR(skp); 1943 1944 sklep = kzalloc(sizeof(*sklep), GFP_KERNEL); 1945 if (sklep == NULL) 1946 return -ENOMEM; 1947 1948 sklep->smk_label = skp; 1949 list_add(&sklep->list, list); 1950 } 1951 1952 return 0; 1953 } 1954 1955 /** 1956 * smk_destroy_label_list - destroy a list of smack_known_list_elem 1957 * @head: header pointer of the list to destroy 1958 */ 1959 void smk_destroy_label_list(struct list_head *list) 1960 { 1961 struct smack_known_list_elem *sklep; 1962 struct smack_known_list_elem *sklep2; 1963 1964 list_for_each_entry_safe(sklep, sklep2, list, list) 1965 kfree(sklep); 1966 1967 INIT_LIST_HEAD(list); 1968 } 1969 1970 /** 1971 * smk_write_onlycap - write() for smackfs/onlycap 1972 * @file: file pointer, not actually used 1973 * @buf: where to get the data from 1974 * @count: bytes sent 1975 * @ppos: where to start 1976 * 1977 * Returns number of bytes written or error code, as appropriate 1978 */ 1979 static ssize_t smk_write_onlycap(struct file *file, const char __user *buf, 1980 size_t count, loff_t *ppos) 1981 { 1982 char *data; 1983 LIST_HEAD(list_tmp); 1984 int rc; 1985 1986 if (!smack_privileged(CAP_MAC_ADMIN)) 1987 return -EPERM; 1988 1989 data = memdup_user_nul(buf, count); 1990 if (IS_ERR(data)) 1991 return PTR_ERR(data); 1992 1993 rc = smk_parse_label_list(data, &list_tmp); 1994 kfree(data); 1995 1996 /* 1997 * Clear the smack_onlycap on invalid label errors. This means 1998 * that we can pass a null string to unset the onlycap value. 1999 * 2000 * Importing will also reject a label beginning with '-', 2001 * so "-usecapabilities" will also work. 2002 * 2003 * But do so only on invalid label, not on system errors. 2004 * The invalid label must be first to count as clearing attempt. 2005 */ 2006 if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) { 2007 mutex_lock(&smack_onlycap_lock); 2008 smk_list_swap_rcu(&smack_onlycap_list, &list_tmp); 2009 mutex_unlock(&smack_onlycap_lock); 2010 rc = count; 2011 } 2012 2013 smk_destroy_label_list(&list_tmp); 2014 2015 return rc; 2016 } 2017 2018 static const struct file_operations smk_onlycap_ops = { 2019 .open = smk_open_onlycap, 2020 .read = seq_read, 2021 .write = smk_write_onlycap, 2022 .llseek = seq_lseek, 2023 .release = seq_release, 2024 }; 2025 2026 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 2027 /** 2028 * smk_read_unconfined - read() for smackfs/unconfined 2029 * @filp: file pointer, not actually used 2030 * @buf: where to put the result 2031 * @cn: maximum to send along 2032 * @ppos: where to start 2033 * 2034 * Returns number of bytes read or error code, as appropriate 2035 */ 2036 static ssize_t smk_read_unconfined(struct file *filp, char __user *buf, 2037 size_t cn, loff_t *ppos) 2038 { 2039 char *smack = ""; 2040 ssize_t rc = -EINVAL; 2041 int asize; 2042 2043 if (*ppos != 0) 2044 return 0; 2045 2046 if (smack_unconfined != NULL) 2047 smack = smack_unconfined->smk_known; 2048 2049 asize = strlen(smack) + 1; 2050 2051 if (cn >= asize) 2052 rc = simple_read_from_buffer(buf, cn, ppos, smack, asize); 2053 2054 return rc; 2055 } 2056 2057 /** 2058 * smk_write_unconfined - write() for smackfs/unconfined 2059 * @file: file pointer, not actually used 2060 * @buf: where to get the data from 2061 * @count: bytes sent 2062 * @ppos: where to start 2063 * 2064 * Returns number of bytes written or error code, as appropriate 2065 */ 2066 static ssize_t smk_write_unconfined(struct file *file, const char __user *buf, 2067 size_t count, loff_t *ppos) 2068 { 2069 char *data; 2070 struct smack_known *skp; 2071 int rc = count; 2072 2073 if (!smack_privileged(CAP_MAC_ADMIN)) 2074 return -EPERM; 2075 2076 data = memdup_user_nul(buf, count); 2077 if (IS_ERR(data)) 2078 return PTR_ERR(data); 2079 2080 /* 2081 * Clear the smack_unconfined on invalid label errors. This means 2082 * that we can pass a null string to unset the unconfined value. 2083 * 2084 * Importing will also reject a label beginning with '-', 2085 * so "-confine" will also work. 2086 * 2087 * But do so only on invalid label, not on system errors. 2088 */ 2089 skp = smk_import_entry(data, count); 2090 if (PTR_ERR(skp) == -EINVAL) 2091 skp = NULL; 2092 else if (IS_ERR(skp)) { 2093 rc = PTR_ERR(skp); 2094 goto freeout; 2095 } 2096 2097 smack_unconfined = skp; 2098 2099 freeout: 2100 kfree(data); 2101 return rc; 2102 } 2103 2104 static const struct file_operations smk_unconfined_ops = { 2105 .read = smk_read_unconfined, 2106 .write = smk_write_unconfined, 2107 .llseek = default_llseek, 2108 }; 2109 #endif /* CONFIG_SECURITY_SMACK_BRINGUP */ 2110 2111 /** 2112 * smk_read_logging - read() for /smack/logging 2113 * @filp: file pointer, not actually used 2114 * @buf: where to put the result 2115 * @cn: maximum to send along 2116 * @ppos: where to start 2117 * 2118 * Returns number of bytes read or error code, as appropriate 2119 */ 2120 static ssize_t smk_read_logging(struct file *filp, char __user *buf, 2121 size_t count, loff_t *ppos) 2122 { 2123 char temp[32]; 2124 ssize_t rc; 2125 2126 if (*ppos != 0) 2127 return 0; 2128 2129 sprintf(temp, "%d\n", log_policy); 2130 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 2131 return rc; 2132 } 2133 2134 /** 2135 * smk_write_logging - write() for /smack/logging 2136 * @file: file pointer, not actually used 2137 * @buf: where to get the data from 2138 * @count: bytes sent 2139 * @ppos: where to start 2140 * 2141 * Returns number of bytes written or error code, as appropriate 2142 */ 2143 static ssize_t smk_write_logging(struct file *file, const char __user *buf, 2144 size_t count, loff_t *ppos) 2145 { 2146 char temp[32]; 2147 int i; 2148 2149 if (!smack_privileged(CAP_MAC_ADMIN)) 2150 return -EPERM; 2151 2152 if (count >= sizeof(temp) || count == 0) 2153 return -EINVAL; 2154 2155 if (copy_from_user(temp, buf, count) != 0) 2156 return -EFAULT; 2157 2158 temp[count] = '\0'; 2159 2160 if (sscanf(temp, "%d", &i) != 1) 2161 return -EINVAL; 2162 if (i < 0 || i > 3) 2163 return -EINVAL; 2164 log_policy = i; 2165 return count; 2166 } 2167 2168 2169 2170 static const struct file_operations smk_logging_ops = { 2171 .read = smk_read_logging, 2172 .write = smk_write_logging, 2173 .llseek = default_llseek, 2174 }; 2175 2176 /* 2177 * Seq_file read operations for /smack/load-self 2178 */ 2179 2180 static void *load_self_seq_start(struct seq_file *s, loff_t *pos) 2181 { 2182 struct task_smack *tsp = smack_cred(current_cred()); 2183 2184 return smk_seq_start(s, pos, &tsp->smk_rules); 2185 } 2186 2187 static void *load_self_seq_next(struct seq_file *s, void *v, loff_t *pos) 2188 { 2189 struct task_smack *tsp = smack_cred(current_cred()); 2190 2191 return smk_seq_next(s, v, pos, &tsp->smk_rules); 2192 } 2193 2194 static int load_self_seq_show(struct seq_file *s, void *v) 2195 { 2196 struct list_head *list = v; 2197 struct smack_rule *srp = 2198 list_entry_rcu(list, struct smack_rule, list); 2199 2200 smk_rule_show(s, srp, SMK_LABELLEN); 2201 2202 return 0; 2203 } 2204 2205 static const struct seq_operations load_self_seq_ops = { 2206 .start = load_self_seq_start, 2207 .next = load_self_seq_next, 2208 .show = load_self_seq_show, 2209 .stop = smk_seq_stop, 2210 }; 2211 2212 2213 /** 2214 * smk_open_load_self - open() for /smack/load-self2 2215 * @inode: inode structure representing file 2216 * @file: "load" file pointer 2217 * 2218 * For reading, use load_seq_* seq_file reading operations. 2219 */ 2220 static int smk_open_load_self(struct inode *inode, struct file *file) 2221 { 2222 return seq_open(file, &load_self_seq_ops); 2223 } 2224 2225 /** 2226 * smk_write_load_self - write() for /smack/load-self 2227 * @file: file pointer, not actually used 2228 * @buf: where to get the data from 2229 * @count: bytes sent 2230 * @ppos: where to start - must be 0 2231 * 2232 */ 2233 static ssize_t smk_write_load_self(struct file *file, const char __user *buf, 2234 size_t count, loff_t *ppos) 2235 { 2236 struct task_smack *tsp = smack_cred(current_cred()); 2237 2238 return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules, 2239 &tsp->smk_rules_lock, SMK_FIXED24_FMT); 2240 } 2241 2242 static const struct file_operations smk_load_self_ops = { 2243 .open = smk_open_load_self, 2244 .read = seq_read, 2245 .llseek = seq_lseek, 2246 .write = smk_write_load_self, 2247 .release = seq_release, 2248 }; 2249 2250 /** 2251 * smk_user_access - handle access check transaction 2252 * @file: file pointer 2253 * @buf: data from user space 2254 * @count: bytes sent 2255 * @ppos: where to start - must be 0 2256 */ 2257 static ssize_t smk_user_access(struct file *file, const char __user *buf, 2258 size_t count, loff_t *ppos, int format) 2259 { 2260 struct smack_parsed_rule rule; 2261 char *data; 2262 int res; 2263 2264 data = simple_transaction_get(file, buf, count); 2265 if (IS_ERR(data)) 2266 return PTR_ERR(data); 2267 2268 if (format == SMK_FIXED24_FMT) { 2269 if (count < SMK_LOADLEN) 2270 return -EINVAL; 2271 res = smk_parse_rule(data, &rule, 0); 2272 } else { 2273 /* 2274 * simple_transaction_get() returns null-terminated data 2275 */ 2276 res = smk_parse_long_rule(data, &rule, 0, 3); 2277 } 2278 2279 if (res >= 0) 2280 res = smk_access(rule.smk_subject, rule.smk_object, 2281 rule.smk_access1, NULL); 2282 else if (res != -ENOENT) 2283 return res; 2284 2285 /* 2286 * smk_access() can return a value > 0 in the "bringup" case. 2287 */ 2288 data[0] = res >= 0 ? '1' : '0'; 2289 data[1] = '\0'; 2290 2291 simple_transaction_set(file, 2); 2292 2293 if (format == SMK_FIXED24_FMT) 2294 return SMK_LOADLEN; 2295 return count; 2296 } 2297 2298 /** 2299 * smk_write_access - handle access check transaction 2300 * @file: file pointer 2301 * @buf: data from user space 2302 * @count: bytes sent 2303 * @ppos: where to start - must be 0 2304 */ 2305 static ssize_t smk_write_access(struct file *file, const char __user *buf, 2306 size_t count, loff_t *ppos) 2307 { 2308 return smk_user_access(file, buf, count, ppos, SMK_FIXED24_FMT); 2309 } 2310 2311 static const struct file_operations smk_access_ops = { 2312 .write = smk_write_access, 2313 .read = simple_transaction_read, 2314 .release = simple_transaction_release, 2315 .llseek = generic_file_llseek, 2316 }; 2317 2318 2319 /* 2320 * Seq_file read operations for /smack/load2 2321 */ 2322 2323 static int load2_seq_show(struct seq_file *s, void *v) 2324 { 2325 struct list_head *list = v; 2326 struct smack_rule *srp; 2327 struct smack_known *skp = 2328 list_entry_rcu(list, struct smack_known, list); 2329 2330 list_for_each_entry_rcu(srp, &skp->smk_rules, list) 2331 smk_rule_show(s, srp, SMK_LONGLABEL); 2332 2333 return 0; 2334 } 2335 2336 static const struct seq_operations load2_seq_ops = { 2337 .start = load2_seq_start, 2338 .next = load2_seq_next, 2339 .show = load2_seq_show, 2340 .stop = smk_seq_stop, 2341 }; 2342 2343 /** 2344 * smk_open_load2 - open() for /smack/load2 2345 * @inode: inode structure representing file 2346 * @file: "load2" file pointer 2347 * 2348 * For reading, use load2_seq_* seq_file reading operations. 2349 */ 2350 static int smk_open_load2(struct inode *inode, struct file *file) 2351 { 2352 return seq_open(file, &load2_seq_ops); 2353 } 2354 2355 /** 2356 * smk_write_load2 - write() for /smack/load2 2357 * @file: file pointer, not actually used 2358 * @buf: where to get the data from 2359 * @count: bytes sent 2360 * @ppos: where to start - must be 0 2361 * 2362 */ 2363 static ssize_t smk_write_load2(struct file *file, const char __user *buf, 2364 size_t count, loff_t *ppos) 2365 { 2366 /* 2367 * Must have privilege. 2368 */ 2369 if (!smack_privileged(CAP_MAC_ADMIN)) 2370 return -EPERM; 2371 2372 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL, 2373 SMK_LONG_FMT); 2374 } 2375 2376 static const struct file_operations smk_load2_ops = { 2377 .open = smk_open_load2, 2378 .read = seq_read, 2379 .llseek = seq_lseek, 2380 .write = smk_write_load2, 2381 .release = seq_release, 2382 }; 2383 2384 /* 2385 * Seq_file read operations for /smack/load-self2 2386 */ 2387 2388 static void *load_self2_seq_start(struct seq_file *s, loff_t *pos) 2389 { 2390 struct task_smack *tsp = smack_cred(current_cred()); 2391 2392 return smk_seq_start(s, pos, &tsp->smk_rules); 2393 } 2394 2395 static void *load_self2_seq_next(struct seq_file *s, void *v, loff_t *pos) 2396 { 2397 struct task_smack *tsp = smack_cred(current_cred()); 2398 2399 return smk_seq_next(s, v, pos, &tsp->smk_rules); 2400 } 2401 2402 static int load_self2_seq_show(struct seq_file *s, void *v) 2403 { 2404 struct list_head *list = v; 2405 struct smack_rule *srp = 2406 list_entry_rcu(list, struct smack_rule, list); 2407 2408 smk_rule_show(s, srp, SMK_LONGLABEL); 2409 2410 return 0; 2411 } 2412 2413 static const struct seq_operations load_self2_seq_ops = { 2414 .start = load_self2_seq_start, 2415 .next = load_self2_seq_next, 2416 .show = load_self2_seq_show, 2417 .stop = smk_seq_stop, 2418 }; 2419 2420 /** 2421 * smk_open_load_self2 - open() for /smack/load-self2 2422 * @inode: inode structure representing file 2423 * @file: "load" file pointer 2424 * 2425 * For reading, use load_seq_* seq_file reading operations. 2426 */ 2427 static int smk_open_load_self2(struct inode *inode, struct file *file) 2428 { 2429 return seq_open(file, &load_self2_seq_ops); 2430 } 2431 2432 /** 2433 * smk_write_load_self2 - write() for /smack/load-self2 2434 * @file: file pointer, not actually used 2435 * @buf: where to get the data from 2436 * @count: bytes sent 2437 * @ppos: where to start - must be 0 2438 * 2439 */ 2440 static ssize_t smk_write_load_self2(struct file *file, const char __user *buf, 2441 size_t count, loff_t *ppos) 2442 { 2443 struct task_smack *tsp = smack_cred(current_cred()); 2444 2445 return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules, 2446 &tsp->smk_rules_lock, SMK_LONG_FMT); 2447 } 2448 2449 static const struct file_operations smk_load_self2_ops = { 2450 .open = smk_open_load_self2, 2451 .read = seq_read, 2452 .llseek = seq_lseek, 2453 .write = smk_write_load_self2, 2454 .release = seq_release, 2455 }; 2456 2457 /** 2458 * smk_write_access2 - handle access check transaction 2459 * @file: file pointer 2460 * @buf: data from user space 2461 * @count: bytes sent 2462 * @ppos: where to start - must be 0 2463 */ 2464 static ssize_t smk_write_access2(struct file *file, const char __user *buf, 2465 size_t count, loff_t *ppos) 2466 { 2467 return smk_user_access(file, buf, count, ppos, SMK_LONG_FMT); 2468 } 2469 2470 static const struct file_operations smk_access2_ops = { 2471 .write = smk_write_access2, 2472 .read = simple_transaction_read, 2473 .release = simple_transaction_release, 2474 .llseek = generic_file_llseek, 2475 }; 2476 2477 /** 2478 * smk_write_revoke_subj - write() for /smack/revoke-subject 2479 * @file: file pointer 2480 * @buf: data from user space 2481 * @count: bytes sent 2482 * @ppos: where to start - must be 0 2483 */ 2484 static ssize_t smk_write_revoke_subj(struct file *file, const char __user *buf, 2485 size_t count, loff_t *ppos) 2486 { 2487 char *data; 2488 const char *cp; 2489 struct smack_known *skp; 2490 struct smack_rule *sp; 2491 struct list_head *rule_list; 2492 struct mutex *rule_lock; 2493 int rc = count; 2494 2495 if (*ppos != 0) 2496 return -EINVAL; 2497 2498 if (!smack_privileged(CAP_MAC_ADMIN)) 2499 return -EPERM; 2500 2501 if (count == 0 || count > SMK_LONGLABEL) 2502 return -EINVAL; 2503 2504 data = memdup_user(buf, count); 2505 if (IS_ERR(data)) 2506 return PTR_ERR(data); 2507 2508 cp = smk_parse_smack(data, count); 2509 if (IS_ERR(cp)) { 2510 rc = PTR_ERR(cp); 2511 goto out_data; 2512 } 2513 2514 skp = smk_find_entry(cp); 2515 if (skp == NULL) 2516 goto out_cp; 2517 2518 rule_list = &skp->smk_rules; 2519 rule_lock = &skp->smk_rules_lock; 2520 2521 mutex_lock(rule_lock); 2522 2523 list_for_each_entry_rcu(sp, rule_list, list) 2524 sp->smk_access = 0; 2525 2526 mutex_unlock(rule_lock); 2527 2528 out_cp: 2529 kfree(cp); 2530 out_data: 2531 kfree(data); 2532 2533 return rc; 2534 } 2535 2536 static const struct file_operations smk_revoke_subj_ops = { 2537 .write = smk_write_revoke_subj, 2538 .read = simple_transaction_read, 2539 .release = simple_transaction_release, 2540 .llseek = generic_file_llseek, 2541 }; 2542 2543 /** 2544 * smk_init_sysfs - initialize /sys/fs/smackfs 2545 * 2546 */ 2547 static int smk_init_sysfs(void) 2548 { 2549 return sysfs_create_mount_point(fs_kobj, "smackfs"); 2550 } 2551 2552 /** 2553 * smk_write_change_rule - write() for /smack/change-rule 2554 * @file: file pointer 2555 * @buf: data from user space 2556 * @count: bytes sent 2557 * @ppos: where to start - must be 0 2558 */ 2559 static ssize_t smk_write_change_rule(struct file *file, const char __user *buf, 2560 size_t count, loff_t *ppos) 2561 { 2562 /* 2563 * Must have privilege. 2564 */ 2565 if (!smack_privileged(CAP_MAC_ADMIN)) 2566 return -EPERM; 2567 2568 return smk_write_rules_list(file, buf, count, ppos, NULL, NULL, 2569 SMK_CHANGE_FMT); 2570 } 2571 2572 static const struct file_operations smk_change_rule_ops = { 2573 .write = smk_write_change_rule, 2574 .read = simple_transaction_read, 2575 .release = simple_transaction_release, 2576 .llseek = generic_file_llseek, 2577 }; 2578 2579 /** 2580 * smk_read_syslog - read() for smackfs/syslog 2581 * @filp: file pointer, not actually used 2582 * @buf: where to put the result 2583 * @cn: maximum to send along 2584 * @ppos: where to start 2585 * 2586 * Returns number of bytes read or error code, as appropriate 2587 */ 2588 static ssize_t smk_read_syslog(struct file *filp, char __user *buf, 2589 size_t cn, loff_t *ppos) 2590 { 2591 struct smack_known *skp; 2592 ssize_t rc = -EINVAL; 2593 int asize; 2594 2595 if (*ppos != 0) 2596 return 0; 2597 2598 if (smack_syslog_label == NULL) 2599 skp = &smack_known_star; 2600 else 2601 skp = smack_syslog_label; 2602 2603 asize = strlen(skp->smk_known) + 1; 2604 2605 if (cn >= asize) 2606 rc = simple_read_from_buffer(buf, cn, ppos, skp->smk_known, 2607 asize); 2608 2609 return rc; 2610 } 2611 2612 /** 2613 * smk_write_syslog - write() for smackfs/syslog 2614 * @file: file pointer, not actually used 2615 * @buf: where to get the data from 2616 * @count: bytes sent 2617 * @ppos: where to start 2618 * 2619 * Returns number of bytes written or error code, as appropriate 2620 */ 2621 static ssize_t smk_write_syslog(struct file *file, const char __user *buf, 2622 size_t count, loff_t *ppos) 2623 { 2624 char *data; 2625 struct smack_known *skp; 2626 int rc = count; 2627 2628 if (!smack_privileged(CAP_MAC_ADMIN)) 2629 return -EPERM; 2630 2631 data = memdup_user_nul(buf, count); 2632 if (IS_ERR(data)) 2633 return PTR_ERR(data); 2634 2635 skp = smk_import_entry(data, count); 2636 if (IS_ERR(skp)) 2637 rc = PTR_ERR(skp); 2638 else 2639 smack_syslog_label = skp; 2640 2641 kfree(data); 2642 return rc; 2643 } 2644 2645 static const struct file_operations smk_syslog_ops = { 2646 .read = smk_read_syslog, 2647 .write = smk_write_syslog, 2648 .llseek = default_llseek, 2649 }; 2650 2651 /* 2652 * Seq_file read operations for /smack/relabel-self 2653 */ 2654 2655 static void *relabel_self_seq_start(struct seq_file *s, loff_t *pos) 2656 { 2657 struct task_smack *tsp = smack_cred(current_cred()); 2658 2659 return smk_seq_start(s, pos, &tsp->smk_relabel); 2660 } 2661 2662 static void *relabel_self_seq_next(struct seq_file *s, void *v, loff_t *pos) 2663 { 2664 struct task_smack *tsp = smack_cred(current_cred()); 2665 2666 return smk_seq_next(s, v, pos, &tsp->smk_relabel); 2667 } 2668 2669 static int relabel_self_seq_show(struct seq_file *s, void *v) 2670 { 2671 struct list_head *list = v; 2672 struct smack_known_list_elem *sklep = 2673 list_entry(list, struct smack_known_list_elem, list); 2674 2675 seq_puts(s, sklep->smk_label->smk_known); 2676 seq_putc(s, ' '); 2677 2678 return 0; 2679 } 2680 2681 static const struct seq_operations relabel_self_seq_ops = { 2682 .start = relabel_self_seq_start, 2683 .next = relabel_self_seq_next, 2684 .show = relabel_self_seq_show, 2685 .stop = smk_seq_stop, 2686 }; 2687 2688 /** 2689 * smk_open_relabel_self - open() for /smack/relabel-self 2690 * @inode: inode structure representing file 2691 * @file: "relabel-self" file pointer 2692 * 2693 * Connect our relabel_self_seq_* operations with /smack/relabel-self 2694 * file_operations 2695 */ 2696 static int smk_open_relabel_self(struct inode *inode, struct file *file) 2697 { 2698 return seq_open(file, &relabel_self_seq_ops); 2699 } 2700 2701 /** 2702 * smk_write_relabel_self - write() for /smack/relabel-self 2703 * @file: file pointer, not actually used 2704 * @buf: where to get the data from 2705 * @count: bytes sent 2706 * @ppos: where to start - must be 0 2707 * 2708 */ 2709 static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf, 2710 size_t count, loff_t *ppos) 2711 { 2712 struct task_smack *tsp = smack_cred(current_cred()); 2713 char *data; 2714 int rc; 2715 LIST_HEAD(list_tmp); 2716 2717 /* 2718 * Must have privilege. 2719 */ 2720 if (!smack_privileged(CAP_MAC_ADMIN)) 2721 return -EPERM; 2722 2723 /* 2724 * Enough data must be present. 2725 */ 2726 if (*ppos != 0) 2727 return -EINVAL; 2728 2729 data = memdup_user_nul(buf, count); 2730 if (IS_ERR(data)) 2731 return PTR_ERR(data); 2732 2733 rc = smk_parse_label_list(data, &list_tmp); 2734 kfree(data); 2735 2736 if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) { 2737 smk_destroy_label_list(&tsp->smk_relabel); 2738 list_splice(&list_tmp, &tsp->smk_relabel); 2739 return count; 2740 } 2741 2742 smk_destroy_label_list(&list_tmp); 2743 return rc; 2744 } 2745 2746 static const struct file_operations smk_relabel_self_ops = { 2747 .open = smk_open_relabel_self, 2748 .read = seq_read, 2749 .llseek = seq_lseek, 2750 .write = smk_write_relabel_self, 2751 .release = seq_release, 2752 }; 2753 2754 /** 2755 * smk_read_ptrace - read() for /smack/ptrace 2756 * @filp: file pointer, not actually used 2757 * @buf: where to put the result 2758 * @count: maximum to send along 2759 * @ppos: where to start 2760 * 2761 * Returns number of bytes read or error code, as appropriate 2762 */ 2763 static ssize_t smk_read_ptrace(struct file *filp, char __user *buf, 2764 size_t count, loff_t *ppos) 2765 { 2766 char temp[32]; 2767 ssize_t rc; 2768 2769 if (*ppos != 0) 2770 return 0; 2771 2772 sprintf(temp, "%d\n", smack_ptrace_rule); 2773 rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); 2774 return rc; 2775 } 2776 2777 /** 2778 * smk_write_ptrace - write() for /smack/ptrace 2779 * @file: file pointer 2780 * @buf: data from user space 2781 * @count: bytes sent 2782 * @ppos: where to start - must be 0 2783 */ 2784 static ssize_t smk_write_ptrace(struct file *file, const char __user *buf, 2785 size_t count, loff_t *ppos) 2786 { 2787 char temp[32]; 2788 int i; 2789 2790 if (!smack_privileged(CAP_MAC_ADMIN)) 2791 return -EPERM; 2792 2793 if (*ppos != 0 || count >= sizeof(temp) || count == 0) 2794 return -EINVAL; 2795 2796 if (copy_from_user(temp, buf, count) != 0) 2797 return -EFAULT; 2798 2799 temp[count] = '\0'; 2800 2801 if (sscanf(temp, "%d", &i) != 1) 2802 return -EINVAL; 2803 if (i < SMACK_PTRACE_DEFAULT || i > SMACK_PTRACE_MAX) 2804 return -EINVAL; 2805 smack_ptrace_rule = i; 2806 2807 return count; 2808 } 2809 2810 static const struct file_operations smk_ptrace_ops = { 2811 .write = smk_write_ptrace, 2812 .read = smk_read_ptrace, 2813 .llseek = default_llseek, 2814 }; 2815 2816 /** 2817 * smk_fill_super - fill the smackfs superblock 2818 * @sb: the empty superblock 2819 * @data: unused 2820 * @silent: unused 2821 * 2822 * Fill in the well known entries for the smack filesystem 2823 * 2824 * Returns 0 on success, an error code on failure 2825 */ 2826 static int smk_fill_super(struct super_block *sb, void *data, int silent) 2827 { 2828 int rc; 2829 2830 static const struct tree_descr smack_files[] = { 2831 [SMK_LOAD] = { 2832 "load", &smk_load_ops, S_IRUGO|S_IWUSR}, 2833 [SMK_CIPSO] = { 2834 "cipso", &smk_cipso_ops, S_IRUGO|S_IWUSR}, 2835 [SMK_DOI] = { 2836 "doi", &smk_doi_ops, S_IRUGO|S_IWUSR}, 2837 [SMK_DIRECT] = { 2838 "direct", &smk_direct_ops, S_IRUGO|S_IWUSR}, 2839 [SMK_AMBIENT] = { 2840 "ambient", &smk_ambient_ops, S_IRUGO|S_IWUSR}, 2841 [SMK_NET4ADDR] = { 2842 "netlabel", &smk_net4addr_ops, S_IRUGO|S_IWUSR}, 2843 [SMK_ONLYCAP] = { 2844 "onlycap", &smk_onlycap_ops, S_IRUGO|S_IWUSR}, 2845 [SMK_LOGGING] = { 2846 "logging", &smk_logging_ops, S_IRUGO|S_IWUSR}, 2847 [SMK_LOAD_SELF] = { 2848 "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO}, 2849 [SMK_ACCESSES] = { 2850 "access", &smk_access_ops, S_IRUGO|S_IWUGO}, 2851 [SMK_MAPPED] = { 2852 "mapped", &smk_mapped_ops, S_IRUGO|S_IWUSR}, 2853 [SMK_LOAD2] = { 2854 "load2", &smk_load2_ops, S_IRUGO|S_IWUSR}, 2855 [SMK_LOAD_SELF2] = { 2856 "load-self2", &smk_load_self2_ops, S_IRUGO|S_IWUGO}, 2857 [SMK_ACCESS2] = { 2858 "access2", &smk_access2_ops, S_IRUGO|S_IWUGO}, 2859 [SMK_CIPSO2] = { 2860 "cipso2", &smk_cipso2_ops, S_IRUGO|S_IWUSR}, 2861 [SMK_REVOKE_SUBJ] = { 2862 "revoke-subject", &smk_revoke_subj_ops, 2863 S_IRUGO|S_IWUSR}, 2864 [SMK_CHANGE_RULE] = { 2865 "change-rule", &smk_change_rule_ops, S_IRUGO|S_IWUSR}, 2866 [SMK_SYSLOG] = { 2867 "syslog", &smk_syslog_ops, S_IRUGO|S_IWUSR}, 2868 [SMK_PTRACE] = { 2869 "ptrace", &smk_ptrace_ops, S_IRUGO|S_IWUSR}, 2870 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 2871 [SMK_UNCONFINED] = { 2872 "unconfined", &smk_unconfined_ops, S_IRUGO|S_IWUSR}, 2873 #endif 2874 #if IS_ENABLED(CONFIG_IPV6) 2875 [SMK_NET6ADDR] = { 2876 "ipv6host", &smk_net6addr_ops, S_IRUGO|S_IWUSR}, 2877 #endif /* CONFIG_IPV6 */ 2878 [SMK_RELABEL_SELF] = { 2879 "relabel-self", &smk_relabel_self_ops, 2880 S_IRUGO|S_IWUGO}, 2881 /* last one */ 2882 {""} 2883 }; 2884 2885 rc = simple_fill_super(sb, SMACK_MAGIC, smack_files); 2886 if (rc != 0) { 2887 printk(KERN_ERR "%s failed %d while creating inodes\n", 2888 __func__, rc); 2889 return rc; 2890 } 2891 2892 return 0; 2893 } 2894 2895 /** 2896 * smk_mount - get the smackfs superblock 2897 * @fs_type: passed along without comment 2898 * @flags: passed along without comment 2899 * @dev_name: passed along without comment 2900 * @data: passed along without comment 2901 * 2902 * Just passes everything along. 2903 * 2904 * Returns what the lower level code does. 2905 */ 2906 static struct dentry *smk_mount(struct file_system_type *fs_type, 2907 int flags, const char *dev_name, void *data) 2908 { 2909 return mount_single(fs_type, flags, data, smk_fill_super); 2910 } 2911 2912 static struct file_system_type smk_fs_type = { 2913 .name = "smackfs", 2914 .mount = smk_mount, 2915 .kill_sb = kill_litter_super, 2916 }; 2917 2918 static struct vfsmount *smackfs_mount; 2919 2920 static int __init smk_preset_netlabel(struct smack_known *skp) 2921 { 2922 skp->smk_netlabel.domain = skp->smk_known; 2923 skp->smk_netlabel.flags = 2924 NETLBL_SECATTR_DOMAIN | NETLBL_SECATTR_MLS_LVL; 2925 return smk_netlbl_mls(smack_cipso_direct, skp->smk_known, 2926 &skp->smk_netlabel, strlen(skp->smk_known)); 2927 } 2928 2929 /** 2930 * init_smk_fs - get the smackfs superblock 2931 * 2932 * register the smackfs 2933 * 2934 * Do not register smackfs if Smack wasn't enabled 2935 * on boot. We can not put this method normally under the 2936 * smack_init() code path since the security subsystem get 2937 * initialized before the vfs caches. 2938 * 2939 * Returns true if we were not chosen on boot or if 2940 * we were chosen and filesystem registration succeeded. 2941 */ 2942 static int __init init_smk_fs(void) 2943 { 2944 int err; 2945 int rc; 2946 2947 if (smack_enabled == 0) 2948 return 0; 2949 2950 err = smk_init_sysfs(); 2951 if (err) 2952 printk(KERN_ERR "smackfs: sysfs mountpoint problem.\n"); 2953 2954 err = register_filesystem(&smk_fs_type); 2955 if (!err) { 2956 smackfs_mount = kern_mount(&smk_fs_type); 2957 if (IS_ERR(smackfs_mount)) { 2958 printk(KERN_ERR "smackfs: could not mount!\n"); 2959 err = PTR_ERR(smackfs_mount); 2960 smackfs_mount = NULL; 2961 } 2962 } 2963 2964 smk_cipso_doi(); 2965 smk_unlbl_ambient(NULL); 2966 2967 rc = smk_preset_netlabel(&smack_known_floor); 2968 if (err == 0 && rc < 0) 2969 err = rc; 2970 rc = smk_preset_netlabel(&smack_known_hat); 2971 if (err == 0 && rc < 0) 2972 err = rc; 2973 rc = smk_preset_netlabel(&smack_known_huh); 2974 if (err == 0 && rc < 0) 2975 err = rc; 2976 rc = smk_preset_netlabel(&smack_known_star); 2977 if (err == 0 && rc < 0) 2978 err = rc; 2979 rc = smk_preset_netlabel(&smack_known_web); 2980 if (err == 0 && rc < 0) 2981 err = rc; 2982 2983 return err; 2984 } 2985 2986 __initcall(init_smk_fs); 2987