aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/sched.h
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 /include/linux/sched.h
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 'include/linux/sched.h')
-rw-r--r--include/linux/sched.h18
1 files changed, 15 insertions, 3 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 306f4f0c987a..0fd19055bb64 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1307,13 +1307,12 @@ struct task_struct {
1307 * execve */ 1307 * execve */
1308 unsigned in_iowait:1; 1308 unsigned in_iowait:1;
1309 1309
1310 /* task may not gain privileges */
1311 unsigned no_new_privs:1;
1312
1313 /* Revert to default priority/policy when forking */ 1310 /* Revert to default priority/policy when forking */
1314 unsigned sched_reset_on_fork:1; 1311 unsigned sched_reset_on_fork:1;
1315 unsigned sched_contributes_to_load:1; 1312 unsigned sched_contributes_to_load:1;
1316 1313
1314 unsigned long atomic_flags; /* Flags needing atomic access. */
1315
1317 pid_t pid; 1316 pid_t pid;
1318 pid_t tgid; 1317 pid_t tgid;
1319 1318
@@ -1967,6 +1966,19 @@ static inline void memalloc_noio_restore(unsigned int flags)
1967 current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; 1966 current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags;
1968} 1967}
1969 1968
1969/* Per-process atomic flags. */
1970#define PFA_NO_NEW_PRIVS 0x00000001 /* May not gain new privileges. */
1971
1972static inline bool task_no_new_privs(struct task_struct *p)
1973{
1974 return test_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags);
1975}
1976
1977static inline void task_set_no_new_privs(struct task_struct *p)
1978{
1979 set_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags);
1980}
1981
1970/* 1982/*
1971 * task->jobctl flags 1983 * task->jobctl flags
1972 */ 1984 */