diff options
| author | Takashi Iwai <tiwai@suse.de> | 2009-03-09 17:21:57 +0300 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2009-03-09 17:21:57 +0300 |
| commit | efdcd41b4e41560375bb34ad8b095bcaa1c3a93f (patch) | |
| tree | 57200ef68bae530776c0c2621c51e9464e1e72f9 /fs/exec.c | |
| parent | 33dbe6114047496a5b6fee0941c52dad41250043 (diff) | |
| parent | 79c7cdd5441f5d3900c1632adcc8cd2bee35c8da (diff) | |
| download | linux-efdcd41b4e41560375bb34ad8b095bcaa1c3a93f.tar.xz | |
Merge branch 'topic/vmaster-update' into topic/docbook-fix
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/fs/exec.c b/fs/exec.c index 71a6efe5d8bd..929b58004b7e 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -99,7 +99,7 @@ static inline void put_binfmt(struct linux_binfmt * fmt) * * Also note that we take the address to load from from the file itself. */ -asmlinkage long sys_uselib(const char __user * library) +SYSCALL_DEFINE1(uselib, const char __user *, library) { struct file *file; struct nameidata nd; @@ -1049,16 +1049,32 @@ EXPORT_SYMBOL(install_exec_creds); * - the caller must hold current->cred_exec_mutex to protect against * PTRACE_ATTACH */ -void check_unsafe_exec(struct linux_binprm *bprm) +void check_unsafe_exec(struct linux_binprm *bprm, struct files_struct *files) { - struct task_struct *p = current; + struct task_struct *p = current, *t; + unsigned long flags; + unsigned n_fs, n_files, n_sighand; bprm->unsafe = tracehook_unsafe_exec(p); - if (atomic_read(&p->fs->count) > 1 || - atomic_read(&p->files->count) > 1 || - atomic_read(&p->sighand->count) > 1) + n_fs = 1; + n_files = 1; + n_sighand = 1; + lock_task_sighand(p, &flags); + for (t = next_thread(p); t != p; t = next_thread(t)) { + if (t->fs == p->fs) + n_fs++; + if (t->files == files) + n_files++; + n_sighand++; + } + + if (atomic_read(&p->fs->count) > n_fs || + atomic_read(&p->files->count) > n_files || + atomic_read(&p->sighand->count) > n_sighand) bprm->unsafe |= LSM_UNSAFE_SHARE; + + unlock_task_sighand(p, &flags); } /* @@ -1273,7 +1289,7 @@ int do_execve(char * filename, bprm->cred = prepare_exec_creds(); if (!bprm->cred) goto out_unlock; - check_unsafe_exec(bprm); + check_unsafe_exec(bprm, displaced); file = open_exec(filename); retval = PTR_ERR(file); |
