From 24f048ffa11d7de06ba9cbe068c946f3cf9bd034 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 7 Feb 2009 08:30:20 -0800 Subject: [PATCH] --- yaml --- r: 131104 b: refs/heads/master c: f12b12a8aecfcafcf2f9df1c1658d2484959dfda h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/compat.c | 2 +- trunk/fs/exec.c | 28 ++++++++++++++++++++++------ trunk/fs/internal.h | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 5eba2c2bd36a..d39b06416f57 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2d29c6a075787f2c1bc49b86a084d2b878f72fc4 +refs/heads/master: f12b12a8aecfcafcf2f9df1c1658d2484959dfda diff --git a/trunk/fs/compat.c b/trunk/fs/compat.c index 65a070e705ab..d0145ca27572 100644 --- a/trunk/fs/compat.c +++ b/trunk/fs/compat.c @@ -1407,7 +1407,7 @@ int compat_do_execve(char * filename, bprm->cred = prepare_exec_creds(); if (!bprm->cred) goto out_unlock; - check_unsafe_exec(bprm); + check_unsafe_exec(bprm, current->files); file = open_exec(filename); retval = PTR_ERR(file); diff --git a/trunk/fs/exec.c b/trunk/fs/exec.c index 0dd60a01f1b4..929b58004b7e 100644 --- a/trunk/fs/exec.c +++ b/trunk/fs/exec.c @@ -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); diff --git a/trunk/fs/internal.h b/trunk/fs/internal.h index 53af885f1732..0d8ac497b3d5 100644 --- a/trunk/fs/internal.h +++ b/trunk/fs/internal.h @@ -43,7 +43,7 @@ extern void __init chrdev_init(void); /* * exec.c */ -extern void check_unsafe_exec(struct linux_binprm *); +extern void check_unsafe_exec(struct linux_binprm *, struct files_struct *); /* * namespace.c