diff options
Diffstat (limited to 'security')
-rw-r--r-- | security/tomoyo/common.c | 7 | ||||
-rw-r--r-- | security/tomoyo/common.h | 8 | ||||
-rw-r--r-- | security/tomoyo/domain.c | 90 |
3 files changed, 5 insertions, 100 deletions
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c index 92cea656ad21..a0affd9cfca8 100644 --- a/security/tomoyo/common.c +++ b/security/tomoyo/common.c | |||
@@ -1252,15 +1252,12 @@ static int tomoyo_write_domain_policy(struct tomoyo_io_buffer *head) | |||
1252 | struct tomoyo_domain_info *domain = head->write_var1; | 1252 | struct tomoyo_domain_info *domain = head->write_var1; |
1253 | bool is_delete = false; | 1253 | bool is_delete = false; |
1254 | bool is_select = false; | 1254 | bool is_select = false; |
1255 | bool is_undelete = false; | ||
1256 | unsigned int profile; | 1255 | unsigned int profile; |
1257 | 1256 | ||
1258 | if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_DELETE)) | 1257 | if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_DELETE)) |
1259 | is_delete = true; | 1258 | is_delete = true; |
1260 | else if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_SELECT)) | 1259 | else if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_SELECT)) |
1261 | is_select = true; | 1260 | is_select = true; |
1262 | else if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_UNDELETE)) | ||
1263 | is_undelete = true; | ||
1264 | if (is_select && tomoyo_is_select_one(head, data)) | 1261 | if (is_select && tomoyo_is_select_one(head, data)) |
1265 | return 0; | 1262 | return 0; |
1266 | /* Don't allow updating policies by non manager programs. */ | 1263 | /* Don't allow updating policies by non manager programs. */ |
@@ -1274,9 +1271,7 @@ static int tomoyo_write_domain_policy(struct tomoyo_io_buffer *head) | |||
1274 | down_read(&tomoyo_domain_list_lock); | 1271 | down_read(&tomoyo_domain_list_lock); |
1275 | domain = tomoyo_find_domain(data); | 1272 | domain = tomoyo_find_domain(data); |
1276 | up_read(&tomoyo_domain_list_lock); | 1273 | up_read(&tomoyo_domain_list_lock); |
1277 | } else if (is_undelete) | 1274 | } else |
1278 | domain = tomoyo_undelete_domain(data); | ||
1279 | else | ||
1280 | domain = tomoyo_find_or_assign_new_domain(data, 0); | 1275 | domain = tomoyo_find_or_assign_new_domain(data, 0); |
1281 | head->write_var1 = domain; | 1276 | head->write_var1 = domain; |
1282 | return 0; | 1277 | return 0; |
diff --git a/security/tomoyo/common.h b/security/tomoyo/common.h index 26a76d67aa1c..e77e6a6de0f2 100644 --- a/security/tomoyo/common.h +++ b/security/tomoyo/common.h | |||
@@ -88,10 +88,7 @@ struct tomoyo_domain_info { | |||
88 | /* Name of this domain. Never NULL. */ | 88 | /* Name of this domain. Never NULL. */ |
89 | const struct tomoyo_path_info *domainname; | 89 | const struct tomoyo_path_info *domainname; |
90 | u8 profile; /* Profile number to use. */ | 90 | u8 profile; /* Profile number to use. */ |
91 | u8 is_deleted; /* Delete flag. | 91 | bool is_deleted; /* Delete flag. */ |
92 | 0 = active. | ||
93 | 1 = deleted but undeletable. | ||
94 | 255 = deleted and no longer undeletable. */ | ||
95 | bool quota_warned; /* Quota warnning flag. */ | 92 | bool quota_warned; /* Quota warnning flag. */ |
96 | /* DOMAIN_FLAGS_*. Use tomoyo_set_domain_flag() to modify. */ | 93 | /* DOMAIN_FLAGS_*. Use tomoyo_set_domain_flag() to modify. */ |
97 | u8 flags; | 94 | u8 flags; |
@@ -144,7 +141,6 @@ struct tomoyo_double_path_acl_record { | |||
144 | #define TOMOYO_KEYWORD_NO_INITIALIZE_DOMAIN "no_initialize_domain " | 141 | #define TOMOYO_KEYWORD_NO_INITIALIZE_DOMAIN "no_initialize_domain " |
145 | #define TOMOYO_KEYWORD_NO_KEEP_DOMAIN "no_keep_domain " | 142 | #define TOMOYO_KEYWORD_NO_KEEP_DOMAIN "no_keep_domain " |
146 | #define TOMOYO_KEYWORD_SELECT "select " | 143 | #define TOMOYO_KEYWORD_SELECT "select " |
147 | #define TOMOYO_KEYWORD_UNDELETE "undelete " | ||
148 | #define TOMOYO_KEYWORD_USE_PROFILE "use_profile " | 144 | #define TOMOYO_KEYWORD_USE_PROFILE "use_profile " |
149 | #define TOMOYO_KEYWORD_IGNORE_GLOBAL_ALLOW_READ "ignore_global_allow_read" | 145 | #define TOMOYO_KEYWORD_IGNORE_GLOBAL_ALLOW_READ "ignore_global_allow_read" |
150 | /* A domain definition starts with <kernel>. */ | 146 | /* A domain definition starts with <kernel>. */ |
@@ -267,8 +263,6 @@ struct tomoyo_domain_info *tomoyo_find_domain(const char *domainname); | |||
267 | struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char * | 263 | struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char * |
268 | domainname, | 264 | domainname, |
269 | const u8 profile); | 265 | const u8 profile); |
270 | /* Undelete a domain. */ | ||
271 | struct tomoyo_domain_info *tomoyo_undelete_domain(const char *domainname); | ||
272 | /* Check mode for specified functionality. */ | 266 | /* Check mode for specified functionality. */ |
273 | unsigned int tomoyo_check_flags(const struct tomoyo_domain_info *domain, | 267 | unsigned int tomoyo_check_flags(const struct tomoyo_domain_info *domain, |
274 | const u8 index); | 268 | const u8 index); |
diff --git a/security/tomoyo/domain.c b/security/tomoyo/domain.c index 093a756030bd..2f2b449ffd2d 100644 --- a/security/tomoyo/domain.c +++ b/security/tomoyo/domain.c | |||
@@ -551,9 +551,7 @@ int tomoyo_write_alias_policy(char *data, const bool is_delete) | |||
551 | return tomoyo_update_alias_entry(data, cp, is_delete); | 551 | return tomoyo_update_alias_entry(data, cp, is_delete); |
552 | } | 552 | } |
553 | 553 | ||
554 | /* Domain create/delete/undelete handler. */ | 554 | /* Domain create/delete handler. */ |
555 | |||
556 | /* #define TOMOYO_DEBUG_DOMAIN_UNDELETE */ | ||
557 | 555 | ||
558 | /** | 556 | /** |
559 | * tomoyo_delete_domain - Delete a domain. | 557 | * tomoyo_delete_domain - Delete a domain. |
@@ -571,41 +569,15 @@ int tomoyo_delete_domain(char *domainname) | |||
571 | tomoyo_fill_path_info(&name); | 569 | tomoyo_fill_path_info(&name); |
572 | /***** EXCLUSIVE SECTION START *****/ | 570 | /***** EXCLUSIVE SECTION START *****/ |
573 | down_write(&tomoyo_domain_list_lock); | 571 | down_write(&tomoyo_domain_list_lock); |
574 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
575 | printk(KERN_DEBUG "tomoyo_delete_domain %s\n", domainname); | ||
576 | list_for_each_entry(domain, &tomoyo_domain_list, list) { | ||
577 | if (tomoyo_pathcmp(domain->domainname, &name)) | ||
578 | continue; | ||
579 | printk(KERN_DEBUG "List: %p %u\n", domain, domain->is_deleted); | ||
580 | } | ||
581 | #endif | ||
582 | /* Is there an active domain? */ | 572 | /* Is there an active domain? */ |
583 | list_for_each_entry(domain, &tomoyo_domain_list, list) { | 573 | list_for_each_entry(domain, &tomoyo_domain_list, list) { |
584 | struct tomoyo_domain_info *domain2; | ||
585 | /* Never delete tomoyo_kernel_domain */ | 574 | /* Never delete tomoyo_kernel_domain */ |
586 | if (domain == &tomoyo_kernel_domain) | 575 | if (domain == &tomoyo_kernel_domain) |
587 | continue; | 576 | continue; |
588 | if (domain->is_deleted || | 577 | if (domain->is_deleted || |
589 | tomoyo_pathcmp(domain->domainname, &name)) | 578 | tomoyo_pathcmp(domain->domainname, &name)) |
590 | continue; | 579 | continue; |
591 | /* Mark already deleted domains as non undeletable. */ | 580 | domain->is_deleted = true; |
592 | list_for_each_entry(domain2, &tomoyo_domain_list, list) { | ||
593 | if (!domain2->is_deleted || | ||
594 | tomoyo_pathcmp(domain2->domainname, &name)) | ||
595 | continue; | ||
596 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
597 | if (domain2->is_deleted != 255) | ||
598 | printk(KERN_DEBUG | ||
599 | "Marked %p as non undeletable\n", | ||
600 | domain2); | ||
601 | #endif | ||
602 | domain2->is_deleted = 255; | ||
603 | } | ||
604 | /* Delete and mark active domain as undeletable. */ | ||
605 | domain->is_deleted = 1; | ||
606 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
607 | printk(KERN_DEBUG "Marked %p as undeletable\n", domain); | ||
608 | #endif | ||
609 | break; | 581 | break; |
610 | } | 582 | } |
611 | up_write(&tomoyo_domain_list_lock); | 583 | up_write(&tomoyo_domain_list_lock); |
@@ -614,58 +586,6 @@ int tomoyo_delete_domain(char *domainname) | |||
614 | } | 586 | } |
615 | 587 | ||
616 | /** | 588 | /** |
617 | * tomoyo_undelete_domain - Undelete a domain. | ||
618 | * | ||
619 | * @domainname: The name of domain. | ||
620 | * | ||
621 | * Returns pointer to "struct tomoyo_domain_info" on success, NULL otherwise. | ||
622 | */ | ||
623 | struct tomoyo_domain_info *tomoyo_undelete_domain(const char *domainname) | ||
624 | { | ||
625 | struct tomoyo_domain_info *domain; | ||
626 | struct tomoyo_domain_info *candidate_domain = NULL; | ||
627 | struct tomoyo_path_info name; | ||
628 | |||
629 | name.name = domainname; | ||
630 | tomoyo_fill_path_info(&name); | ||
631 | /***** EXCLUSIVE SECTION START *****/ | ||
632 | down_write(&tomoyo_domain_list_lock); | ||
633 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
634 | printk(KERN_DEBUG "tomoyo_undelete_domain %s\n", domainname); | ||
635 | list_for_each_entry(domain, &tomoyo_domain_list, list) { | ||
636 | if (tomoyo_pathcmp(domain->domainname, &name)) | ||
637 | continue; | ||
638 | printk(KERN_DEBUG "List: %p %u\n", domain, domain->is_deleted); | ||
639 | } | ||
640 | #endif | ||
641 | list_for_each_entry(domain, &tomoyo_domain_list, list) { | ||
642 | if (tomoyo_pathcmp(&name, domain->domainname)) | ||
643 | continue; | ||
644 | if (!domain->is_deleted) { | ||
645 | /* This domain is active. I can't undelete. */ | ||
646 | candidate_domain = NULL; | ||
647 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
648 | printk(KERN_DEBUG "%p is active. I can't undelete.\n", | ||
649 | domain); | ||
650 | #endif | ||
651 | break; | ||
652 | } | ||
653 | /* Is this domain undeletable? */ | ||
654 | if (domain->is_deleted == 1) | ||
655 | candidate_domain = domain; | ||
656 | } | ||
657 | if (candidate_domain) { | ||
658 | candidate_domain->is_deleted = 0; | ||
659 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
660 | printk(KERN_DEBUG "%p was undeleted.\n", candidate_domain); | ||
661 | #endif | ||
662 | } | ||
663 | up_write(&tomoyo_domain_list_lock); | ||
664 | /***** EXCLUSIVE SECTION END *****/ | ||
665 | return candidate_domain; | ||
666 | } | ||
667 | |||
668 | /** | ||
669 | * tomoyo_find_or_assign_new_domain - Create a domain. | 589 | * tomoyo_find_or_assign_new_domain - Create a domain. |
670 | * | 590 | * |
671 | * @domainname: The name of domain. | 591 | * @domainname: The name of domain. |
@@ -711,10 +631,6 @@ struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char * | |||
711 | /***** CRITICAL SECTION END *****/ | 631 | /***** CRITICAL SECTION END *****/ |
712 | if (flag) | 632 | if (flag) |
713 | continue; | 633 | continue; |
714 | #ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE | ||
715 | printk(KERN_DEBUG "Reusing %p %s\n", domain, | ||
716 | domain->domainname->name); | ||
717 | #endif | ||
718 | list_for_each_entry(ptr, &domain->acl_info_list, list) { | 634 | list_for_each_entry(ptr, &domain->acl_info_list, list) { |
719 | ptr->type |= TOMOYO_ACL_DELETED; | 635 | ptr->type |= TOMOYO_ACL_DELETED; |
720 | } | 636 | } |
@@ -722,7 +638,7 @@ struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char * | |||
722 | domain->profile = profile; | 638 | domain->profile = profile; |
723 | domain->quota_warned = false; | 639 | domain->quota_warned = false; |
724 | mb(); /* Avoid out-of-order execution. */ | 640 | mb(); /* Avoid out-of-order execution. */ |
725 | domain->is_deleted = 0; | 641 | domain->is_deleted = false; |
726 | goto out; | 642 | goto out; |
727 | } | 643 | } |
728 | /* No memory reusable. Create using new memory. */ | 644 | /* No memory reusable. Create using new memory. */ |