aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/seccomp.c
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2014-06-25 18:38:02 -0400
committerKees Cook <keescook@chromium.org>2014-07-18 15:13:36 -0400
commit1f41b450416e689b9b7c8bfb750a98604f687a9b (patch)
treef3429ad4a8e75c3e1f601af95113e19f88da4560 /kernel/seccomp.c
parentd78ab02c2c194257a03355fbb79eb721b381d105 (diff)
seccomp: extract check/assign mode helpers
To support splitting mode 1 from mode 2, extract the mode checking and assignment logic into common functions. 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/seccomp.c')
-rw-r--r--kernel/seccomp.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/kernel/seccomp.c b/kernel/seccomp.c
index afb916c7e890..9df7def86c3b 100644
--- a/kernel/seccomp.c
+++ b/kernel/seccomp.c
@@ -194,7 +194,23 @@ static u32 seccomp_run_filters(int syscall)
194 } 194 }
195 return ret; 195 return ret;
196} 196}
197#endif /* CONFIG_SECCOMP_FILTER */
197 198
199static inline bool seccomp_may_assign_mode(unsigned long seccomp_mode)
200{
201 if (current->seccomp.mode && current->seccomp.mode != seccomp_mode)
202 return false;
203
204 return true;
205}
206
207static inline void seccomp_assign_mode(unsigned long seccomp_mode)
208{
209 current->seccomp.mode = seccomp_mode;
210 set_tsk_thread_flag(current, TIF_SECCOMP);
211}
212
213#ifdef CONFIG_SECCOMP_FILTER
198/** 214/**
199 * seccomp_attach_filter: Attaches a seccomp filter to current. 215 * seccomp_attach_filter: Attaches a seccomp filter to current.
200 * @fprog: BPF program to install 216 * @fprog: BPF program to install
@@ -490,8 +506,7 @@ static long seccomp_set_mode(unsigned long seccomp_mode, char __user *filter)
490{ 506{
491 long ret = -EINVAL; 507 long ret = -EINVAL;
492 508
493 if (current->seccomp.mode && 509 if (!seccomp_may_assign_mode(seccomp_mode))
494 current->seccomp.mode != seccomp_mode)
495 goto out; 510 goto out;
496 511
497 switch (seccomp_mode) { 512 switch (seccomp_mode) {
@@ -512,8 +527,7 @@ static long seccomp_set_mode(unsigned long seccomp_mode, char __user *filter)
512 goto out; 527 goto out;
513 } 528 }
514 529
515 current->seccomp.mode = seccomp_mode; 530 seccomp_assign_mode(seccomp_mode);
516 set_thread_flag(TIF_SECCOMP);
517out: 531out:
518 return ret; 532 return ret;
519} 533}