aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/exec_domain.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/exec_domain.c')
-rw-r--r--kernel/exec_domain.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c
index a9e6bad9f70..0511716e942 100644
--- a/kernel/exec_domain.c
+++ b/kernel/exec_domain.c
@@ -12,7 +12,9 @@
12#include <linux/kmod.h> 12#include <linux/kmod.h>
13#include <linux/module.h> 13#include <linux/module.h>
14#include <linux/personality.h> 14#include <linux/personality.h>
15#include <linux/proc_fs.h>
15#include <linux/sched.h> 16#include <linux/sched.h>
17#include <linux/seq_file.h>
16#include <linux/syscalls.h> 18#include <linux/syscalls.h>
17#include <linux/sysctl.h> 19#include <linux/sysctl.h>
18#include <linux/types.h> 20#include <linux/types.h>
@@ -65,7 +67,7 @@ lookup_exec_domain(u_long personality)
65 goto out; 67 goto out;
66 } 68 }
67 69
68#ifdef CONFIG_KMOD 70#ifdef CONFIG_MODULES
69 read_unlock(&exec_domains_lock); 71 read_unlock(&exec_domains_lock);
70 request_module("personality-%ld", pers); 72 request_module("personality-%ld", pers);
71 read_lock(&exec_domains_lock); 73 read_lock(&exec_domains_lock);
@@ -168,26 +170,44 @@ __set_personality(u_long personality)
168 current->personality = personality; 170 current->personality = personality;
169 oep = current_thread_info()->exec_domain; 171 oep = current_thread_info()->exec_domain;
170 current_thread_info()->exec_domain = ep; 172 current_thread_info()->exec_domain = ep;
171 set_fs_altroot();
172 173
173 module_put(oep->module); 174 module_put(oep->module);
174 return 0; 175 return 0;
175} 176}
176 177
177int 178#ifdef CONFIG_PROC_FS
178get_exec_domain_list(char *page) 179static int execdomains_proc_show(struct seq_file *m, void *v)
179{ 180{
180 struct exec_domain *ep; 181 struct exec_domain *ep;
181 int len = 0;
182 182
183 read_lock(&exec_domains_lock); 183 read_lock(&exec_domains_lock);
184 for (ep = exec_domains; ep && len < PAGE_SIZE - 80; ep = ep->next) 184 for (ep = exec_domains; ep; ep = ep->next)
185 len += sprintf(page + len, "%d-%d\t%-16s\t[%s]\n", 185 seq_printf(m, "%d-%d\t%-16s\t[%s]\n",
186 ep->pers_low, ep->pers_high, ep->name, 186 ep->pers_low, ep->pers_high, ep->name,
187 module_name(ep->module)); 187 module_name(ep->module));
188 read_unlock(&exec_domains_lock); 188 read_unlock(&exec_domains_lock);
189 return (len); 189 return 0;
190}
191
192static int execdomains_proc_open(struct inode *inode, struct file *file)
193{
194 return single_open(file, execdomains_proc_show, NULL);
195}
196
197static const struct file_operations execdomains_proc_fops = {
198 .open = execdomains_proc_open,
199 .read = seq_read,
200 .llseek = seq_lseek,
201 .release = single_release,
202};
203
204static int __init proc_execdomains_init(void)
205{
206 proc_create("execdomains", 0, NULL, &execdomains_proc_fops);
207 return 0;
190} 208}
209module_init(proc_execdomains_init);
210#endif
191 211
192asmlinkage long 212asmlinkage long
193sys_personality(u_long personality) 213sys_personality(u_long personality)