5 |
* |
* |
6 |
* Copyright (C) 2005-2007 NTT DATA CORPORATION |
* Copyright (C) 2005-2007 NTT DATA CORPORATION |
7 |
* |
* |
8 |
* Version: 1.4.2 2007/07/13 |
* Version: 1.5.0-pre 2007/08/06 |
9 |
* |
* |
10 |
* This file is applicable to both 2.4.30 and 2.6.11 and later. |
* This file is applicable to both 2.4.30 and 2.6.11 and later. |
11 |
* See README.ccs for ChangeLog. |
* See README.ccs for ChangeLog. |
55 |
const struct path_info *dev_name; |
const struct path_info *dev_name; |
56 |
const struct path_info *dir_name; |
const struct path_info *dir_name; |
57 |
const struct path_info *fs_type; |
const struct path_info *fs_type; |
58 |
unsigned int disabled_options; /* Options to forcefully disable. */ |
unsigned long flags; |
|
unsigned int enabled_options; /* Options to forcefully enable. */ |
|
59 |
int is_deleted; |
int is_deleted; |
60 |
}; |
}; |
61 |
|
|
62 |
/************************* MOUNT RESTRICTION HANDLER *************************/ |
/************************* MOUNT RESTRICTION HANDLER *************************/ |
63 |
|
|
|
static void ParseMountOptions(char *arg, unsigned int *enabled_options, unsigned int *disabled_options) |
|
|
{ |
|
|
char *sp = arg, *cp; |
|
|
unsigned int enable = 0, disable = 0; |
|
|
while ((cp = strsep(&sp, " ,")) != NULL) { |
|
|
if (strcmp(cp, "rw") == 0) disable |= MS_RDONLY; |
|
|
else if (strcmp(cp, "ro") == 0) enable |= MS_RDONLY; |
|
|
else if (strcmp(cp, "suid") == 0) disable |= MS_NOSUID; |
|
|
else if (strcmp(cp, "nosuid") == 0) enable |= MS_NOSUID; |
|
|
else if (strcmp(cp, "dev") == 0) disable |= MS_NODEV; |
|
|
else if (strcmp(cp, "nodev") == 0) enable |= MS_NODEV; |
|
|
else if (strcmp(cp, "exec") == 0) disable |= MS_NOEXEC; |
|
|
else if (strcmp(cp, "noexec") == 0) enable |= MS_NOEXEC; |
|
|
else if (strcmp(cp, "atime") == 0) disable |= MS_NOATIME; |
|
|
else if (strcmp(cp, "noatime") == 0) enable |= MS_NOATIME; |
|
|
else if (strcmp(cp, "diratime") == 0) disable |= MS_NODIRATIME; |
|
|
else if (strcmp(cp, "nodiratime") == 0) enable |= MS_NODIRATIME; |
|
|
else if (strcmp(cp, "norecurse") == 0) disable |= MS_REC; |
|
|
else if (strcmp(cp, "recurse") == 0) enable |= MS_REC; |
|
|
} |
|
|
*enabled_options = enable; |
|
|
*disabled_options = disable; |
|
|
} |
|
|
|
|
|
static void MakeMountOptions(char *buffer, const int buffer_len, const unsigned int enabled, const unsigned int disabled) |
|
|
{ |
|
|
memset(buffer, 0, buffer_len); |
|
|
if (enabled == 0 && disabled == 0) { |
|
|
snprintf(buffer, buffer_len - 1, "defaults"); |
|
|
} else { |
|
|
snprintf(buffer, buffer_len - 1, "%s%s%s%s%s%s%s", |
|
|
enabled & MS_RDONLY ? "ro " : (disabled & MS_RDONLY ? "rw " : ""), |
|
|
enabled & MS_NOSUID ? "nosuid " : (disabled & MS_NOSUID ? "suid " : ""), |
|
|
enabled & MS_NODEV ? "nodev " : (disabled & MS_NODEV ? "dev " : ""), |
|
|
enabled & MS_NOEXEC ? "noexec " : (disabled & MS_NOEXEC ? "exec " : ""), |
|
|
enabled & MS_NOATIME ? "noatime " : (disabled & MS_NOATIME ? "atime " : ""), |
|
|
enabled & MS_NODIRATIME ? "nodiratime " : (disabled & MS_NODIRATIME ? "diratime " : ""), |
|
|
enabled & MS_REC ? "recurse " : (disabled & MS_REC ? "norecurse " : "")); |
|
|
} |
|
|
} |
|
|
|
|
64 |
static void put_filesystem(struct file_system_type *fs) |
static void put_filesystem(struct file_system_type *fs) |
65 |
{ |
{ |
66 |
module_put(fs->owner); |
module_put(fs->owner); |
68 |
|
|
69 |
static struct mount_entry *mount_list = NULL; |
static struct mount_entry *mount_list = NULL; |
70 |
|
|
71 |
static int AddMountACL(const char *dev_name, const char *dir_name, const char *fs_type, const unsigned int enable, const unsigned int disable, const int is_delete) |
static int AddMountACL(const char *dev_name, const char *dir_name, const char *fs_type, const unsigned long flags, const int is_delete) |
72 |
{ |
{ |
73 |
struct mount_entry *new_entry, *ptr; |
struct mount_entry *new_entry, *ptr; |
74 |
const struct path_info *fs, *dev, *dir; |
const struct path_info *fs, *dev, *dir; |
75 |
static DECLARE_MUTEX(lock); |
static DECLARE_MUTEX(lock); |
76 |
int error = -ENOMEM; |
int error = -ENOMEM; |
|
if (enable & disable) return -EINVAL; /* options mismatch. */ |
|
77 |
if ((fs = SaveName(fs_type)) == NULL) return -EINVAL; |
if ((fs = SaveName(fs_type)) == NULL) return -EINVAL; |
78 |
if (!dev_name) dev_name = "<NULL>"; /* Map dev_name to "<NULL>" for if no dev_name given. */ |
if (!dev_name) dev_name = "<NULL>"; /* Map dev_name to "<NULL>" for if no dev_name given. */ |
79 |
if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) dev_name = "any"; /* Fix dev_name to "any" for remount permission. */ |
if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) dev_name = "any"; /* Fix dev_name to "any" for remount permission. */ |
85 |
if ((dev = SaveName(dev_name)) == NULL || (dir = SaveName(dir_name)) == NULL) return -ENOMEM; |
if ((dev = SaveName(dev_name)) == NULL || (dir = SaveName(dir_name)) == NULL) return -ENOMEM; |
86 |
down(&lock); |
down(&lock); |
87 |
for (ptr = mount_list; ptr; ptr = ptr->next) { |
for (ptr = mount_list; ptr; ptr = ptr->next) { |
88 |
if (pathcmp(ptr->dev_name, dev) || pathcmp(ptr->dir_name, dir) || pathcmp(ptr->fs_type, fs)) continue; |
if (ptr->flags != flags || pathcmp(ptr->dev_name, dev) || pathcmp(ptr->dir_name, dir) || pathcmp(ptr->fs_type, fs)) continue; |
89 |
|
error = 0; |
90 |
if (is_delete) { |
if (is_delete) { |
|
if (ptr->disabled_options != disable || ptr->enabled_options != enable) continue; |
|
91 |
ptr->is_deleted = 1; |
ptr->is_deleted = 1; |
|
error = 0; |
|
92 |
goto out; |
goto out; |
93 |
} else { |
} else { |
94 |
if (ptr->is_deleted) { |
if (ptr->is_deleted) { |
|
ptr->enabled_options = enable; |
|
|
ptr->disabled_options = disable; |
|
95 |
ptr->is_deleted = 0; |
ptr->is_deleted = 0; |
96 |
} else { |
goto update; |
|
if ((ptr->enabled_options & disable) || (ptr->disabled_options | enable)) { |
|
|
error = -EINVAL; goto out; /* options mismatch. */ |
|
|
} |
|
|
if ((ptr->enabled_options & enable) == enable && (ptr->disabled_options & disable) == disable) { |
|
|
error = 0; goto out; /* No changes. */ |
|
|
} |
|
|
ptr->enabled_options |= enable; |
|
|
ptr->disabled_options |= disable; |
|
97 |
} |
} |
98 |
error = 0; |
goto out; /* No changes. */ |
|
goto update; |
|
99 |
} |
} |
100 |
} |
} |
101 |
if (is_delete) { |
if (is_delete) { |
106 |
new_entry->dev_name = dev; |
new_entry->dev_name = dev; |
107 |
new_entry->dir_name = dir; |
new_entry->dir_name = dir; |
108 |
new_entry->fs_type = fs; |
new_entry->fs_type = fs; |
109 |
new_entry->enabled_options = enable; |
new_entry->flags = flags; |
|
new_entry->disabled_options = disable; |
|
110 |
mb(); /* Instead of using spinlock. */ |
mb(); /* Instead of using spinlock. */ |
111 |
if ((ptr = mount_list) != NULL) { |
if ((ptr = mount_list) != NULL) { |
112 |
while (ptr->next) ptr = ptr->next; ptr->next = new_entry; |
while (ptr->next) ptr = ptr->next; ptr->next = new_entry; |
118 |
update: |
update: |
119 |
{ |
{ |
120 |
struct file_system_type *type = NULL; |
struct file_system_type *type = NULL; |
|
char options[64]; |
|
|
MakeMountOptions(options, sizeof(options), ptr->enabled_options, ptr->disabled_options); |
|
121 |
if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) { |
if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) { |
122 |
printk("%sAllow remount %s with options %s.\n", ccs_log_level, dir->name, options); |
printk("%sAllow remount %s with options 0x%lX.\n", ccs_log_level, dir->name, ptr->flags); |
123 |
} else if (strcmp(fs->name, MOUNT_BIND_KEYWORD) == 0 || strcmp(fs->name, MOUNT_MOVE_KEYWORD) == 0) { |
} else if (strcmp(fs->name, MOUNT_BIND_KEYWORD) == 0 || strcmp(fs->name, MOUNT_MOVE_KEYWORD) == 0) { |
124 |
printk("%sAllow mount %s %s %s\n", ccs_log_level, fs->name, dev->name, dir->name); |
printk("%sAllow mount %s %s %s with options 0x%lX\n", ccs_log_level, fs->name, dev->name, dir->name, ptr->flags); |
125 |
} else if (strcmp(fs->name, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 || |
} else if (strcmp(fs->name, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 || |
126 |
strcmp(fs->name, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 || |
strcmp(fs->name, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 || |
127 |
strcmp(fs->name, MOUNT_MAKE_SLAVE_KEYWORD) == 0 || |
strcmp(fs->name, MOUNT_MAKE_SLAVE_KEYWORD) == 0 || |
128 |
strcmp(fs->name, MOUNT_MAKE_SHARED_KEYWORD) == 0) { |
strcmp(fs->name, MOUNT_MAKE_SHARED_KEYWORD) == 0) { |
129 |
printk("%sAllow mount %s %s with options %s.\n", ccs_log_level, fs->name, dir->name, options); |
printk("%sAllow mount %s %s with options 0x%lX.\n", ccs_log_level, fs->name, dir->name, ptr->flags); |
130 |
} else if ((type = get_fs_type(fs->name)) != NULL && (type->fs_flags & FS_REQUIRES_DEV) != 0) { |
} else if ((type = get_fs_type(fs->name)) != NULL && (type->fs_flags & FS_REQUIRES_DEV) != 0) { |
131 |
printk("%sAllow mount -t %s %s %s with options %s.\n", ccs_log_level, fs->name, dev->name, dir->name, options); |
printk("%sAllow mount -t %s %s %s with options 0x%lX.\n", ccs_log_level, fs->name, dev->name, dir->name, ptr->flags); |
132 |
} else { |
} else { |
133 |
printk("%sAllow mount %s on %s with options %s.\n", ccs_log_level, fs->name, dir->name, options); |
printk("%sAllow mount %s on %s with options 0x%lX.\n", ccs_log_level, fs->name, dir->name, ptr->flags); |
134 |
} |
} |
135 |
if (type) put_filesystem(type); |
if (type) put_filesystem(type); |
136 |
} |
} |
139 |
return error; |
return error; |
140 |
} |
} |
141 |
|
|
142 |
int CheckMountPermission(char *dev_name, char *dir_name, char *type, unsigned long *flags) |
static int CheckMountPermission2(char *dev_name, char *dir_name, char *type, unsigned long flags) |
143 |
{ |
{ |
144 |
const int is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT); |
const int is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT); |
145 |
int error_flag = 1; |
int error_flag = 1; |
146 |
if (!CheckCCSFlags(CCS_SAKURA_RESTRICT_MOUNT)) return 0; |
if (!CheckCCSFlags(CCS_SAKURA_RESTRICT_MOUNT)) return 0; |
147 |
if (!type) type = "<NULL>"; |
if (!type) type = "<NULL>"; |
148 |
if ((*flags & MS_MGC_MSK) == MS_MGC_VAL) *flags &= ~MS_MGC_MSK; |
if ((flags & MS_MGC_MSK) == MS_MGC_VAL) flags &= ~MS_MGC_MSK; |
149 |
switch (*flags & (MS_REMOUNT | MS_MOVE | MS_BIND)) { |
switch (flags & (MS_REMOUNT | MS_MOVE | MS_BIND)) { |
150 |
case MS_REMOUNT: |
case MS_REMOUNT: |
151 |
case MS_MOVE: |
case MS_MOVE: |
152 |
case MS_BIND: |
case MS_BIND: |
154 |
break; |
break; |
155 |
default: |
default: |
156 |
printk("SAKURA-ERROR: %s%s%sare given for single mount operation.\n", |
printk("SAKURA-ERROR: %s%s%sare given for single mount operation.\n", |
157 |
*flags & MS_REMOUNT ? "'remount' " : "", |
flags & MS_REMOUNT ? "'remount' " : "", |
158 |
*flags & MS_MOVE ? "'move' " : "", |
flags & MS_MOVE ? "'move' " : "", |
159 |
*flags & MS_BIND ? "'bind' " : ""); |
flags & MS_BIND ? "'bind' " : ""); |
160 |
return -EINVAL; |
return -EINVAL; |
161 |
} |
} |
162 |
switch (*flags & (MS_UNBINDABLE | MS_PRIVATE | MS_SLAVE | MS_SHARED)) { |
switch (flags & (MS_UNBINDABLE | MS_PRIVATE | MS_SLAVE | MS_SHARED)) { |
163 |
case MS_UNBINDABLE: |
case MS_UNBINDABLE: |
164 |
case MS_PRIVATE: |
case MS_PRIVATE: |
165 |
case MS_SLAVE: |
case MS_SLAVE: |
168 |
break; |
break; |
169 |
default: |
default: |
170 |
printk("SAKURA-ERROR: %s%s%s%sare given for single mount operation.\n", |
printk("SAKURA-ERROR: %s%s%s%sare given for single mount operation.\n", |
171 |
*flags & MS_UNBINDABLE ? "'unbindable' " : "", |
flags & MS_UNBINDABLE ? "'unbindable' " : "", |
172 |
*flags & MS_PRIVATE ? "'private' " : "", |
flags & MS_PRIVATE ? "'private' " : "", |
173 |
*flags & MS_SLAVE ? "'slave' " : "", |
flags & MS_SLAVE ? "'slave' " : "", |
174 |
*flags & MS_SHARED ? "'shared' " : ""); |
flags & MS_SHARED ? "'shared' " : ""); |
175 |
return -EINVAL; |
return -EINVAL; |
176 |
} |
} |
177 |
if (*flags & MS_REMOUNT) { |
if (flags & MS_REMOUNT) { |
178 |
*flags &= ~MS_REMOUNT; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_REMOUNT_KEYWORD, flags & ~MS_REMOUNT); |
179 |
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_REMOUNT_KEYWORD, flags); |
} else if (flags & MS_MOVE) { |
180 |
*flags |= MS_REMOUNT; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_MOVE_KEYWORD, flags & ~MS_MOVE); |
181 |
} else if (*flags & MS_MOVE) { |
} else if (flags & MS_BIND) { |
182 |
*flags &= ~MS_MOVE; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_BIND_KEYWORD, flags & ~MS_BIND); |
183 |
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MOVE_KEYWORD, flags); |
} else if (flags & MS_UNBINDABLE) { |
184 |
*flags |= MS_MOVE; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_UNBINDABLE_KEYWORD, flags & ~MS_UNBINDABLE); |
185 |
} else if (*flags & MS_BIND) { |
} else if (flags & MS_PRIVATE) { |
186 |
*flags &= ~MS_BIND; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_PRIVATE_KEYWORD, flags & ~MS_PRIVATE); |
187 |
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_BIND_KEYWORD, flags); |
} else if (flags & MS_SLAVE) { |
188 |
*flags |= MS_BIND; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_SLAVE_KEYWORD, flags & ~MS_SLAVE); |
189 |
} else if (*flags & MS_UNBINDABLE) { |
} else if (flags & MS_SHARED) { |
190 |
*flags &= ~MS_UNBINDABLE; |
error_flag = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_SHARED_KEYWORD, flags & ~MS_SHARED); |
|
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_UNBINDABLE_KEYWORD, flags); |
|
|
*flags |= MS_UNBINDABLE; |
|
|
} else if (*flags & MS_PRIVATE) { |
|
|
*flags &= ~MS_PRIVATE; |
|
|
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_PRIVATE_KEYWORD, flags); |
|
|
*flags |= MS_PRIVATE; |
|
|
} else if (*flags & MS_SLAVE) { |
|
|
*flags &= ~MS_SLAVE; |
|
|
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_SLAVE_KEYWORD, flags); |
|
|
*flags |= MS_SLAVE; |
|
|
} else if (*flags & MS_SHARED) { |
|
|
*flags &= ~MS_SHARED; |
|
|
error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_SHARED_KEYWORD, flags); |
|
|
*flags |= MS_SHARED; |
|
191 |
} else { |
} else { |
192 |
goto normal_mount; |
goto normal_mount; |
193 |
} |
} |
234 |
for (ptr = mount_list; ptr; ptr = ptr->next) { |
for (ptr = mount_list; ptr; ptr = ptr->next) { |
235 |
if (ptr->is_deleted) continue; |
if (ptr->is_deleted) continue; |
236 |
|
|
237 |
|
/* Compare options */ |
238 |
|
if (ptr->flags != flags) continue; |
239 |
|
|
240 |
/* Compare fs name. */ |
/* Compare fs name. */ |
241 |
if (strcmp(type, ptr->fs_type->name)) continue; |
if (strcmp(type, ptr->fs_type->name)) continue; |
242 |
|
|
248 |
|
|
249 |
/* OK. */ |
/* OK. */ |
250 |
error_flag = 0; |
error_flag = 0; |
251 |
*flags &= ~ptr->disabled_options; |
|
|
*flags |= ptr->enabled_options; |
|
|
|
|
252 |
if (need_dev > 0) { |
if (need_dev > 0) { |
253 |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -t %s %s %s' accepted.\n", type, requested_dev_name, requested_dir_name); |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -t %s %s %s 0x%lX' accepted.\n", type, requested_dev_name, requested_dir_name, flags); |
254 |
} else if (need_dev < 0) { |
} else if (need_dev < 0) { |
255 |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s %s' accepted.\n", type, requested_dev_name, requested_dir_name); |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s %s 0x%lX' accepted.\n", type, requested_dev_name, requested_dir_name, flags); |
256 |
} else if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) { |
} else if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) { |
257 |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -o remount %s' accepted.\n", requested_dir_name); |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -o remount %s 0x%lX' accepted.\n", requested_dir_name, flags); |
258 |
} else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 || |
} else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 || |
259 |
strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 || |
strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 || |
260 |
strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 || |
strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 || |
261 |
strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) { |
strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) { |
262 |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s' accepted.\n", type, requested_dir_name); |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s 0x%lX' accepted.\n", type, requested_dir_name, flags); |
263 |
} else { |
} else { |
264 |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s on %s' accepted.\n", type, requested_dir_name); |
printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s on %s 0x%lX' accepted.\n", type, requested_dir_name, flags); |
265 |
} |
} |
266 |
break; |
break; |
267 |
} |
} |
268 |
if (error_flag && !is_enforce && CheckCCSAccept(CCS_SAKURA_RESTRICT_MOUNT)) { |
if (error_flag && !is_enforce && CheckCCSAccept(CCS_SAKURA_RESTRICT_MOUNT)) { |
269 |
AddMountACL(need_dev ? requested_dev_name : dev_name, requested_dir_name, type, 0, 0, 0); |
AddMountACL(need_dev ? requested_dev_name : dev_name, requested_dir_name, type, flags, 0); |
270 |
UpdateCounter(CCS_UPDATES_COUNTER_SYSTEM_POLICY); |
UpdateCounter(CCS_UPDATES_COUNTER_SYSTEM_POLICY); |
271 |
} |
} |
272 |
cleanup: |
cleanup: |
280 |
const int is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT); |
const int is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT); |
281 |
const char *realname1 = realpath(dev_name), *realname2 = realpath(dir_name), *exename = GetEXE(); |
const char *realname1 = realpath(dev_name), *realname2 = realpath(dir_name), *exename = GetEXE(); |
282 |
if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) { |
if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) { |
283 |
printk("SAKURA-%s: mount -o remount %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), realname2 ? realname2 : dir_name, current->pid, exename); |
printk("SAKURA-%s: mount -o remount %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), realname2 ? realname2 : dir_name, flags, current->pid, exename); |
284 |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount -o remount %s\n", exename, realname2 ? realname2 : dir_name) == 0) error = 0; |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount -o remount %s\n", exename, realname2 ? realname2 : dir_name) == 0) error = 0; |
285 |
} else if (strcmp(type, MOUNT_BIND_KEYWORD) == 0 || strcmp(type, MOUNT_MOVE_KEYWORD) == 0) { |
} else if (strcmp(type, MOUNT_BIND_KEYWORD) == 0 || strcmp(type, MOUNT_MOVE_KEYWORD) == 0) { |
286 |
printk("SAKURA-%s: mount %s %s %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, current->pid, exename); |
printk("SAKURA-%s: mount %s %s %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags, current->pid, exename); |
287 |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s %s\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name) == 0) error = 0; |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s %s 0x%lX\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags) == 0) error = 0; |
288 |
} else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 || |
} else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 || |
289 |
strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 || |
strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 || |
290 |
strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 || |
strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 || |
291 |
strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) { |
strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) { |
292 |
printk("SAKURA-%s: mount %s %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname2 ? realname2 : dir_name, current->pid, exename); |
printk("SAKURA-%s: mount %s %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname2 ? realname2 : dir_name, flags, current->pid, exename); |
293 |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s", exename, type, realname2 ? realname2 : dir_name) == 0) error = 0; |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s 0x%lX", exename, type, realname2 ? realname2 : dir_name, flags) == 0) error = 0; |
294 |
} else { |
} else { |
295 |
printk("SAKURA-%s: mount -t %s %s %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, current->pid, exename); |
printk("SAKURA-%s: mount -t %s %s %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags, current->pid, exename); |
296 |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount -t %s %s %s\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name) == 0) error = 0; |
if (is_enforce && CheckSupervisor("# %s is requesting\nmount -t %s %s %s 0x%lX\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags) == 0) error = 0; |
297 |
} |
} |
298 |
if (exename) ccs_free(exename); |
if (exename) ccs_free(exename); |
299 |
if (realname2) ccs_free(realname2); |
if (realname2) ccs_free(realname2); |
302 |
} |
} |
303 |
return 0; |
return 0; |
304 |
} |
} |
305 |
|
|
306 |
|
int CheckMountPermission(char *dev_name, char *dir_name, char *type, unsigned long *flags) |
307 |
|
{ |
308 |
|
return CheckMountPermission2(dev_name, dir_name, type, *flags); |
309 |
|
} |
310 |
|
|
311 |
EXPORT_SYMBOL(CheckMountPermission); |
EXPORT_SYMBOL(CheckMountPermission); |
312 |
|
|
313 |
int AddMountPolicy(char *data, const int is_delete) |
int AddMountPolicy(char *data, const int is_delete) |
314 |
{ |
{ |
315 |
char *cp, *cp2; |
char *cp, *cp2; |
316 |
const char *fs, *dev, *dir; |
const char *fs, *dev, *dir; |
317 |
unsigned int enable = 0, disable = 0; |
unsigned long flags = 0; |
318 |
cp2 = data; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dev = cp2; |
cp2 = data; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dev = cp2; |
319 |
cp2 = cp + 1; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dir = cp2; |
cp2 = cp + 1; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dir = cp2; |
320 |
cp2 = cp + 1; |
cp2 = cp + 1; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; fs = cp2; |
321 |
if ((cp = strchr(cp2, ' ')) != NULL) { |
flags = simple_strtoul(cp + 1, NULL, 0); |
322 |
*cp = '\0'; |
return AddMountACL(dev, dir, fs, flags, is_delete); |
|
ParseMountOptions(cp + 1, &enable, &disable); |
|
|
} |
|
|
fs = cp2; |
|
|
return AddMountACL(dev, dir, fs, enable, disable, is_delete); |
|
323 |
} |
} |
324 |
|
|
325 |
int ReadMountPolicy(struct io_buffer *head) |
int ReadMountPolicy(struct io_buffer *head) |
327 |
struct mount_entry *ptr = head->read_var2; |
struct mount_entry *ptr = head->read_var2; |
328 |
if (!ptr) ptr = mount_list; |
if (!ptr) ptr = mount_list; |
329 |
while (ptr) { |
while (ptr) { |
|
char options[64]; |
|
330 |
head->read_var2 = ptr; |
head->read_var2 = ptr; |
331 |
MakeMountOptions(options, sizeof(options), ptr->enabled_options, ptr->disabled_options); |
if (ptr->is_deleted == 0 && io_printf(head, KEYWORD_ALLOW_MOUNT "%s %s %s 0x%lX\n", ptr->dev_name->name, ptr->dir_name->name, ptr->fs_type->name, ptr->flags)) break; |
|
if (ptr->is_deleted == 0 && io_printf(head, KEYWORD_ALLOW_MOUNT "%s %s %s %s\n", ptr->dev_name->name, ptr->dir_name->name, ptr->fs_type->name, options)) break; |
|
332 |
ptr = ptr->next; |
ptr = ptr->next; |
333 |
} |
} |
334 |
return ptr ? -ENOMEM : 0; |
return ptr ? -ENOMEM : 0; |