Skip to content

Commit d7276e3

Browse files
keesJames Morris
authored andcommitted
seccomp: Only dump core when single-threaded
The SECCOMP_RET_KILL filter return code has always killed the current thread, not the entire process. Changing this as a side-effect of dumping core isn't a safe thing to do (a few test suites have already flagged this behavioral change). Instead, restore the RET_KILL semantics, but still dump core when a RET_KILL delivers SIGSYS to a single-threaded process. Fixes: b25e671 ("seccomp: dump core when using SECCOMP_RET_KILL") Signed-off-by: Kees Cook <keescook@chromium.org> Acked-by: Andrei Vagin <avagin@virtuozzo.com> Signed-off-by: James Morris <james.l.morris@oracle.com>
1 parent 37c8596 commit d7276e3

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

kernel/seccomp.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -643,11 +643,14 @@ static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
643643
default: {
644644
siginfo_t info;
645645
audit_seccomp(this_syscall, SIGSYS, action);
646-
/* Show the original registers in the dump. */
647-
syscall_rollback(current, task_pt_regs(current));
648-
/* Trigger a manual coredump since do_exit skips it. */
649-
seccomp_init_siginfo(&info, this_syscall, data);
650-
do_coredump(&info);
646+
/* Dump core only if this is the last remaining thread. */
647+
if (get_nr_threads(current) == 1) {
648+
/* Show the original registers in the dump. */
649+
syscall_rollback(current, task_pt_regs(current));
650+
/* Trigger a manual coredump since do_exit skips it. */
651+
seccomp_init_siginfo(&info, this_syscall, data);
652+
do_coredump(&info);
653+
}
651654
do_exit(SIGSYS);
652655
}
653656
}

0 commit comments

Comments
 (0)