オープンソース・ソフトウェアの開発とダウンロード

Subversion リポジトリの参照

Annotation of /trunk/1.5.x/ccs-patch/fs/tomoyo_signal.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 224 - (hide annotations) (download) (as text)
Sun May 20 03:25:13 2007 UTC (17 years ago) by kumaneko
Original Path: trunk/ccs-patch/fs/tomoyo_signal.c
File MIME type: text/x-csrc
File size: 5607 byte(s)


1 kumaneko 111 /*
2     * fs/tomoyo_signal.c
3     *
4     * Implementation of the Domain-Based Mandatory Access Control.
5     *
6     * Copyright (C) 2005-2007 NTT DATA CORPORATION
7     *
8 kumaneko 224 * Version: 1.4.1-rc1 2007/05/20
9 kumaneko 111 *
10     * This file is applicable to both 2.4.30 and 2.6.11 and later.
11     * See README.ccs for ChangeLog.
12     *
13     */
14     /***** TOMOYO Linux start. *****/
15    
16     #include <linux/ccs_common.h>
17     #include <linux/tomoyo.h>
18     #include <linux/realpath.h>
19    
20     /************************* VARIABLES *************************/
21    
22     /* The initial domain. */
23     extern struct domain_info KERNEL_DOMAIN;
24    
25     extern struct semaphore domain_acl_lock;
26    
27     /************************* AUDIT FUNCTIONS *************************/
28    
29     #ifdef CONFIG_TOMOYO_AUDIT
30     static int AuditSignalLog(const int signal, const struct path_info *dest_domain, const int is_granted)
31     {
32     char *buf;
33     int len;
34     if (CanSaveAuditLog(is_granted) < 0) return -ENOMEM;
35     len = dest_domain->total_len;
36     if ((buf = InitAuditLog(&len)) == NULL) return -ENOMEM;
37     snprintf(buf + strlen(buf), len - strlen(buf) - 1, KEYWORD_ALLOW_SIGNAL "%d %s\n", signal, dest_domain->name);
38     return WriteAuditLog(buf, is_granted);
39     }
40     #else
41     static inline void AuditSignalLog(const int signal, const struct path_info *dest_domain, const int is_granted) {}
42     #endif
43    
44     /************************* SIGNAL ACL HANDLER *************************/
45    
46 kumaneko 120 static int AddSignalEntry(const int sig, const char *dest_pattern, struct domain_info *domain, const u8 is_add, const struct condition_list *condition)
47 kumaneko 111 {
48     struct acl_info *ptr;
49     const struct path_info *saved_dest_pattern;
50     const u16 hash = sig;
51     int error = -ENOMEM;
52     if (!domain) return -EINVAL;
53     if (!dest_pattern || !IsCorrectDomain(dest_pattern, __FUNCTION__)) return -EINVAL;
54     if ((saved_dest_pattern = SaveName(dest_pattern)) == NULL) return -ENOMEM;
55     down(&domain_acl_lock);
56 kumaneko 120 if (is_add) {
57 kumaneko 111 if ((ptr = domain->first_acl_ptr) == NULL) goto first_entry;
58     while (1) {
59 kumaneko 214 struct signal_acl_record *new_ptr;
60 kumaneko 111 if (ptr->type == TYPE_SIGNAL_ACL && ptr->u.w == hash && ptr->cond == condition) {
61 kumaneko 214 if (!pathcmp(((struct signal_acl_record *) ptr)->domainname, saved_dest_pattern)) {
62 kumaneko 111 ptr->is_deleted = 0;
63     /* Found. Nothing to do. */
64     error = 0;
65     break;
66     }
67     }
68     if (ptr->next) {
69     ptr = ptr->next;
70     continue;
71     }
72     first_entry: ;
73 kumaneko 120 if (is_add == 1 && TooManyDomainACL(domain)) break;
74 kumaneko 111 /* Not found. Append it to the tail. */
75 kumaneko 214 if ((new_ptr = alloc_element(sizeof(*new_ptr))) == NULL) break;
76 kumaneko 111 new_ptr->head.type = TYPE_SIGNAL_ACL;
77     new_ptr->head.u.w = hash;
78     new_ptr->head.cond = condition;
79     new_ptr->domainname = saved_dest_pattern;
80     error = AddDomainACL(ptr, domain, (struct acl_info *) new_ptr);
81     break;
82     }
83     } else {
84     error = -ENOENT;
85     for (ptr = domain->first_acl_ptr; ptr; ptr = ptr->next) {
86     if (ptr->type != TYPE_SIGNAL_ACL || ptr->is_deleted || ptr->u.w != hash || ptr->cond != condition) continue;
87 kumaneko 214 if (pathcmp(((struct signal_acl_record *) ptr)->domainname, saved_dest_pattern)) continue;
88 kumaneko 111 error = DelDomainACL(ptr);
89     break;
90     }
91     }
92     up(&domain_acl_lock);
93     return error;
94     }
95    
96     int CheckSignalACL(const int sig, const int pid)
97     {
98     struct domain_info *domain = current->domain_info;
99     struct domain_info *dest = NULL;
100     const char *dest_pattern;
101     struct acl_info *ptr;
102     const u16 hash = sig;
103     const int is_enforce = CheckCCSEnforce(CCS_TOMOYO_MAC_FOR_SIGNAL);
104     if (!CheckCCSFlags(CCS_TOMOYO_MAC_FOR_SIGNAL)) return 0;
105     if (!sig) return 0; /* No check for NULL signal. */
106     if (current->pid == pid) {
107     AuditSignalLog(sig, domain->domainname, 1);
108     return 0; /* No check for self. */
109     }
110     { /* Simplified checking. */
111     struct task_struct *p = NULL;
112     read_lock(&tasklist_lock);
113     if (pid > 0) p = find_task_by_pid((pid_t) pid);
114     else if (pid == 0) p = current;
115     else if (pid == -1) dest = &KERNEL_DOMAIN;
116     else p = find_task_by_pid((pid_t) -pid);
117     if (p) dest = p->domain_info;
118     read_unlock(&tasklist_lock);
119     if (!dest) return 0; /* I can't find destinatioin. */
120     }
121     if (domain == dest) {
122     AuditSignalLog(sig, dest->domainname, 1);
123     return 0;
124     }
125     dest_pattern = dest->domainname->name;
126     for (ptr = domain->first_acl_ptr; ptr; ptr = ptr->next) {
127     if (ptr->type == TYPE_SIGNAL_ACL && ptr->is_deleted == 0 && ptr->u.w == hash && CheckCondition(ptr->cond, NULL) == 0) {
128 kumaneko 214 const int len = ((struct signal_acl_record *) ptr)->domainname->total_len;
129     if (strncmp(((struct signal_acl_record *) ptr)->domainname->name, dest_pattern, len) == 0 && (dest_pattern[len] == ' ' || dest_pattern[len] == '\0')) break;
130 kumaneko 111 }
131     }
132     if (ptr) {
133     AuditSignalLog(sig, dest->domainname, 1);
134     return 0;
135     }
136     if (TomoyoVerboseMode()) {
137     printk("TOMOYO-%s: Signal %d to %s denied for %s\n", GetMSG(is_enforce), sig, GetLastName(dest), GetLastName(domain));
138     }
139     AuditSignalLog(sig, dest->domainname, 0);
140     if (is_enforce) return CheckSupervisor("%s\n" KEYWORD_ALLOW_SIGNAL "%d %s\n", domain->domainname->name, sig, dest_pattern);
141 kumaneko 120 if (CheckCCSAccept(CCS_TOMOYO_MAC_FOR_SIGNAL)) AddSignalEntry(sig, dest_pattern, domain, 1, NULL);
142 kumaneko 111 return 0;
143     }
144 kumaneko 223 EXPORT_SYMBOL(CheckSignalACL);
145 kumaneko 111
146     int AddSignalPolicy(char *data, struct domain_info *domain, const int is_delete)
147     {
148     int sig;
149     char *domainname = strchr(data, ' ');
150     if (sscanf(data, "%d", &sig) == 1 && domainname && IsDomainDef(domainname + 1)) {
151     const struct condition_list *condition = NULL;
152     const char *cp = FindConditionPart(domainname + 1);
153     if (cp && (condition = FindOrAssignNewCondition(cp)) == NULL) return -EINVAL;
154 kumaneko 120 return AddSignalEntry(sig, domainname + 1, domain, is_delete ? 0 : -1, condition);
155 kumaneko 111 }
156     return -EINVAL;
157     }
158    
159     /***** TOMOYO Linux end. *****/

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26