tomoyo.c revision c3ef1500ec833890275172c7d063333404b64d60
1f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda/*
2f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * security/tomoyo/tomoyo.c
3f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda *
4f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda * LSM hooks for TOMOYO Linux.
5f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda *
6c3ef1500ec833890275172c7d063333404b64d60Tetsuo Handa * Copyright (C) 2005-2010  NTT DATA CORPORATION
7f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda */
8f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
9f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda#include <linux/security.h>
10f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda#include "common.h"
11f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
12ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howellsstatic int tomoyo_cred_alloc_blank(struct cred *new, gfp_t gfp)
13ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells{
14ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells	new->security = NULL;
15ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells	return 0;
16ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells}
17ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells
18f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_cred_prepare(struct cred *new, const struct cred *old,
19f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			       gfp_t gfp)
20f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
21ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	struct tomoyo_domain_info *domain = old->security;
22ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	new->security = domain;
23ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	if (domain)
24ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa		atomic_inc(&domain->users);
25f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	return 0;
26f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
27f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
28ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howellsstatic void tomoyo_cred_transfer(struct cred *new, const struct cred *old)
29ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells{
30ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	tomoyo_cred_prepare(new, old, 0);
31ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa}
32ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa
33ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handastatic void tomoyo_cred_free(struct cred *cred)
34ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa{
35ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	struct tomoyo_domain_info *domain = cred->security;
36ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	if (domain)
37ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa		atomic_dec(&domain->users);
38ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells}
39ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells
40f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_bprm_set_creds(struct linux_binprm *bprm)
41f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
42b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski	int rc;
43b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski
44b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski	rc = cap_bprm_set_creds(bprm);
45b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski	if (rc)
46b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski		return rc;
47b1338d199dda6681d9af0297928af0a7eb9cba7bHerton Ronaldo Krzesinski
48f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/*
49f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * Do only if this function is called for the first time of an execve
50f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * operation.
51f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 */
52f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	if (bprm->cred_prepared)
53f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		return 0;
54f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/*
55f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * Load policy if /sbin/tomoyo-init exists and /sbin/init is requested
56f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * for the first time.
57f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 */
58f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	if (!tomoyo_policy_loaded)
59f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		tomoyo_load_policy(bprm->filename);
60f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/*
61ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	 * Release reference to "struct tomoyo_domain_info" stored inside
62ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	 * "bprm->cred->security". New reference to "struct tomoyo_domain_info"
63ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	 * stored inside "bprm->cred->security" will be acquired later inside
64ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	 * tomoyo_find_next_domain().
65ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	 */
66ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	atomic_dec(&((struct tomoyo_domain_info *)
67ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa		     bprm->cred->security)->users);
68ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	/*
69f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * Tell tomoyo_bprm_check_security() is called for the first time of an
70f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * execve operation.
71f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 */
72f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	bprm->cred->security = NULL;
73f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	return 0;
74f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
75f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
76f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_bprm_check_security(struct linux_binprm *bprm)
77f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
78f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct tomoyo_domain_info *domain = bprm->cred->security;
79f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
80f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/*
81f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * Execute permission is checked against pathname passed to do_execve()
82f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * using current domain.
83f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 */
84fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa	if (!domain) {
85fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa		const int idx = tomoyo_read_lock();
86fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa		const int err = tomoyo_find_next_domain(bprm);
87fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa		tomoyo_read_unlock(idx);
88fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa		return err;
89fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa	}
90f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/*
91f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 * Read permission is checked against interpreters using next domain.
92f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	 */
936d125529c6cbfe570ce3bf9a0728548f087499daAl Viro	return tomoyo_check_open_permission(domain, &bprm->file->f_path, O_RDONLY);
94f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
95f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
96f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_truncate(struct path *path, loff_t length,
97f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda				unsigned int time_attrs)
98f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
9997d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path_perm(TOMOYO_TYPE_TRUNCATE, path);
100f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
101f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
102f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_unlink(struct path *parent, struct dentry *dentry)
103f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
104f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path = { parent->mnt, dentry };
10597d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path_perm(TOMOYO_TYPE_UNLINK, &path);
106f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
107f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
108f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_mkdir(struct path *parent, struct dentry *dentry,
109f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			     int mode)
110f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
111f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path = { parent->mnt, dentry };
112a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	return tomoyo_path_number_perm(TOMOYO_TYPE_MKDIR, &path,
113a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa				       mode & S_IALLUGO);
114f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
115f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
116f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_rmdir(struct path *parent, struct dentry *dentry)
117f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
118f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path = { parent->mnt, dentry };
11997d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path_perm(TOMOYO_TYPE_RMDIR, &path);
120f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
121f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
122f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_symlink(struct path *parent, struct dentry *dentry,
123f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			       const char *old_name)
124f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
125f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path = { parent->mnt, dentry };
12697d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path_perm(TOMOYO_TYPE_SYMLINK, &path);
127f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
128f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
129f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_mknod(struct path *parent, struct dentry *dentry,
130f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			     int mode, unsigned int dev)
131f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
132f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path = { parent->mnt, dentry };
1337ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa	int type = TOMOYO_TYPE_CREATE;
134a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	const unsigned int perm = mode & S_IALLUGO;
135f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
136f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	switch (mode & S_IFMT) {
137f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	case S_IFCHR:
1387ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa		type = TOMOYO_TYPE_MKCHAR;
139f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		break;
140f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	case S_IFBLK:
1417ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa		type = TOMOYO_TYPE_MKBLOCK;
142f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		break;
143a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	default:
144a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa		goto no_dev;
145a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	}
146a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	return tomoyo_path_number3_perm(type, &path, perm, dev);
147a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa no_dev:
148a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	switch (mode & S_IFMT) {
149f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	case S_IFIFO:
1507ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa		type = TOMOYO_TYPE_MKFIFO;
151f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		break;
152f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	case S_IFSOCK:
1537ef612331fb219620cc1abfc2446bb027d388aa0Tetsuo Handa		type = TOMOYO_TYPE_MKSOCK;
154f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		break;
155f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	}
156a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	return tomoyo_path_number_perm(type, &path, perm);
157f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
158f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
159f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_link(struct dentry *old_dentry, struct path *new_dir,
160f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			    struct dentry *new_dentry)
161f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
162f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path1 = { new_dir->mnt, old_dentry };
163f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path2 = { new_dir->mnt, new_dentry };
16497d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path2_perm(TOMOYO_TYPE_LINK, &path1, &path2);
165f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
166f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
167f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_path_rename(struct path *old_parent,
168f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			      struct dentry *old_dentry,
169f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			      struct path *new_parent,
170f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			      struct dentry *new_dentry)
171f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
172f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path1 = { old_parent->mnt, old_dentry };
173f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct path path2 = { new_parent->mnt, new_dentry };
17497d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path2_perm(TOMOYO_TYPE_RENAME, &path1, &path2);
175f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
176f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
177f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_file_fcntl(struct file *file, unsigned int cmd,
178f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda			     unsigned long arg)
179f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
180f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	if (cmd == F_SETFL && ((arg ^ file->f_flags) & O_APPEND))
181cb0abe6a5b58499bd4bc1403f4987af9ead0642cTetsuo Handa		return tomoyo_path_perm(TOMOYO_TYPE_REWRITE, &file->f_path);
182f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	return 0;
183f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
184f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
185f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int tomoyo_dentry_open(struct file *f, const struct cred *cred)
186f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
187f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	int flags = f->f_flags;
188f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/* Don't check read permission here if called from do_execve(). */
189f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	if (current->in_execve)
190f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		return 0;
191f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	return tomoyo_check_open_permission(tomoyo_domain(), &f->f_path, flags);
192f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
193f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
194937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_file_ioctl(struct file *file, unsigned int cmd,
195937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa			     unsigned long arg)
196937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
197a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	return tomoyo_path_number_perm(TOMOYO_TYPE_IOCTL, &file->f_path, cmd);
198937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
199937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
200937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chmod(struct dentry *dentry, struct vfsmount *mnt,
201937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa			     mode_t mode)
202937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
203937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	struct path path = { mnt, dentry };
204a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa	return tomoyo_path_number_perm(TOMOYO_TYPE_CHMOD, &path,
205a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa				       mode & S_IALLUGO);
206937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
207937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
208937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chown(struct path *path, uid_t uid, gid_t gid)
209937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
210937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	int error = 0;
211937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	if (uid != (uid_t) -1)
212a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa		error = tomoyo_path_number_perm(TOMOYO_TYPE_CHOWN, path, uid);
213937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	if (!error && gid != (gid_t) -1)
214a1f9bb6a375a8dbf7797ffbd6739c46b338a77f7Tetsuo Handa		error = tomoyo_path_number_perm(TOMOYO_TYPE_CHGRP, path, gid);
215937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	return error;
216937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
217937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
218937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_path_chroot(struct path *path)
219937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
22097d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path_perm(TOMOYO_TYPE_CHROOT, path);
221937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
222937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
223937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_mount(char *dev_name, struct path *path,
224937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa			   char *type, unsigned long flags, void *data)
225937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
2262106ccd972dcd9fda7df9b181505fac1741b3508Tetsuo Handa	return tomoyo_mount_permission(dev_name, path, type, flags, data);
227937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
228937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
229937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_umount(struct vfsmount *mnt, int flags)
230937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
231937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	struct path path = { mnt, mnt->mnt_root };
23297d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path_perm(TOMOYO_TYPE_UMOUNT, &path);
233937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
234937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
235937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handastatic int tomoyo_sb_pivotroot(struct path *old_path, struct path *new_path)
236937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa{
23797d6931ead3e89a764cdaa3ad0924037367f0d34Tetsuo Handa	return tomoyo_path2_perm(TOMOYO_TYPE_PIVOT_ROOT, new_path, old_path);
238937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa}
239937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa
240c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa/*
241c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa * tomoyo_security_ops is a "struct security_operations" which is used for
242c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa * registering TOMOYO.
243c3fa109a5894077d1eaf8731ea741a15dd117b3cTetsuo Handa */
244f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic struct security_operations tomoyo_security_ops = {
245f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.name                = "tomoyo",
246ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells	.cred_alloc_blank    = tomoyo_cred_alloc_blank,
247f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.cred_prepare        = tomoyo_cred_prepare,
248ee18d64c1f632043a02e6f5ba5e045bb26a5465fDavid Howells	.cred_transfer	     = tomoyo_cred_transfer,
249ec8e6a4e062e2edebef91e930c20572c9f4c0ddaTetsuo Handa	.cred_free           = tomoyo_cred_free,
250f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.bprm_set_creds      = tomoyo_bprm_set_creds,
251f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.bprm_check_security = tomoyo_bprm_check_security,
252f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.file_fcntl          = tomoyo_file_fcntl,
253f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.dentry_open         = tomoyo_dentry_open,
254f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_truncate       = tomoyo_path_truncate,
255f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_unlink         = tomoyo_path_unlink,
256f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_mkdir          = tomoyo_path_mkdir,
257f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_rmdir          = tomoyo_path_rmdir,
258f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_symlink        = tomoyo_path_symlink,
259f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_mknod          = tomoyo_path_mknod,
260f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_link           = tomoyo_path_link,
261f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	.path_rename         = tomoyo_path_rename,
262937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.file_ioctl          = tomoyo_file_ioctl,
263937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.path_chmod          = tomoyo_path_chmod,
264937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.path_chown          = tomoyo_path_chown,
265937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.path_chroot         = tomoyo_path_chroot,
266937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.sb_mount            = tomoyo_sb_mount,
267937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.sb_umount           = tomoyo_sb_umount,
268937bf6133b21b16965f75223085f4314ae32b8ebTetsuo Handa	.sb_pivotroot        = tomoyo_sb_pivotroot,
269f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda};
270f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
271fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa/* Lock for GC. */
272fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handastruct srcu_struct tomoyo_ss;
273fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa
274f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedastatic int __init tomoyo_init(void)
275f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda{
276f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	struct cred *cred = (struct cred *) current_cred();
277f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
278f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	if (!security_module_enable(&tomoyo_security_ops))
279f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		return 0;
280f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	/* register ourselves with the security framework */
281fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa	if (register_security(&tomoyo_security_ops) ||
282fdb8ebb729bbb640e64028a4f579a02ebc405727Tetsuo Handa	    init_srcu_struct(&tomoyo_ss))
283f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda		panic("Failure registering TOMOYO Linux");
284f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	printk(KERN_INFO "TOMOYO Linux initialized\n");
285f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	cred->security = &tomoyo_kernel_domain;
286c3ef1500ec833890275172c7d063333404b64d60Tetsuo Handa	tomoyo_mm_init();
287f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda	return 0;
288f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda}
289f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takeda
290f7433243770c77979c396b4c7449a10e9b3521dbKentaro Takedasecurity_initcall(tomoyo_init);
291