aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2014-05-21 18:23:46 -0400
committerKees Cook <keescook@chromium.org>2014-07-18 15:13:38 -0400
commit1d4457f99928a968767f6405b4a1f50845aa15fd (patch)
tree522641b08f4a465035910a74a3871ad38e62df01 /kernel
parent8855d608c145c1ca0e26f4da00741080bb49d80d (diff)
sched: move no_new_privs into new atomic flags
Since seccomp transitions between threads requires updates to the no_new_privs flag to be atomic, the flag must be part of an atomic flag set. This moves the nnp flag into a separate task field, and introduces accessors. Signed-off-by: Kees Cook <keescook@chromium.org> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Reviewed-by: Andy Lutomirski <luto@amacapital.net>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/seccomp.c2
-rw-r--r--kernel/sys.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/kernel/seccomp.c b/kernel/seccomp.c
index f0652578af75..d2596136b0d1 100644
--- a/kernel/seccomp.c
+++ b/kernel/seccomp.c
@@ -241,7 +241,7 @@ static long seccomp_attach_filter(struct sock_fprog *fprog)
241 * This avoids scenarios where unprivileged tasks can affect the 241 * This avoids scenarios where unprivileged tasks can affect the
242 * behavior of privileged children. 242 * behavior of privileged children.
243 */ 243 */
244 if (!current->no_new_privs && 244 if (!task_no_new_privs(current) &&
245 security_capable_noaudit(current_cred(), current_user_ns(), 245 security_capable_noaudit(current_cred(), current_user_ns(),
246 CAP_SYS_ADMIN) != 0) 246 CAP_SYS_ADMIN) != 0)
247 return -EACCES; 247 return -EACCES;
diff --git a/kernel/sys.c b/kernel/sys.c
index 66a751ebf9d9..ce8129192a26 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1990,12 +1990,12 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
1990 if (arg2 != 1 || arg3 || arg4 || arg5) 1990 if (arg2 != 1 || arg3 || arg4 || arg5)
1991 return -EINVAL; 1991 return -EINVAL;
1992 1992
1993 current->no_new_privs = 1; 1993 task_set_no_new_privs(current);
1994 break; 1994 break;
1995 case PR_GET_NO_NEW_PRIVS: 1995 case PR_GET_NO_NEW_PRIVS:
1996 if (arg2 || arg3 || arg4 || arg5) 1996 if (arg2 || arg3 || arg4 || arg5)
1997 return -EINVAL; 1997 return -EINVAL;
1998 return current->no_new_privs ? 1 : 0; 1998 return task_no_new_privs(current) ? 1 : 0;
1999 case PR_GET_THP_DISABLE: 1999 case PR_GET_THP_DISABLE:
2000 if (arg2 || arg3 || arg4 || arg5) 2000 if (arg2 || arg3 || arg4 || arg5)
2001 return -EINVAL; 2001 return -EINVAL;