|
@@ -243,7 +243,8 @@ static inline void spec_mitigate(struct task_struct *task,
|
|
|
}
|
|
|
|
|
|
static inline void seccomp_assign_mode(struct task_struct *task,
|
|
|
- unsigned long seccomp_mode)
|
|
|
+ unsigned long seccomp_mode,
|
|
|
+ unsigned long flags)
|
|
|
{
|
|
|
assert_spin_locked(&task->sighand->siglock);
|
|
|
|
|
@@ -253,8 +254,9 @@ static inline void seccomp_assign_mode(struct task_struct *task,
|
|
|
* filter) is set.
|
|
|
*/
|
|
|
smp_mb__before_atomic();
|
|
|
- /* Assume seccomp processes want speculation flaw mitigation. */
|
|
|
- spec_mitigate(task, PR_SPEC_STORE_BYPASS);
|
|
|
+ /* Assume default seccomp processes want spec flaw mitigation. */
|
|
|
+ if ((flags & SECCOMP_FILTER_FLAG_SPEC_ALLOW) == 0)
|
|
|
+ spec_mitigate(task, PR_SPEC_STORE_BYPASS);
|
|
|
set_tsk_thread_flag(task, TIF_SECCOMP);
|
|
|
}
|
|
|
|
|
@@ -322,7 +324,7 @@ static inline pid_t seccomp_can_sync_threads(void)
|
|
|
* without dropping the locks.
|
|
|
*
|
|
|
*/
|
|
|
-static inline void seccomp_sync_threads(void)
|
|
|
+static inline void seccomp_sync_threads(unsigned long flags)
|
|
|
{
|
|
|
struct task_struct *thread, *caller;
|
|
|
|
|
@@ -363,7 +365,8 @@ static inline void seccomp_sync_threads(void)
|
|
|
* allow one thread to transition the other.
|
|
|
*/
|
|
|
if (thread->seccomp.mode == SECCOMP_MODE_DISABLED)
|
|
|
- seccomp_assign_mode(thread, SECCOMP_MODE_FILTER);
|
|
|
+ seccomp_assign_mode(thread, SECCOMP_MODE_FILTER,
|
|
|
+ flags);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -486,7 +489,7 @@ static long seccomp_attach_filter(unsigned int flags,
|
|
|
|
|
|
/* Now that the new filter is in place, synchronize to all threads. */
|
|
|
if (flags & SECCOMP_FILTER_FLAG_TSYNC)
|
|
|
- seccomp_sync_threads();
|
|
|
+ seccomp_sync_threads(flags);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -835,7 +838,7 @@ static long seccomp_set_mode_strict(void)
|
|
|
#ifdef TIF_NOTSC
|
|
|
disable_TSC();
|
|
|
#endif
|
|
|
- seccomp_assign_mode(current, seccomp_mode);
|
|
|
+ seccomp_assign_mode(current, seccomp_mode, 0);
|
|
|
ret = 0;
|
|
|
|
|
|
out:
|
|
@@ -893,7 +896,7 @@ static long seccomp_set_mode_filter(unsigned int flags,
|
|
|
/* Do not free the successfully attached filter. */
|
|
|
prepared = NULL;
|
|
|
|
|
|
- seccomp_assign_mode(current, seccomp_mode);
|
|
|
+ seccomp_assign_mode(current, seccomp_mode, flags);
|
|
|
out:
|
|
|
spin_unlock_irq(¤t->sighand->siglock);
|
|
|
if (flags & SECCOMP_FILTER_FLAG_TSYNC)
|