1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Updated: Karl MacMillan <kmacmillan@tresys.com> 3 * 4 * Added conditional policy language extensions 5 * 6 * Updated: Hewlett-Packard <paul@paul-moore.com> 7 * 8 * Added support for the policy capability bitmap 9 * 10 * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. 11 * Copyright (C) 2003 - 2004 Tresys Technology, LLC 12 * Copyright (C) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com> 13 */ 14 15 #include <linux/kernel.h> 16 #include <linux/pagemap.h> 17 #include <linux/slab.h> 18 #include <linux/vmalloc.h> 19 #include <linux/fs.h> 20 #include <linux/fs_context.h> 21 #include <linux/mount.h> 22 #include <linux/mutex.h> 23 #include <linux/init.h> 24 #include <linux/string.h> 25 #include <linux/security.h> 26 #include <linux/major.h> 27 #include <linux/seq_file.h> 28 #include <linux/percpu.h> 29 #include <linux/audit.h> 30 #include <linux/uaccess.h> 31 #include <linux/kobject.h> 32 #include <linux/ctype.h> 33 34 /* selinuxfs pseudo filesystem for exporting the security policy API. 35 Based on the proc code and the fs/nfsd/nfsctl.c code. */ 36 37 #include "flask.h" 38 #include "avc.h" 39 #include "avc_ss.h" 40 #include "security.h" 41 #include "objsec.h" 42 #include "conditional.h" 43 44 enum sel_inos { 45 SEL_ROOT_INO = 2, 46 SEL_LOAD, /* load policy */ 47 SEL_ENFORCE, /* get or set enforcing status */ 48 SEL_CONTEXT, /* validate context */ 49 SEL_ACCESS, /* compute access decision */ 50 SEL_CREATE, /* compute create labeling decision */ 51 SEL_RELABEL, /* compute relabeling decision */ 52 SEL_USER, /* compute reachable user contexts */ 53 SEL_POLICYVERS, /* return policy version for this kernel */ 54 SEL_COMMIT_BOOLS, /* commit new boolean values */ 55 SEL_MLS, /* return if MLS policy is enabled */ 56 SEL_DISABLE, /* disable SELinux until next reboot */ 57 SEL_MEMBER, /* compute polyinstantiation membership decision */ 58 SEL_CHECKREQPROT, /* check requested protection, not kernel-applied one */ 59 SEL_COMPAT_NET, /* whether to use old compat network packet controls */ 60 SEL_REJECT_UNKNOWN, /* export unknown reject handling to userspace */ 61 SEL_DENY_UNKNOWN, /* export unknown deny handling to userspace */ 62 SEL_STATUS, /* export current status using mmap() */ 63 SEL_POLICY, /* allow userspace to read the in kernel policy */ 64 SEL_VALIDATE_TRANS, /* compute validatetrans decision */ 65 SEL_INO_NEXT, /* The next inode number to use */ 66 }; 67 68 struct selinux_fs_info { 69 struct dentry *bool_dir; 70 unsigned int bool_num; 71 char **bool_pending_names; 72 unsigned int *bool_pending_values; 73 struct dentry *class_dir; 74 unsigned long last_class_ino; 75 bool policy_opened; 76 struct dentry *policycap_dir; 77 struct mutex mutex; 78 unsigned long last_ino; 79 struct selinux_state *state; 80 struct super_block *sb; 81 }; 82 83 static int selinux_fs_info_create(struct super_block *sb) 84 { 85 struct selinux_fs_info *fsi; 86 87 fsi = kzalloc(sizeof(*fsi), GFP_KERNEL); 88 if (!fsi) 89 return -ENOMEM; 90 91 mutex_init(&fsi->mutex); 92 fsi->last_ino = SEL_INO_NEXT - 1; 93 fsi->state = &selinux_state; 94 fsi->sb = sb; 95 sb->s_fs_info = fsi; 96 return 0; 97 } 98 99 static void selinux_fs_info_free(struct super_block *sb) 100 { 101 struct selinux_fs_info *fsi = sb->s_fs_info; 102 int i; 103 104 if (fsi) { 105 for (i = 0; i < fsi->bool_num; i++) 106 kfree(fsi->bool_pending_names[i]); 107 kfree(fsi->bool_pending_names); 108 kfree(fsi->bool_pending_values); 109 } 110 kfree(sb->s_fs_info); 111 sb->s_fs_info = NULL; 112 } 113 114 #define SEL_INITCON_INO_OFFSET 0x01000000 115 #define SEL_BOOL_INO_OFFSET 0x02000000 116 #define SEL_CLASS_INO_OFFSET 0x04000000 117 #define SEL_POLICYCAP_INO_OFFSET 0x08000000 118 #define SEL_INO_MASK 0x00ffffff 119 120 #define TMPBUFLEN 12 121 static ssize_t sel_read_enforce(struct file *filp, char __user *buf, 122 size_t count, loff_t *ppos) 123 { 124 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 125 char tmpbuf[TMPBUFLEN]; 126 ssize_t length; 127 128 length = scnprintf(tmpbuf, TMPBUFLEN, "%d", 129 enforcing_enabled(fsi->state)); 130 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 131 } 132 133 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP 134 static ssize_t sel_write_enforce(struct file *file, const char __user *buf, 135 size_t count, loff_t *ppos) 136 137 { 138 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 139 struct selinux_state *state = fsi->state; 140 char *page = NULL; 141 ssize_t length; 142 int old_value, new_value; 143 144 if (count >= PAGE_SIZE) 145 return -ENOMEM; 146 147 /* No partial writes. */ 148 if (*ppos != 0) 149 return -EINVAL; 150 151 page = memdup_user_nul(buf, count); 152 if (IS_ERR(page)) 153 return PTR_ERR(page); 154 155 length = -EINVAL; 156 if (sscanf(page, "%d", &new_value) != 1) 157 goto out; 158 159 new_value = !!new_value; 160 161 old_value = enforcing_enabled(state); 162 if (new_value != old_value) { 163 length = avc_has_perm(&selinux_state, 164 current_sid(), SECINITSID_SECURITY, 165 SECCLASS_SECURITY, SECURITY__SETENFORCE, 166 NULL); 167 if (length) 168 goto out; 169 audit_log(audit_context(), GFP_KERNEL, AUDIT_MAC_STATUS, 170 "enforcing=%d old_enforcing=%d auid=%u ses=%u" 171 " enabled=1 old-enabled=1 lsm=selinux res=1", 172 new_value, old_value, 173 from_kuid(&init_user_ns, audit_get_loginuid(current)), 174 audit_get_sessionid(current)); 175 enforcing_set(state, new_value); 176 if (new_value) 177 avc_ss_reset(state->avc, 0); 178 selnl_notify_setenforce(new_value); 179 selinux_status_update_setenforce(state, new_value); 180 if (!new_value) 181 call_blocking_lsm_notifier(LSM_POLICY_CHANGE, NULL); 182 } 183 length = count; 184 out: 185 kfree(page); 186 return length; 187 } 188 #else 189 #define sel_write_enforce NULL 190 #endif 191 192 static const struct file_operations sel_enforce_ops = { 193 .read = sel_read_enforce, 194 .write = sel_write_enforce, 195 .llseek = generic_file_llseek, 196 }; 197 198 static ssize_t sel_read_handle_unknown(struct file *filp, char __user *buf, 199 size_t count, loff_t *ppos) 200 { 201 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 202 struct selinux_state *state = fsi->state; 203 char tmpbuf[TMPBUFLEN]; 204 ssize_t length; 205 ino_t ino = file_inode(filp)->i_ino; 206 int handle_unknown = (ino == SEL_REJECT_UNKNOWN) ? 207 security_get_reject_unknown(state) : 208 !security_get_allow_unknown(state); 209 210 length = scnprintf(tmpbuf, TMPBUFLEN, "%d", handle_unknown); 211 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 212 } 213 214 static const struct file_operations sel_handle_unknown_ops = { 215 .read = sel_read_handle_unknown, 216 .llseek = generic_file_llseek, 217 }; 218 219 static int sel_open_handle_status(struct inode *inode, struct file *filp) 220 { 221 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 222 struct page *status = selinux_kernel_status_page(fsi->state); 223 224 if (!status) 225 return -ENOMEM; 226 227 filp->private_data = status; 228 229 return 0; 230 } 231 232 static ssize_t sel_read_handle_status(struct file *filp, char __user *buf, 233 size_t count, loff_t *ppos) 234 { 235 struct page *status = filp->private_data; 236 237 BUG_ON(!status); 238 239 return simple_read_from_buffer(buf, count, ppos, 240 page_address(status), 241 sizeof(struct selinux_kernel_status)); 242 } 243 244 static int sel_mmap_handle_status(struct file *filp, 245 struct vm_area_struct *vma) 246 { 247 struct page *status = filp->private_data; 248 unsigned long size = vma->vm_end - vma->vm_start; 249 250 BUG_ON(!status); 251 252 /* only allows one page from the head */ 253 if (vma->vm_pgoff > 0 || size != PAGE_SIZE) 254 return -EIO; 255 /* disallow writable mapping */ 256 if (vma->vm_flags & VM_WRITE) 257 return -EPERM; 258 /* disallow mprotect() turns it into writable */ 259 vma->vm_flags &= ~VM_MAYWRITE; 260 261 return remap_pfn_range(vma, vma->vm_start, 262 page_to_pfn(status), 263 size, vma->vm_page_prot); 264 } 265 266 static const struct file_operations sel_handle_status_ops = { 267 .open = sel_open_handle_status, 268 .read = sel_read_handle_status, 269 .mmap = sel_mmap_handle_status, 270 .llseek = generic_file_llseek, 271 }; 272 273 #ifdef CONFIG_SECURITY_SELINUX_DISABLE 274 static ssize_t sel_write_disable(struct file *file, const char __user *buf, 275 size_t count, loff_t *ppos) 276 277 { 278 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 279 char *page; 280 ssize_t length; 281 int new_value; 282 int enforcing; 283 284 /* NOTE: we are now officially considering runtime disable as 285 * deprecated, and using it will become increasingly painful 286 * (e.g. sleeping/blocking) as we progress through future 287 * kernel releases until eventually it is removed 288 */ 289 pr_err("SELinux: Runtime disable is deprecated, use selinux=0 on the kernel cmdline.\n"); 290 291 if (count >= PAGE_SIZE) 292 return -ENOMEM; 293 294 /* No partial writes. */ 295 if (*ppos != 0) 296 return -EINVAL; 297 298 page = memdup_user_nul(buf, count); 299 if (IS_ERR(page)) 300 return PTR_ERR(page); 301 302 length = -EINVAL; 303 if (sscanf(page, "%d", &new_value) != 1) 304 goto out; 305 306 if (new_value) { 307 enforcing = enforcing_enabled(fsi->state); 308 length = selinux_disable(fsi->state); 309 if (length) 310 goto out; 311 audit_log(audit_context(), GFP_KERNEL, AUDIT_MAC_STATUS, 312 "enforcing=%d old_enforcing=%d auid=%u ses=%u" 313 " enabled=0 old-enabled=1 lsm=selinux res=1", 314 enforcing, enforcing, 315 from_kuid(&init_user_ns, audit_get_loginuid(current)), 316 audit_get_sessionid(current)); 317 } 318 319 length = count; 320 out: 321 kfree(page); 322 return length; 323 } 324 #else 325 #define sel_write_disable NULL 326 #endif 327 328 static const struct file_operations sel_disable_ops = { 329 .write = sel_write_disable, 330 .llseek = generic_file_llseek, 331 }; 332 333 static ssize_t sel_read_policyvers(struct file *filp, char __user *buf, 334 size_t count, loff_t *ppos) 335 { 336 char tmpbuf[TMPBUFLEN]; 337 ssize_t length; 338 339 length = scnprintf(tmpbuf, TMPBUFLEN, "%u", POLICYDB_VERSION_MAX); 340 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 341 } 342 343 static const struct file_operations sel_policyvers_ops = { 344 .read = sel_read_policyvers, 345 .llseek = generic_file_llseek, 346 }; 347 348 /* declaration for sel_write_load */ 349 static int sel_make_bools(struct selinux_fs_info *fsi); 350 static int sel_make_classes(struct selinux_fs_info *fsi); 351 static int sel_make_policycap(struct selinux_fs_info *fsi); 352 353 /* declaration for sel_make_class_dirs */ 354 static struct dentry *sel_make_dir(struct dentry *dir, const char *name, 355 unsigned long *ino); 356 357 static ssize_t sel_read_mls(struct file *filp, char __user *buf, 358 size_t count, loff_t *ppos) 359 { 360 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 361 char tmpbuf[TMPBUFLEN]; 362 ssize_t length; 363 364 length = scnprintf(tmpbuf, TMPBUFLEN, "%d", 365 security_mls_enabled(fsi->state)); 366 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 367 } 368 369 static const struct file_operations sel_mls_ops = { 370 .read = sel_read_mls, 371 .llseek = generic_file_llseek, 372 }; 373 374 struct policy_load_memory { 375 size_t len; 376 void *data; 377 }; 378 379 static int sel_open_policy(struct inode *inode, struct file *filp) 380 { 381 struct selinux_fs_info *fsi = inode->i_sb->s_fs_info; 382 struct selinux_state *state = fsi->state; 383 struct policy_load_memory *plm = NULL; 384 int rc; 385 386 BUG_ON(filp->private_data); 387 388 mutex_lock(&fsi->mutex); 389 390 rc = avc_has_perm(&selinux_state, 391 current_sid(), SECINITSID_SECURITY, 392 SECCLASS_SECURITY, SECURITY__READ_POLICY, NULL); 393 if (rc) 394 goto err; 395 396 rc = -EBUSY; 397 if (fsi->policy_opened) 398 goto err; 399 400 rc = -ENOMEM; 401 plm = kzalloc(sizeof(*plm), GFP_KERNEL); 402 if (!plm) 403 goto err; 404 405 if (i_size_read(inode) != security_policydb_len(state)) { 406 inode_lock(inode); 407 i_size_write(inode, security_policydb_len(state)); 408 inode_unlock(inode); 409 } 410 411 rc = security_read_policy(state, &plm->data, &plm->len); 412 if (rc) 413 goto err; 414 415 fsi->policy_opened = 1; 416 417 filp->private_data = plm; 418 419 mutex_unlock(&fsi->mutex); 420 421 return 0; 422 err: 423 mutex_unlock(&fsi->mutex); 424 425 if (plm) 426 vfree(plm->data); 427 kfree(plm); 428 return rc; 429 } 430 431 static int sel_release_policy(struct inode *inode, struct file *filp) 432 { 433 struct selinux_fs_info *fsi = inode->i_sb->s_fs_info; 434 struct policy_load_memory *plm = filp->private_data; 435 436 BUG_ON(!plm); 437 438 fsi->policy_opened = 0; 439 440 vfree(plm->data); 441 kfree(plm); 442 443 return 0; 444 } 445 446 static ssize_t sel_read_policy(struct file *filp, char __user *buf, 447 size_t count, loff_t *ppos) 448 { 449 struct policy_load_memory *plm = filp->private_data; 450 int ret; 451 452 ret = avc_has_perm(&selinux_state, 453 current_sid(), SECINITSID_SECURITY, 454 SECCLASS_SECURITY, SECURITY__READ_POLICY, NULL); 455 if (ret) 456 return ret; 457 458 return simple_read_from_buffer(buf, count, ppos, plm->data, plm->len); 459 } 460 461 static vm_fault_t sel_mmap_policy_fault(struct vm_fault *vmf) 462 { 463 struct policy_load_memory *plm = vmf->vma->vm_file->private_data; 464 unsigned long offset; 465 struct page *page; 466 467 if (vmf->flags & (FAULT_FLAG_MKWRITE | FAULT_FLAG_WRITE)) 468 return VM_FAULT_SIGBUS; 469 470 offset = vmf->pgoff << PAGE_SHIFT; 471 if (offset >= roundup(plm->len, PAGE_SIZE)) 472 return VM_FAULT_SIGBUS; 473 474 page = vmalloc_to_page(plm->data + offset); 475 get_page(page); 476 477 vmf->page = page; 478 479 return 0; 480 } 481 482 static const struct vm_operations_struct sel_mmap_policy_ops = { 483 .fault = sel_mmap_policy_fault, 484 .page_mkwrite = sel_mmap_policy_fault, 485 }; 486 487 static int sel_mmap_policy(struct file *filp, struct vm_area_struct *vma) 488 { 489 if (vma->vm_flags & VM_SHARED) { 490 /* do not allow mprotect to make mapping writable */ 491 vma->vm_flags &= ~VM_MAYWRITE; 492 493 if (vma->vm_flags & VM_WRITE) 494 return -EACCES; 495 } 496 497 vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP; 498 vma->vm_ops = &sel_mmap_policy_ops; 499 500 return 0; 501 } 502 503 static const struct file_operations sel_policy_ops = { 504 .open = sel_open_policy, 505 .read = sel_read_policy, 506 .mmap = sel_mmap_policy, 507 .release = sel_release_policy, 508 .llseek = generic_file_llseek, 509 }; 510 511 static int sel_make_policy_nodes(struct selinux_fs_info *fsi) 512 { 513 int ret; 514 515 ret = sel_make_bools(fsi); 516 if (ret) { 517 pr_err("SELinux: failed to load policy booleans\n"); 518 return ret; 519 } 520 521 ret = sel_make_classes(fsi); 522 if (ret) { 523 pr_err("SELinux: failed to load policy classes\n"); 524 return ret; 525 } 526 527 ret = sel_make_policycap(fsi); 528 if (ret) { 529 pr_err("SELinux: failed to load policy capabilities\n"); 530 return ret; 531 } 532 533 return 0; 534 } 535 536 static ssize_t sel_write_load(struct file *file, const char __user *buf, 537 size_t count, loff_t *ppos) 538 539 { 540 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 541 ssize_t length; 542 void *data = NULL; 543 544 mutex_lock(&fsi->mutex); 545 546 length = avc_has_perm(&selinux_state, 547 current_sid(), SECINITSID_SECURITY, 548 SECCLASS_SECURITY, SECURITY__LOAD_POLICY, NULL); 549 if (length) 550 goto out; 551 552 /* No partial writes. */ 553 length = -EINVAL; 554 if (*ppos != 0) 555 goto out; 556 557 length = -ENOMEM; 558 data = vmalloc(count); 559 if (!data) 560 goto out; 561 562 length = -EFAULT; 563 if (copy_from_user(data, buf, count) != 0) 564 goto out; 565 566 length = security_load_policy(fsi->state, data, count); 567 if (length) { 568 pr_warn_ratelimited("SELinux: failed to load policy\n"); 569 goto out; 570 } 571 572 length = sel_make_policy_nodes(fsi); 573 if (length) 574 goto out1; 575 576 length = count; 577 578 out1: 579 audit_log(audit_context(), GFP_KERNEL, AUDIT_MAC_POLICY_LOAD, 580 "auid=%u ses=%u lsm=selinux res=1", 581 from_kuid(&init_user_ns, audit_get_loginuid(current)), 582 audit_get_sessionid(current)); 583 out: 584 mutex_unlock(&fsi->mutex); 585 vfree(data); 586 return length; 587 } 588 589 static const struct file_operations sel_load_ops = { 590 .write = sel_write_load, 591 .llseek = generic_file_llseek, 592 }; 593 594 static ssize_t sel_write_context(struct file *file, char *buf, size_t size) 595 { 596 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 597 struct selinux_state *state = fsi->state; 598 char *canon = NULL; 599 u32 sid, len; 600 ssize_t length; 601 602 length = avc_has_perm(&selinux_state, 603 current_sid(), SECINITSID_SECURITY, 604 SECCLASS_SECURITY, SECURITY__CHECK_CONTEXT, NULL); 605 if (length) 606 goto out; 607 608 length = security_context_to_sid(state, buf, size, &sid, GFP_KERNEL); 609 if (length) 610 goto out; 611 612 length = security_sid_to_context(state, sid, &canon, &len); 613 if (length) 614 goto out; 615 616 length = -ERANGE; 617 if (len > SIMPLE_TRANSACTION_LIMIT) { 618 pr_err("SELinux: %s: context size (%u) exceeds " 619 "payload max\n", __func__, len); 620 goto out; 621 } 622 623 memcpy(buf, canon, len); 624 length = len; 625 out: 626 kfree(canon); 627 return length; 628 } 629 630 static ssize_t sel_read_checkreqprot(struct file *filp, char __user *buf, 631 size_t count, loff_t *ppos) 632 { 633 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 634 char tmpbuf[TMPBUFLEN]; 635 ssize_t length; 636 637 length = scnprintf(tmpbuf, TMPBUFLEN, "%u", fsi->state->checkreqprot); 638 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 639 } 640 641 static ssize_t sel_write_checkreqprot(struct file *file, const char __user *buf, 642 size_t count, loff_t *ppos) 643 { 644 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 645 char *page; 646 ssize_t length; 647 unsigned int new_value; 648 649 length = avc_has_perm(&selinux_state, 650 current_sid(), SECINITSID_SECURITY, 651 SECCLASS_SECURITY, SECURITY__SETCHECKREQPROT, 652 NULL); 653 if (length) 654 return length; 655 656 if (count >= PAGE_SIZE) 657 return -ENOMEM; 658 659 /* No partial writes. */ 660 if (*ppos != 0) 661 return -EINVAL; 662 663 page = memdup_user_nul(buf, count); 664 if (IS_ERR(page)) 665 return PTR_ERR(page); 666 667 length = -EINVAL; 668 if (sscanf(page, "%u", &new_value) != 1) 669 goto out; 670 671 if (new_value) { 672 char comm[sizeof(current->comm)]; 673 674 memcpy(comm, current->comm, sizeof(comm)); 675 pr_warn_once("SELinux: %s (%d) set checkreqprot to 1. This is deprecated and will be rejected in a future kernel release.\n", 676 comm, current->pid); 677 } 678 679 fsi->state->checkreqprot = new_value ? 1 : 0; 680 length = count; 681 out: 682 kfree(page); 683 return length; 684 } 685 static const struct file_operations sel_checkreqprot_ops = { 686 .read = sel_read_checkreqprot, 687 .write = sel_write_checkreqprot, 688 .llseek = generic_file_llseek, 689 }; 690 691 static ssize_t sel_write_validatetrans(struct file *file, 692 const char __user *buf, 693 size_t count, loff_t *ppos) 694 { 695 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 696 struct selinux_state *state = fsi->state; 697 char *oldcon = NULL, *newcon = NULL, *taskcon = NULL; 698 char *req = NULL; 699 u32 osid, nsid, tsid; 700 u16 tclass; 701 int rc; 702 703 rc = avc_has_perm(&selinux_state, 704 current_sid(), SECINITSID_SECURITY, 705 SECCLASS_SECURITY, SECURITY__VALIDATE_TRANS, NULL); 706 if (rc) 707 goto out; 708 709 rc = -ENOMEM; 710 if (count >= PAGE_SIZE) 711 goto out; 712 713 /* No partial writes. */ 714 rc = -EINVAL; 715 if (*ppos != 0) 716 goto out; 717 718 req = memdup_user_nul(buf, count); 719 if (IS_ERR(req)) { 720 rc = PTR_ERR(req); 721 req = NULL; 722 goto out; 723 } 724 725 rc = -ENOMEM; 726 oldcon = kzalloc(count + 1, GFP_KERNEL); 727 if (!oldcon) 728 goto out; 729 730 newcon = kzalloc(count + 1, GFP_KERNEL); 731 if (!newcon) 732 goto out; 733 734 taskcon = kzalloc(count + 1, GFP_KERNEL); 735 if (!taskcon) 736 goto out; 737 738 rc = -EINVAL; 739 if (sscanf(req, "%s %s %hu %s", oldcon, newcon, &tclass, taskcon) != 4) 740 goto out; 741 742 rc = security_context_str_to_sid(state, oldcon, &osid, GFP_KERNEL); 743 if (rc) 744 goto out; 745 746 rc = security_context_str_to_sid(state, newcon, &nsid, GFP_KERNEL); 747 if (rc) 748 goto out; 749 750 rc = security_context_str_to_sid(state, taskcon, &tsid, GFP_KERNEL); 751 if (rc) 752 goto out; 753 754 rc = security_validate_transition_user(state, osid, nsid, tsid, tclass); 755 if (!rc) 756 rc = count; 757 out: 758 kfree(req); 759 kfree(oldcon); 760 kfree(newcon); 761 kfree(taskcon); 762 return rc; 763 } 764 765 static const struct file_operations sel_transition_ops = { 766 .write = sel_write_validatetrans, 767 .llseek = generic_file_llseek, 768 }; 769 770 /* 771 * Remaining nodes use transaction based IO methods like nfsd/nfsctl.c 772 */ 773 static ssize_t sel_write_access(struct file *file, char *buf, size_t size); 774 static ssize_t sel_write_create(struct file *file, char *buf, size_t size); 775 static ssize_t sel_write_relabel(struct file *file, char *buf, size_t size); 776 static ssize_t sel_write_user(struct file *file, char *buf, size_t size); 777 static ssize_t sel_write_member(struct file *file, char *buf, size_t size); 778 779 static ssize_t (*const write_op[])(struct file *, char *, size_t) = { 780 [SEL_ACCESS] = sel_write_access, 781 [SEL_CREATE] = sel_write_create, 782 [SEL_RELABEL] = sel_write_relabel, 783 [SEL_USER] = sel_write_user, 784 [SEL_MEMBER] = sel_write_member, 785 [SEL_CONTEXT] = sel_write_context, 786 }; 787 788 static ssize_t selinux_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos) 789 { 790 ino_t ino = file_inode(file)->i_ino; 791 char *data; 792 ssize_t rv; 793 794 if (ino >= ARRAY_SIZE(write_op) || !write_op[ino]) 795 return -EINVAL; 796 797 data = simple_transaction_get(file, buf, size); 798 if (IS_ERR(data)) 799 return PTR_ERR(data); 800 801 rv = write_op[ino](file, data, size); 802 if (rv > 0) { 803 simple_transaction_set(file, rv); 804 rv = size; 805 } 806 return rv; 807 } 808 809 static const struct file_operations transaction_ops = { 810 .write = selinux_transaction_write, 811 .read = simple_transaction_read, 812 .release = simple_transaction_release, 813 .llseek = generic_file_llseek, 814 }; 815 816 /* 817 * payload - write methods 818 * If the method has a response, the response should be put in buf, 819 * and the length returned. Otherwise return 0 or and -error. 820 */ 821 822 static ssize_t sel_write_access(struct file *file, char *buf, size_t size) 823 { 824 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 825 struct selinux_state *state = fsi->state; 826 char *scon = NULL, *tcon = NULL; 827 u32 ssid, tsid; 828 u16 tclass; 829 struct av_decision avd; 830 ssize_t length; 831 832 length = avc_has_perm(&selinux_state, 833 current_sid(), SECINITSID_SECURITY, 834 SECCLASS_SECURITY, SECURITY__COMPUTE_AV, NULL); 835 if (length) 836 goto out; 837 838 length = -ENOMEM; 839 scon = kzalloc(size + 1, GFP_KERNEL); 840 if (!scon) 841 goto out; 842 843 length = -ENOMEM; 844 tcon = kzalloc(size + 1, GFP_KERNEL); 845 if (!tcon) 846 goto out; 847 848 length = -EINVAL; 849 if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) 850 goto out; 851 852 length = security_context_str_to_sid(state, scon, &ssid, GFP_KERNEL); 853 if (length) 854 goto out; 855 856 length = security_context_str_to_sid(state, tcon, &tsid, GFP_KERNEL); 857 if (length) 858 goto out; 859 860 security_compute_av_user(state, ssid, tsid, tclass, &avd); 861 862 length = scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, 863 "%x %x %x %x %u %x", 864 avd.allowed, 0xffffffff, 865 avd.auditallow, avd.auditdeny, 866 avd.seqno, avd.flags); 867 out: 868 kfree(tcon); 869 kfree(scon); 870 return length; 871 } 872 873 static ssize_t sel_write_create(struct file *file, char *buf, size_t size) 874 { 875 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 876 struct selinux_state *state = fsi->state; 877 char *scon = NULL, *tcon = NULL; 878 char *namebuf = NULL, *objname = NULL; 879 u32 ssid, tsid, newsid; 880 u16 tclass; 881 ssize_t length; 882 char *newcon = NULL; 883 u32 len; 884 int nargs; 885 886 length = avc_has_perm(&selinux_state, 887 current_sid(), SECINITSID_SECURITY, 888 SECCLASS_SECURITY, SECURITY__COMPUTE_CREATE, 889 NULL); 890 if (length) 891 goto out; 892 893 length = -ENOMEM; 894 scon = kzalloc(size + 1, GFP_KERNEL); 895 if (!scon) 896 goto out; 897 898 length = -ENOMEM; 899 tcon = kzalloc(size + 1, GFP_KERNEL); 900 if (!tcon) 901 goto out; 902 903 length = -ENOMEM; 904 namebuf = kzalloc(size + 1, GFP_KERNEL); 905 if (!namebuf) 906 goto out; 907 908 length = -EINVAL; 909 nargs = sscanf(buf, "%s %s %hu %s", scon, tcon, &tclass, namebuf); 910 if (nargs < 3 || nargs > 4) 911 goto out; 912 if (nargs == 4) { 913 /* 914 * If and when the name of new object to be queried contains 915 * either whitespace or multibyte characters, they shall be 916 * encoded based on the percentage-encoding rule. 917 * If not encoded, the sscanf logic picks up only left-half 918 * of the supplied name; splitted by a whitespace unexpectedly. 919 */ 920 char *r, *w; 921 int c1, c2; 922 923 r = w = namebuf; 924 do { 925 c1 = *r++; 926 if (c1 == '+') 927 c1 = ' '; 928 else if (c1 == '%') { 929 c1 = hex_to_bin(*r++); 930 if (c1 < 0) 931 goto out; 932 c2 = hex_to_bin(*r++); 933 if (c2 < 0) 934 goto out; 935 c1 = (c1 << 4) | c2; 936 } 937 *w++ = c1; 938 } while (c1 != '\0'); 939 940 objname = namebuf; 941 } 942 943 length = security_context_str_to_sid(state, scon, &ssid, GFP_KERNEL); 944 if (length) 945 goto out; 946 947 length = security_context_str_to_sid(state, tcon, &tsid, GFP_KERNEL); 948 if (length) 949 goto out; 950 951 length = security_transition_sid_user(state, ssid, tsid, tclass, 952 objname, &newsid); 953 if (length) 954 goto out; 955 956 length = security_sid_to_context(state, newsid, &newcon, &len); 957 if (length) 958 goto out; 959 960 length = -ERANGE; 961 if (len > SIMPLE_TRANSACTION_LIMIT) { 962 pr_err("SELinux: %s: context size (%u) exceeds " 963 "payload max\n", __func__, len); 964 goto out; 965 } 966 967 memcpy(buf, newcon, len); 968 length = len; 969 out: 970 kfree(newcon); 971 kfree(namebuf); 972 kfree(tcon); 973 kfree(scon); 974 return length; 975 } 976 977 static ssize_t sel_write_relabel(struct file *file, char *buf, size_t size) 978 { 979 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 980 struct selinux_state *state = fsi->state; 981 char *scon = NULL, *tcon = NULL; 982 u32 ssid, tsid, newsid; 983 u16 tclass; 984 ssize_t length; 985 char *newcon = NULL; 986 u32 len; 987 988 length = avc_has_perm(&selinux_state, 989 current_sid(), SECINITSID_SECURITY, 990 SECCLASS_SECURITY, SECURITY__COMPUTE_RELABEL, 991 NULL); 992 if (length) 993 goto out; 994 995 length = -ENOMEM; 996 scon = kzalloc(size + 1, GFP_KERNEL); 997 if (!scon) 998 goto out; 999 1000 length = -ENOMEM; 1001 tcon = kzalloc(size + 1, GFP_KERNEL); 1002 if (!tcon) 1003 goto out; 1004 1005 length = -EINVAL; 1006 if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) 1007 goto out; 1008 1009 length = security_context_str_to_sid(state, scon, &ssid, GFP_KERNEL); 1010 if (length) 1011 goto out; 1012 1013 length = security_context_str_to_sid(state, tcon, &tsid, GFP_KERNEL); 1014 if (length) 1015 goto out; 1016 1017 length = security_change_sid(state, ssid, tsid, tclass, &newsid); 1018 if (length) 1019 goto out; 1020 1021 length = security_sid_to_context(state, newsid, &newcon, &len); 1022 if (length) 1023 goto out; 1024 1025 length = -ERANGE; 1026 if (len > SIMPLE_TRANSACTION_LIMIT) 1027 goto out; 1028 1029 memcpy(buf, newcon, len); 1030 length = len; 1031 out: 1032 kfree(newcon); 1033 kfree(tcon); 1034 kfree(scon); 1035 return length; 1036 } 1037 1038 static ssize_t sel_write_user(struct file *file, char *buf, size_t size) 1039 { 1040 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 1041 struct selinux_state *state = fsi->state; 1042 char *con = NULL, *user = NULL, *ptr; 1043 u32 sid, *sids = NULL; 1044 ssize_t length; 1045 char *newcon; 1046 int i, rc; 1047 u32 len, nsids; 1048 1049 length = avc_has_perm(&selinux_state, 1050 current_sid(), SECINITSID_SECURITY, 1051 SECCLASS_SECURITY, SECURITY__COMPUTE_USER, 1052 NULL); 1053 if (length) 1054 goto out; 1055 1056 length = -ENOMEM; 1057 con = kzalloc(size + 1, GFP_KERNEL); 1058 if (!con) 1059 goto out; 1060 1061 length = -ENOMEM; 1062 user = kzalloc(size + 1, GFP_KERNEL); 1063 if (!user) 1064 goto out; 1065 1066 length = -EINVAL; 1067 if (sscanf(buf, "%s %s", con, user) != 2) 1068 goto out; 1069 1070 length = security_context_str_to_sid(state, con, &sid, GFP_KERNEL); 1071 if (length) 1072 goto out; 1073 1074 length = security_get_user_sids(state, sid, user, &sids, &nsids); 1075 if (length) 1076 goto out; 1077 1078 length = sprintf(buf, "%u", nsids) + 1; 1079 ptr = buf + length; 1080 for (i = 0; i < nsids; i++) { 1081 rc = security_sid_to_context(state, sids[i], &newcon, &len); 1082 if (rc) { 1083 length = rc; 1084 goto out; 1085 } 1086 if ((length + len) >= SIMPLE_TRANSACTION_LIMIT) { 1087 kfree(newcon); 1088 length = -ERANGE; 1089 goto out; 1090 } 1091 memcpy(ptr, newcon, len); 1092 kfree(newcon); 1093 ptr += len; 1094 length += len; 1095 } 1096 out: 1097 kfree(sids); 1098 kfree(user); 1099 kfree(con); 1100 return length; 1101 } 1102 1103 static ssize_t sel_write_member(struct file *file, char *buf, size_t size) 1104 { 1105 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 1106 struct selinux_state *state = fsi->state; 1107 char *scon = NULL, *tcon = NULL; 1108 u32 ssid, tsid, newsid; 1109 u16 tclass; 1110 ssize_t length; 1111 char *newcon = NULL; 1112 u32 len; 1113 1114 length = avc_has_perm(&selinux_state, 1115 current_sid(), SECINITSID_SECURITY, 1116 SECCLASS_SECURITY, SECURITY__COMPUTE_MEMBER, 1117 NULL); 1118 if (length) 1119 goto out; 1120 1121 length = -ENOMEM; 1122 scon = kzalloc(size + 1, GFP_KERNEL); 1123 if (!scon) 1124 goto out; 1125 1126 length = -ENOMEM; 1127 tcon = kzalloc(size + 1, GFP_KERNEL); 1128 if (!tcon) 1129 goto out; 1130 1131 length = -EINVAL; 1132 if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) 1133 goto out; 1134 1135 length = security_context_str_to_sid(state, scon, &ssid, GFP_KERNEL); 1136 if (length) 1137 goto out; 1138 1139 length = security_context_str_to_sid(state, tcon, &tsid, GFP_KERNEL); 1140 if (length) 1141 goto out; 1142 1143 length = security_member_sid(state, ssid, tsid, tclass, &newsid); 1144 if (length) 1145 goto out; 1146 1147 length = security_sid_to_context(state, newsid, &newcon, &len); 1148 if (length) 1149 goto out; 1150 1151 length = -ERANGE; 1152 if (len > SIMPLE_TRANSACTION_LIMIT) { 1153 pr_err("SELinux: %s: context size (%u) exceeds " 1154 "payload max\n", __func__, len); 1155 goto out; 1156 } 1157 1158 memcpy(buf, newcon, len); 1159 length = len; 1160 out: 1161 kfree(newcon); 1162 kfree(tcon); 1163 kfree(scon); 1164 return length; 1165 } 1166 1167 static struct inode *sel_make_inode(struct super_block *sb, int mode) 1168 { 1169 struct inode *ret = new_inode(sb); 1170 1171 if (ret) { 1172 ret->i_mode = mode; 1173 ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret); 1174 } 1175 return ret; 1176 } 1177 1178 static ssize_t sel_read_bool(struct file *filep, char __user *buf, 1179 size_t count, loff_t *ppos) 1180 { 1181 struct selinux_fs_info *fsi = file_inode(filep)->i_sb->s_fs_info; 1182 char *page = NULL; 1183 ssize_t length; 1184 ssize_t ret; 1185 int cur_enforcing; 1186 unsigned index = file_inode(filep)->i_ino & SEL_INO_MASK; 1187 const char *name = filep->f_path.dentry->d_name.name; 1188 1189 mutex_lock(&fsi->mutex); 1190 1191 ret = -EINVAL; 1192 if (index >= fsi->bool_num || strcmp(name, 1193 fsi->bool_pending_names[index])) 1194 goto out_unlock; 1195 1196 ret = -ENOMEM; 1197 page = (char *)get_zeroed_page(GFP_KERNEL); 1198 if (!page) 1199 goto out_unlock; 1200 1201 cur_enforcing = security_get_bool_value(fsi->state, index); 1202 if (cur_enforcing < 0) { 1203 ret = cur_enforcing; 1204 goto out_unlock; 1205 } 1206 length = scnprintf(page, PAGE_SIZE, "%d %d", cur_enforcing, 1207 fsi->bool_pending_values[index]); 1208 mutex_unlock(&fsi->mutex); 1209 ret = simple_read_from_buffer(buf, count, ppos, page, length); 1210 out_free: 1211 free_page((unsigned long)page); 1212 return ret; 1213 1214 out_unlock: 1215 mutex_unlock(&fsi->mutex); 1216 goto out_free; 1217 } 1218 1219 static ssize_t sel_write_bool(struct file *filep, const char __user *buf, 1220 size_t count, loff_t *ppos) 1221 { 1222 struct selinux_fs_info *fsi = file_inode(filep)->i_sb->s_fs_info; 1223 char *page = NULL; 1224 ssize_t length; 1225 int new_value; 1226 unsigned index = file_inode(filep)->i_ino & SEL_INO_MASK; 1227 const char *name = filep->f_path.dentry->d_name.name; 1228 1229 if (count >= PAGE_SIZE) 1230 return -ENOMEM; 1231 1232 /* No partial writes. */ 1233 if (*ppos != 0) 1234 return -EINVAL; 1235 1236 page = memdup_user_nul(buf, count); 1237 if (IS_ERR(page)) 1238 return PTR_ERR(page); 1239 1240 mutex_lock(&fsi->mutex); 1241 1242 length = avc_has_perm(&selinux_state, 1243 current_sid(), SECINITSID_SECURITY, 1244 SECCLASS_SECURITY, SECURITY__SETBOOL, 1245 NULL); 1246 if (length) 1247 goto out; 1248 1249 length = -EINVAL; 1250 if (index >= fsi->bool_num || strcmp(name, 1251 fsi->bool_pending_names[index])) 1252 goto out; 1253 1254 length = -EINVAL; 1255 if (sscanf(page, "%d", &new_value) != 1) 1256 goto out; 1257 1258 if (new_value) 1259 new_value = 1; 1260 1261 fsi->bool_pending_values[index] = new_value; 1262 length = count; 1263 1264 out: 1265 mutex_unlock(&fsi->mutex); 1266 kfree(page); 1267 return length; 1268 } 1269 1270 static const struct file_operations sel_bool_ops = { 1271 .read = sel_read_bool, 1272 .write = sel_write_bool, 1273 .llseek = generic_file_llseek, 1274 }; 1275 1276 static ssize_t sel_commit_bools_write(struct file *filep, 1277 const char __user *buf, 1278 size_t count, loff_t *ppos) 1279 { 1280 struct selinux_fs_info *fsi = file_inode(filep)->i_sb->s_fs_info; 1281 char *page = NULL; 1282 ssize_t length; 1283 int new_value; 1284 1285 if (count >= PAGE_SIZE) 1286 return -ENOMEM; 1287 1288 /* No partial writes. */ 1289 if (*ppos != 0) 1290 return -EINVAL; 1291 1292 page = memdup_user_nul(buf, count); 1293 if (IS_ERR(page)) 1294 return PTR_ERR(page); 1295 1296 mutex_lock(&fsi->mutex); 1297 1298 length = avc_has_perm(&selinux_state, 1299 current_sid(), SECINITSID_SECURITY, 1300 SECCLASS_SECURITY, SECURITY__SETBOOL, 1301 NULL); 1302 if (length) 1303 goto out; 1304 1305 length = -EINVAL; 1306 if (sscanf(page, "%d", &new_value) != 1) 1307 goto out; 1308 1309 length = 0; 1310 if (new_value && fsi->bool_pending_values) 1311 length = security_set_bools(fsi->state, fsi->bool_num, 1312 fsi->bool_pending_values); 1313 1314 if (!length) 1315 length = count; 1316 1317 out: 1318 mutex_unlock(&fsi->mutex); 1319 kfree(page); 1320 return length; 1321 } 1322 1323 static const struct file_operations sel_commit_bools_ops = { 1324 .write = sel_commit_bools_write, 1325 .llseek = generic_file_llseek, 1326 }; 1327 1328 static void sel_remove_entries(struct dentry *de) 1329 { 1330 d_genocide(de); 1331 shrink_dcache_parent(de); 1332 } 1333 1334 #define BOOL_DIR_NAME "booleans" 1335 1336 static int sel_make_bools(struct selinux_fs_info *fsi) 1337 { 1338 int ret; 1339 ssize_t len; 1340 struct dentry *dentry = NULL; 1341 struct dentry *dir = fsi->bool_dir; 1342 struct inode *inode = NULL; 1343 struct inode_security_struct *isec; 1344 char **names = NULL, *page; 1345 u32 i, num; 1346 int *values = NULL; 1347 u32 sid; 1348 1349 /* remove any existing files */ 1350 for (i = 0; i < fsi->bool_num; i++) 1351 kfree(fsi->bool_pending_names[i]); 1352 kfree(fsi->bool_pending_names); 1353 kfree(fsi->bool_pending_values); 1354 fsi->bool_num = 0; 1355 fsi->bool_pending_names = NULL; 1356 fsi->bool_pending_values = NULL; 1357 1358 sel_remove_entries(dir); 1359 1360 ret = -ENOMEM; 1361 page = (char *)get_zeroed_page(GFP_KERNEL); 1362 if (!page) 1363 goto out; 1364 1365 ret = security_get_bools(fsi->state, &num, &names, &values); 1366 if (ret) 1367 goto out; 1368 1369 for (i = 0; i < num; i++) { 1370 ret = -ENOMEM; 1371 dentry = d_alloc_name(dir, names[i]); 1372 if (!dentry) 1373 goto out; 1374 1375 ret = -ENOMEM; 1376 inode = sel_make_inode(dir->d_sb, S_IFREG | S_IRUGO | S_IWUSR); 1377 if (!inode) { 1378 dput(dentry); 1379 goto out; 1380 } 1381 1382 ret = -ENAMETOOLONG; 1383 len = snprintf(page, PAGE_SIZE, "/%s/%s", BOOL_DIR_NAME, names[i]); 1384 if (len >= PAGE_SIZE) { 1385 dput(dentry); 1386 iput(inode); 1387 goto out; 1388 } 1389 1390 isec = selinux_inode(inode); 1391 ret = security_genfs_sid(fsi->state, "selinuxfs", page, 1392 SECCLASS_FILE, &sid); 1393 if (ret) { 1394 pr_warn_ratelimited("SELinux: no sid found, defaulting to security isid for %s\n", 1395 page); 1396 sid = SECINITSID_SECURITY; 1397 } 1398 1399 isec->sid = sid; 1400 isec->initialized = LABEL_INITIALIZED; 1401 inode->i_fop = &sel_bool_ops; 1402 inode->i_ino = i|SEL_BOOL_INO_OFFSET; 1403 d_add(dentry, inode); 1404 } 1405 fsi->bool_num = num; 1406 fsi->bool_pending_names = names; 1407 fsi->bool_pending_values = values; 1408 1409 free_page((unsigned long)page); 1410 return 0; 1411 out: 1412 free_page((unsigned long)page); 1413 1414 if (names) { 1415 for (i = 0; i < num; i++) 1416 kfree(names[i]); 1417 kfree(names); 1418 } 1419 kfree(values); 1420 sel_remove_entries(dir); 1421 1422 return ret; 1423 } 1424 1425 static ssize_t sel_read_avc_cache_threshold(struct file *filp, char __user *buf, 1426 size_t count, loff_t *ppos) 1427 { 1428 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 1429 struct selinux_state *state = fsi->state; 1430 char tmpbuf[TMPBUFLEN]; 1431 ssize_t length; 1432 1433 length = scnprintf(tmpbuf, TMPBUFLEN, "%u", 1434 avc_get_cache_threshold(state->avc)); 1435 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 1436 } 1437 1438 static ssize_t sel_write_avc_cache_threshold(struct file *file, 1439 const char __user *buf, 1440 size_t count, loff_t *ppos) 1441 1442 { 1443 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 1444 struct selinux_state *state = fsi->state; 1445 char *page; 1446 ssize_t ret; 1447 unsigned int new_value; 1448 1449 ret = avc_has_perm(&selinux_state, 1450 current_sid(), SECINITSID_SECURITY, 1451 SECCLASS_SECURITY, SECURITY__SETSECPARAM, 1452 NULL); 1453 if (ret) 1454 return ret; 1455 1456 if (count >= PAGE_SIZE) 1457 return -ENOMEM; 1458 1459 /* No partial writes. */ 1460 if (*ppos != 0) 1461 return -EINVAL; 1462 1463 page = memdup_user_nul(buf, count); 1464 if (IS_ERR(page)) 1465 return PTR_ERR(page); 1466 1467 ret = -EINVAL; 1468 if (sscanf(page, "%u", &new_value) != 1) 1469 goto out; 1470 1471 avc_set_cache_threshold(state->avc, new_value); 1472 1473 ret = count; 1474 out: 1475 kfree(page); 1476 return ret; 1477 } 1478 1479 static ssize_t sel_read_avc_hash_stats(struct file *filp, char __user *buf, 1480 size_t count, loff_t *ppos) 1481 { 1482 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 1483 struct selinux_state *state = fsi->state; 1484 char *page; 1485 ssize_t length; 1486 1487 page = (char *)__get_free_page(GFP_KERNEL); 1488 if (!page) 1489 return -ENOMEM; 1490 1491 length = avc_get_hash_stats(state->avc, page); 1492 if (length >= 0) 1493 length = simple_read_from_buffer(buf, count, ppos, page, length); 1494 free_page((unsigned long)page); 1495 1496 return length; 1497 } 1498 1499 static ssize_t sel_read_sidtab_hash_stats(struct file *filp, char __user *buf, 1500 size_t count, loff_t *ppos) 1501 { 1502 struct selinux_fs_info *fsi = file_inode(filp)->i_sb->s_fs_info; 1503 struct selinux_state *state = fsi->state; 1504 char *page; 1505 ssize_t length; 1506 1507 page = (char *)__get_free_page(GFP_KERNEL); 1508 if (!page) 1509 return -ENOMEM; 1510 1511 length = security_sidtab_hash_stats(state, page); 1512 if (length >= 0) 1513 length = simple_read_from_buffer(buf, count, ppos, page, 1514 length); 1515 free_page((unsigned long)page); 1516 1517 return length; 1518 } 1519 1520 static const struct file_operations sel_sidtab_hash_stats_ops = { 1521 .read = sel_read_sidtab_hash_stats, 1522 .llseek = generic_file_llseek, 1523 }; 1524 1525 static const struct file_operations sel_avc_cache_threshold_ops = { 1526 .read = sel_read_avc_cache_threshold, 1527 .write = sel_write_avc_cache_threshold, 1528 .llseek = generic_file_llseek, 1529 }; 1530 1531 static const struct file_operations sel_avc_hash_stats_ops = { 1532 .read = sel_read_avc_hash_stats, 1533 .llseek = generic_file_llseek, 1534 }; 1535 1536 #ifdef CONFIG_SECURITY_SELINUX_AVC_STATS 1537 static struct avc_cache_stats *sel_avc_get_stat_idx(loff_t *idx) 1538 { 1539 int cpu; 1540 1541 for (cpu = *idx; cpu < nr_cpu_ids; ++cpu) { 1542 if (!cpu_possible(cpu)) 1543 continue; 1544 *idx = cpu + 1; 1545 return &per_cpu(avc_cache_stats, cpu); 1546 } 1547 (*idx)++; 1548 return NULL; 1549 } 1550 1551 static void *sel_avc_stats_seq_start(struct seq_file *seq, loff_t *pos) 1552 { 1553 loff_t n = *pos - 1; 1554 1555 if (*pos == 0) 1556 return SEQ_START_TOKEN; 1557 1558 return sel_avc_get_stat_idx(&n); 1559 } 1560 1561 static void *sel_avc_stats_seq_next(struct seq_file *seq, void *v, loff_t *pos) 1562 { 1563 return sel_avc_get_stat_idx(pos); 1564 } 1565 1566 static int sel_avc_stats_seq_show(struct seq_file *seq, void *v) 1567 { 1568 struct avc_cache_stats *st = v; 1569 1570 if (v == SEQ_START_TOKEN) { 1571 seq_puts(seq, 1572 "lookups hits misses allocations reclaims frees\n"); 1573 } else { 1574 unsigned int lookups = st->lookups; 1575 unsigned int misses = st->misses; 1576 unsigned int hits = lookups - misses; 1577 seq_printf(seq, "%u %u %u %u %u %u\n", lookups, 1578 hits, misses, st->allocations, 1579 st->reclaims, st->frees); 1580 } 1581 return 0; 1582 } 1583 1584 static void sel_avc_stats_seq_stop(struct seq_file *seq, void *v) 1585 { } 1586 1587 static const struct seq_operations sel_avc_cache_stats_seq_ops = { 1588 .start = sel_avc_stats_seq_start, 1589 .next = sel_avc_stats_seq_next, 1590 .show = sel_avc_stats_seq_show, 1591 .stop = sel_avc_stats_seq_stop, 1592 }; 1593 1594 static int sel_open_avc_cache_stats(struct inode *inode, struct file *file) 1595 { 1596 return seq_open(file, &sel_avc_cache_stats_seq_ops); 1597 } 1598 1599 static const struct file_operations sel_avc_cache_stats_ops = { 1600 .open = sel_open_avc_cache_stats, 1601 .read = seq_read, 1602 .llseek = seq_lseek, 1603 .release = seq_release, 1604 }; 1605 #endif 1606 1607 static int sel_make_avc_files(struct dentry *dir) 1608 { 1609 struct super_block *sb = dir->d_sb; 1610 struct selinux_fs_info *fsi = sb->s_fs_info; 1611 int i; 1612 static const struct tree_descr files[] = { 1613 { "cache_threshold", 1614 &sel_avc_cache_threshold_ops, S_IRUGO|S_IWUSR }, 1615 { "hash_stats", &sel_avc_hash_stats_ops, S_IRUGO }, 1616 #ifdef CONFIG_SECURITY_SELINUX_AVC_STATS 1617 { "cache_stats", &sel_avc_cache_stats_ops, S_IRUGO }, 1618 #endif 1619 }; 1620 1621 for (i = 0; i < ARRAY_SIZE(files); i++) { 1622 struct inode *inode; 1623 struct dentry *dentry; 1624 1625 dentry = d_alloc_name(dir, files[i].name); 1626 if (!dentry) 1627 return -ENOMEM; 1628 1629 inode = sel_make_inode(dir->d_sb, S_IFREG|files[i].mode); 1630 if (!inode) { 1631 dput(dentry); 1632 return -ENOMEM; 1633 } 1634 1635 inode->i_fop = files[i].ops; 1636 inode->i_ino = ++fsi->last_ino; 1637 d_add(dentry, inode); 1638 } 1639 1640 return 0; 1641 } 1642 1643 static int sel_make_ss_files(struct dentry *dir) 1644 { 1645 struct super_block *sb = dir->d_sb; 1646 struct selinux_fs_info *fsi = sb->s_fs_info; 1647 int i; 1648 static struct tree_descr files[] = { 1649 { "sidtab_hash_stats", &sel_sidtab_hash_stats_ops, S_IRUGO }, 1650 }; 1651 1652 for (i = 0; i < ARRAY_SIZE(files); i++) { 1653 struct inode *inode; 1654 struct dentry *dentry; 1655 1656 dentry = d_alloc_name(dir, files[i].name); 1657 if (!dentry) 1658 return -ENOMEM; 1659 1660 inode = sel_make_inode(dir->d_sb, S_IFREG|files[i].mode); 1661 if (!inode) { 1662 dput(dentry); 1663 return -ENOMEM; 1664 } 1665 1666 inode->i_fop = files[i].ops; 1667 inode->i_ino = ++fsi->last_ino; 1668 d_add(dentry, inode); 1669 } 1670 1671 return 0; 1672 } 1673 1674 static ssize_t sel_read_initcon(struct file *file, char __user *buf, 1675 size_t count, loff_t *ppos) 1676 { 1677 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 1678 char *con; 1679 u32 sid, len; 1680 ssize_t ret; 1681 1682 sid = file_inode(file)->i_ino&SEL_INO_MASK; 1683 ret = security_sid_to_context(fsi->state, sid, &con, &len); 1684 if (ret) 1685 return ret; 1686 1687 ret = simple_read_from_buffer(buf, count, ppos, con, len); 1688 kfree(con); 1689 return ret; 1690 } 1691 1692 static const struct file_operations sel_initcon_ops = { 1693 .read = sel_read_initcon, 1694 .llseek = generic_file_llseek, 1695 }; 1696 1697 static int sel_make_initcon_files(struct dentry *dir) 1698 { 1699 int i; 1700 1701 for (i = 1; i <= SECINITSID_NUM; i++) { 1702 struct inode *inode; 1703 struct dentry *dentry; 1704 const char *s = security_get_initial_sid_context(i); 1705 1706 if (!s) 1707 continue; 1708 dentry = d_alloc_name(dir, s); 1709 if (!dentry) 1710 return -ENOMEM; 1711 1712 inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO); 1713 if (!inode) { 1714 dput(dentry); 1715 return -ENOMEM; 1716 } 1717 1718 inode->i_fop = &sel_initcon_ops; 1719 inode->i_ino = i|SEL_INITCON_INO_OFFSET; 1720 d_add(dentry, inode); 1721 } 1722 1723 return 0; 1724 } 1725 1726 static inline unsigned long sel_class_to_ino(u16 class) 1727 { 1728 return (class * (SEL_VEC_MAX + 1)) | SEL_CLASS_INO_OFFSET; 1729 } 1730 1731 static inline u16 sel_ino_to_class(unsigned long ino) 1732 { 1733 return (ino & SEL_INO_MASK) / (SEL_VEC_MAX + 1); 1734 } 1735 1736 static inline unsigned long sel_perm_to_ino(u16 class, u32 perm) 1737 { 1738 return (class * (SEL_VEC_MAX + 1) + perm) | SEL_CLASS_INO_OFFSET; 1739 } 1740 1741 static inline u32 sel_ino_to_perm(unsigned long ino) 1742 { 1743 return (ino & SEL_INO_MASK) % (SEL_VEC_MAX + 1); 1744 } 1745 1746 static ssize_t sel_read_class(struct file *file, char __user *buf, 1747 size_t count, loff_t *ppos) 1748 { 1749 unsigned long ino = file_inode(file)->i_ino; 1750 char res[TMPBUFLEN]; 1751 ssize_t len = scnprintf(res, sizeof(res), "%d", sel_ino_to_class(ino)); 1752 return simple_read_from_buffer(buf, count, ppos, res, len); 1753 } 1754 1755 static const struct file_operations sel_class_ops = { 1756 .read = sel_read_class, 1757 .llseek = generic_file_llseek, 1758 }; 1759 1760 static ssize_t sel_read_perm(struct file *file, char __user *buf, 1761 size_t count, loff_t *ppos) 1762 { 1763 unsigned long ino = file_inode(file)->i_ino; 1764 char res[TMPBUFLEN]; 1765 ssize_t len = scnprintf(res, sizeof(res), "%d", sel_ino_to_perm(ino)); 1766 return simple_read_from_buffer(buf, count, ppos, res, len); 1767 } 1768 1769 static const struct file_operations sel_perm_ops = { 1770 .read = sel_read_perm, 1771 .llseek = generic_file_llseek, 1772 }; 1773 1774 static ssize_t sel_read_policycap(struct file *file, char __user *buf, 1775 size_t count, loff_t *ppos) 1776 { 1777 struct selinux_fs_info *fsi = file_inode(file)->i_sb->s_fs_info; 1778 int value; 1779 char tmpbuf[TMPBUFLEN]; 1780 ssize_t length; 1781 unsigned long i_ino = file_inode(file)->i_ino; 1782 1783 value = security_policycap_supported(fsi->state, i_ino & SEL_INO_MASK); 1784 length = scnprintf(tmpbuf, TMPBUFLEN, "%d", value); 1785 1786 return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); 1787 } 1788 1789 static const struct file_operations sel_policycap_ops = { 1790 .read = sel_read_policycap, 1791 .llseek = generic_file_llseek, 1792 }; 1793 1794 static int sel_make_perm_files(char *objclass, int classvalue, 1795 struct dentry *dir) 1796 { 1797 struct selinux_fs_info *fsi = dir->d_sb->s_fs_info; 1798 int i, rc, nperms; 1799 char **perms; 1800 1801 rc = security_get_permissions(fsi->state, objclass, &perms, &nperms); 1802 if (rc) 1803 return rc; 1804 1805 for (i = 0; i < nperms; i++) { 1806 struct inode *inode; 1807 struct dentry *dentry; 1808 1809 rc = -ENOMEM; 1810 dentry = d_alloc_name(dir, perms[i]); 1811 if (!dentry) 1812 goto out; 1813 1814 rc = -ENOMEM; 1815 inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO); 1816 if (!inode) { 1817 dput(dentry); 1818 goto out; 1819 } 1820 1821 inode->i_fop = &sel_perm_ops; 1822 /* i+1 since perm values are 1-indexed */ 1823 inode->i_ino = sel_perm_to_ino(classvalue, i + 1); 1824 d_add(dentry, inode); 1825 } 1826 rc = 0; 1827 out: 1828 for (i = 0; i < nperms; i++) 1829 kfree(perms[i]); 1830 kfree(perms); 1831 return rc; 1832 } 1833 1834 static int sel_make_class_dir_entries(char *classname, int index, 1835 struct dentry *dir) 1836 { 1837 struct super_block *sb = dir->d_sb; 1838 struct selinux_fs_info *fsi = sb->s_fs_info; 1839 struct dentry *dentry = NULL; 1840 struct inode *inode = NULL; 1841 int rc; 1842 1843 dentry = d_alloc_name(dir, "index"); 1844 if (!dentry) 1845 return -ENOMEM; 1846 1847 inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO); 1848 if (!inode) { 1849 dput(dentry); 1850 return -ENOMEM; 1851 } 1852 1853 inode->i_fop = &sel_class_ops; 1854 inode->i_ino = sel_class_to_ino(index); 1855 d_add(dentry, inode); 1856 1857 dentry = sel_make_dir(dir, "perms", &fsi->last_class_ino); 1858 if (IS_ERR(dentry)) 1859 return PTR_ERR(dentry); 1860 1861 rc = sel_make_perm_files(classname, index, dentry); 1862 1863 return rc; 1864 } 1865 1866 static int sel_make_classes(struct selinux_fs_info *fsi) 1867 { 1868 1869 int rc, nclasses, i; 1870 char **classes; 1871 1872 /* delete any existing entries */ 1873 sel_remove_entries(fsi->class_dir); 1874 1875 rc = security_get_classes(fsi->state, &classes, &nclasses); 1876 if (rc) 1877 return rc; 1878 1879 /* +2 since classes are 1-indexed */ 1880 fsi->last_class_ino = sel_class_to_ino(nclasses + 2); 1881 1882 for (i = 0; i < nclasses; i++) { 1883 struct dentry *class_name_dir; 1884 1885 class_name_dir = sel_make_dir(fsi->class_dir, classes[i], 1886 &fsi->last_class_ino); 1887 if (IS_ERR(class_name_dir)) { 1888 rc = PTR_ERR(class_name_dir); 1889 goto out; 1890 } 1891 1892 /* i+1 since class values are 1-indexed */ 1893 rc = sel_make_class_dir_entries(classes[i], i + 1, 1894 class_name_dir); 1895 if (rc) 1896 goto out; 1897 } 1898 rc = 0; 1899 out: 1900 for (i = 0; i < nclasses; i++) 1901 kfree(classes[i]); 1902 kfree(classes); 1903 return rc; 1904 } 1905 1906 static int sel_make_policycap(struct selinux_fs_info *fsi) 1907 { 1908 unsigned int iter; 1909 struct dentry *dentry = NULL; 1910 struct inode *inode = NULL; 1911 1912 sel_remove_entries(fsi->policycap_dir); 1913 1914 for (iter = 0; iter <= POLICYDB_CAPABILITY_MAX; iter++) { 1915 if (iter < ARRAY_SIZE(selinux_policycap_names)) 1916 dentry = d_alloc_name(fsi->policycap_dir, 1917 selinux_policycap_names[iter]); 1918 else 1919 dentry = d_alloc_name(fsi->policycap_dir, "unknown"); 1920 1921 if (dentry == NULL) 1922 return -ENOMEM; 1923 1924 inode = sel_make_inode(fsi->sb, S_IFREG | 0444); 1925 if (inode == NULL) { 1926 dput(dentry); 1927 return -ENOMEM; 1928 } 1929 1930 inode->i_fop = &sel_policycap_ops; 1931 inode->i_ino = iter | SEL_POLICYCAP_INO_OFFSET; 1932 d_add(dentry, inode); 1933 } 1934 1935 return 0; 1936 } 1937 1938 static struct dentry *sel_make_dir(struct dentry *dir, const char *name, 1939 unsigned long *ino) 1940 { 1941 struct dentry *dentry = d_alloc_name(dir, name); 1942 struct inode *inode; 1943 1944 if (!dentry) 1945 return ERR_PTR(-ENOMEM); 1946 1947 inode = sel_make_inode(dir->d_sb, S_IFDIR | S_IRUGO | S_IXUGO); 1948 if (!inode) { 1949 dput(dentry); 1950 return ERR_PTR(-ENOMEM); 1951 } 1952 1953 inode->i_op = &simple_dir_inode_operations; 1954 inode->i_fop = &simple_dir_operations; 1955 inode->i_ino = ++(*ino); 1956 /* directory inodes start off with i_nlink == 2 (for "." entry) */ 1957 inc_nlink(inode); 1958 d_add(dentry, inode); 1959 /* bump link count on parent directory, too */ 1960 inc_nlink(d_inode(dir)); 1961 1962 return dentry; 1963 } 1964 1965 #define NULL_FILE_NAME "null" 1966 1967 static int sel_fill_super(struct super_block *sb, struct fs_context *fc) 1968 { 1969 struct selinux_fs_info *fsi; 1970 int ret; 1971 struct dentry *dentry; 1972 struct inode *inode; 1973 struct inode_security_struct *isec; 1974 1975 static const struct tree_descr selinux_files[] = { 1976 [SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR}, 1977 [SEL_ENFORCE] = {"enforce", &sel_enforce_ops, S_IRUGO|S_IWUSR}, 1978 [SEL_CONTEXT] = {"context", &transaction_ops, S_IRUGO|S_IWUGO}, 1979 [SEL_ACCESS] = {"access", &transaction_ops, S_IRUGO|S_IWUGO}, 1980 [SEL_CREATE] = {"create", &transaction_ops, S_IRUGO|S_IWUGO}, 1981 [SEL_RELABEL] = {"relabel", &transaction_ops, S_IRUGO|S_IWUGO}, 1982 [SEL_USER] = {"user", &transaction_ops, S_IRUGO|S_IWUGO}, 1983 [SEL_POLICYVERS] = {"policyvers", &sel_policyvers_ops, S_IRUGO}, 1984 [SEL_COMMIT_BOOLS] = {"commit_pending_bools", &sel_commit_bools_ops, S_IWUSR}, 1985 [SEL_MLS] = {"mls", &sel_mls_ops, S_IRUGO}, 1986 [SEL_DISABLE] = {"disable", &sel_disable_ops, S_IWUSR}, 1987 [SEL_MEMBER] = {"member", &transaction_ops, S_IRUGO|S_IWUGO}, 1988 [SEL_CHECKREQPROT] = {"checkreqprot", &sel_checkreqprot_ops, S_IRUGO|S_IWUSR}, 1989 [SEL_REJECT_UNKNOWN] = {"reject_unknown", &sel_handle_unknown_ops, S_IRUGO}, 1990 [SEL_DENY_UNKNOWN] = {"deny_unknown", &sel_handle_unknown_ops, S_IRUGO}, 1991 [SEL_STATUS] = {"status", &sel_handle_status_ops, S_IRUGO}, 1992 [SEL_POLICY] = {"policy", &sel_policy_ops, S_IRUGO}, 1993 [SEL_VALIDATE_TRANS] = {"validatetrans", &sel_transition_ops, 1994 S_IWUGO}, 1995 /* last one */ {""} 1996 }; 1997 1998 ret = selinux_fs_info_create(sb); 1999 if (ret) 2000 goto err; 2001 2002 ret = simple_fill_super(sb, SELINUX_MAGIC, selinux_files); 2003 if (ret) 2004 goto err; 2005 2006 fsi = sb->s_fs_info; 2007 fsi->bool_dir = sel_make_dir(sb->s_root, BOOL_DIR_NAME, &fsi->last_ino); 2008 if (IS_ERR(fsi->bool_dir)) { 2009 ret = PTR_ERR(fsi->bool_dir); 2010 fsi->bool_dir = NULL; 2011 goto err; 2012 } 2013 2014 ret = -ENOMEM; 2015 dentry = d_alloc_name(sb->s_root, NULL_FILE_NAME); 2016 if (!dentry) 2017 goto err; 2018 2019 ret = -ENOMEM; 2020 inode = sel_make_inode(sb, S_IFCHR | S_IRUGO | S_IWUGO); 2021 if (!inode) { 2022 dput(dentry); 2023 goto err; 2024 } 2025 2026 inode->i_ino = ++fsi->last_ino; 2027 isec = selinux_inode(inode); 2028 isec->sid = SECINITSID_DEVNULL; 2029 isec->sclass = SECCLASS_CHR_FILE; 2030 isec->initialized = LABEL_INITIALIZED; 2031 2032 init_special_inode(inode, S_IFCHR | S_IRUGO | S_IWUGO, MKDEV(MEM_MAJOR, 3)); 2033 d_add(dentry, inode); 2034 2035 dentry = sel_make_dir(sb->s_root, "avc", &fsi->last_ino); 2036 if (IS_ERR(dentry)) { 2037 ret = PTR_ERR(dentry); 2038 goto err; 2039 } 2040 2041 ret = sel_make_avc_files(dentry); 2042 2043 dentry = sel_make_dir(sb->s_root, "ss", &fsi->last_ino); 2044 if (IS_ERR(dentry)) { 2045 ret = PTR_ERR(dentry); 2046 goto err; 2047 } 2048 2049 ret = sel_make_ss_files(dentry); 2050 if (ret) 2051 goto err; 2052 2053 dentry = sel_make_dir(sb->s_root, "initial_contexts", &fsi->last_ino); 2054 if (IS_ERR(dentry)) { 2055 ret = PTR_ERR(dentry); 2056 goto err; 2057 } 2058 2059 ret = sel_make_initcon_files(dentry); 2060 if (ret) 2061 goto err; 2062 2063 fsi->class_dir = sel_make_dir(sb->s_root, "class", &fsi->last_ino); 2064 if (IS_ERR(fsi->class_dir)) { 2065 ret = PTR_ERR(fsi->class_dir); 2066 fsi->class_dir = NULL; 2067 goto err; 2068 } 2069 2070 fsi->policycap_dir = sel_make_dir(sb->s_root, "policy_capabilities", 2071 &fsi->last_ino); 2072 if (IS_ERR(fsi->policycap_dir)) { 2073 ret = PTR_ERR(fsi->policycap_dir); 2074 fsi->policycap_dir = NULL; 2075 goto err; 2076 } 2077 2078 ret = sel_make_policy_nodes(fsi); 2079 if (ret) 2080 goto err; 2081 return 0; 2082 err: 2083 pr_err("SELinux: %s: failed while creating inodes\n", 2084 __func__); 2085 2086 selinux_fs_info_free(sb); 2087 2088 return ret; 2089 } 2090 2091 static int sel_get_tree(struct fs_context *fc) 2092 { 2093 return get_tree_single(fc, sel_fill_super); 2094 } 2095 2096 static const struct fs_context_operations sel_context_ops = { 2097 .get_tree = sel_get_tree, 2098 }; 2099 2100 static int sel_init_fs_context(struct fs_context *fc) 2101 { 2102 fc->ops = &sel_context_ops; 2103 return 0; 2104 } 2105 2106 static void sel_kill_sb(struct super_block *sb) 2107 { 2108 selinux_fs_info_free(sb); 2109 kill_litter_super(sb); 2110 } 2111 2112 static struct file_system_type sel_fs_type = { 2113 .name = "selinuxfs", 2114 .init_fs_context = sel_init_fs_context, 2115 .kill_sb = sel_kill_sb, 2116 }; 2117 2118 struct vfsmount *selinuxfs_mount; 2119 struct path selinux_null; 2120 2121 static int __init init_sel_fs(void) 2122 { 2123 struct qstr null_name = QSTR_INIT(NULL_FILE_NAME, 2124 sizeof(NULL_FILE_NAME)-1); 2125 int err; 2126 2127 if (!selinux_enabled_boot) 2128 return 0; 2129 2130 err = sysfs_create_mount_point(fs_kobj, "selinux"); 2131 if (err) 2132 return err; 2133 2134 err = register_filesystem(&sel_fs_type); 2135 if (err) { 2136 sysfs_remove_mount_point(fs_kobj, "selinux"); 2137 return err; 2138 } 2139 2140 selinux_null.mnt = selinuxfs_mount = kern_mount(&sel_fs_type); 2141 if (IS_ERR(selinuxfs_mount)) { 2142 pr_err("selinuxfs: could not mount!\n"); 2143 err = PTR_ERR(selinuxfs_mount); 2144 selinuxfs_mount = NULL; 2145 } 2146 selinux_null.dentry = d_hash_and_lookup(selinux_null.mnt->mnt_root, 2147 &null_name); 2148 if (IS_ERR(selinux_null.dentry)) { 2149 pr_err("selinuxfs: could not lookup null!\n"); 2150 err = PTR_ERR(selinux_null.dentry); 2151 selinux_null.dentry = NULL; 2152 } 2153 2154 return err; 2155 } 2156 2157 __initcall(init_sel_fs); 2158 2159 #ifdef CONFIG_SECURITY_SELINUX_DISABLE 2160 void exit_sel_fs(void) 2161 { 2162 sysfs_remove_mount_point(fs_kobj, "selinux"); 2163 dput(selinux_null.dentry); 2164 kern_unmount(selinuxfs_mount); 2165 unregister_filesystem(&sel_fs_type); 2166 } 2167 #endif 2168