From: ebiederm@xmission.com (Eric W. Biederman) To: Oleg Nesterov <oleg@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org>, Aleksa Sarai <asarai@suse.com>, Andy Lutomirski <luto@amacapital.net>, Attila Fazekas <afazekas@redhat.com>, Jann Horn <jann@thejh.net>, Kees Cook <keescook@chromium.org>, Michal Hocko <mhocko@kernel.org>, Ulrich Obergfell <uobergfe@redhat.com>, linux-kernel@vger.kernel.org, <linux-api@vger.kernel.org> Subject: [RFC][PATCH] exec: Don't wait for ptraced threads to be reaped. Date: Fri, 03 Mar 2017 14:11:16 -0600 [thread overview] Message-ID: <87lgsmunmj.fsf_-_@xmission.com> (raw) In-Reply-To: <87tw7aunuh.fsf@xmission.com> (Eric W. Biederman's message of "Fri, 03 Mar 2017 14:06:30 -0600") Ever since CLONE_THREAD support was added to the kernel it has been possible to dead-lock userspace by ptracing a process and not reaping it's child threads. With use of the cred_guard_mutex in proc the ways userspace can unknowningly trigger a dead-lock have grown. Which makes a simple -f strace on a program that performs a mult-threaded exec unsafe. #include <unistd.h> #include <signal.h> #include <sys/ptrace.h> #include <pthread.h> void *thread(void *arg) { ptrace(PTRACE_TRACEME, 0,0,0); return NULL; } int main(void) { int pid = fork(); if (!pid) { pthread_t pt; pthread_create(&pt, NULL, thread, NULL); pthread_join(pt, NULL); execlp("echo", "echo", "passed", NULL); } sleep(1); // or anything else which needs ->cred_guard_mutex, // say open(/proc/$pid/mem) ptrace(PTRACE_ATTACH, pid, 0,0); kill(pid, SIGCONT); return 0; } Sovle this by modifying exec to only wait until all of the other threads are zombies, and not waiting until the other threads are reaped. As well as simplifying the userspace semantics this simplifies the code. Reported-by: Ulrich Obergfell <uobergfe@redhat.com> Reported-by: Attila Fazekas <afazekas@redhat.com> Reported-by: Aleksa Sarai <asarai@suse.com> Reported-by: Oleg Nesterov <oleg@redhat.com> Fixes: v2.4.0 Cc: stable@vger.kernel.org Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> --- fs/exec.c | 31 +++++-------------------------- include/linux/sched.h | 5 ++--- kernel/exit.c | 18 +++++------------- kernel/signal.c | 6 +----- 4 files changed, 13 insertions(+), 47 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index 698a86094f76..f78205a72304 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1065,11 +1065,8 @@ static int de_thread(struct task_struct *tsk) } sig->group_exit_task = tsk; - sig->notify_count = zap_other_threads(tsk); - if (!thread_group_leader(tsk)) - sig->notify_count--; - - while (sig->notify_count) { + zap_other_threads(tsk); + while (atomic_read(&sig->live) > 1) { __set_current_state(TASK_KILLABLE); spin_unlock_irq(lock); schedule(); @@ -1081,29 +1078,13 @@ static int de_thread(struct task_struct *tsk) /* * At this point all other threads have exited, all we have to - * do is to wait for the thread group leader to become inactive, - * and to assume its PID: + * do is to assume the PID of the thread group leader. */ if (!thread_group_leader(tsk)) { struct task_struct *leader = tsk->group_leader; - for (;;) { - threadgroup_change_begin(tsk); - write_lock_irq(&tasklist_lock); - /* - * Do this under tasklist_lock to ensure that - * exit_notify() can't miss ->group_exit_task - */ - sig->notify_count = -1; - if (likely(leader->exit_state)) - break; - __set_current_state(TASK_KILLABLE); - write_unlock_irq(&tasklist_lock); - threadgroup_change_end(tsk); - schedule(); - if (unlikely(__fatal_signal_pending(tsk))) - goto killed; - } + threadgroup_change_begin(tsk); + write_lock_irq(&tasklist_lock); /* * The only record we have of the real-time age of a @@ -1163,7 +1144,6 @@ static int de_thread(struct task_struct *tsk) } sig->group_exit_task = NULL; - sig->notify_count = 0; no_thread_group: /* we have changed execution domain */ @@ -1204,7 +1184,6 @@ static int de_thread(struct task_struct *tsk) /* protects against exit_notify() and __exit_signal() */ read_lock(&tasklist_lock); sig->group_exit_task = NULL; - sig->notify_count = 0; read_unlock(&tasklist_lock); return -EAGAIN; } diff --git a/include/linux/sched.h b/include/linux/sched.h index 6261bfc12853..ff6aa76beac5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -711,11 +711,10 @@ struct signal_struct { /* thread group exit support */ int group_exit_code; /* overloaded: - * - notify group_exit_task when ->count is equal to notify_count + * - notify group_exit_task when ->live is equal to 1 * - everyone except group_exit_task is stopped during signal delivery * of fatal signals, group_exit_task processes the signal. */ - int notify_count; struct task_struct *group_exit_task; /* thread group stop support, overloads group_exit_code too */ @@ -2763,7 +2762,7 @@ extern __must_check bool do_notify_parent(struct task_struct *, int); extern void __wake_up_parent(struct task_struct *p, struct task_struct *parent); extern void force_sig(int, struct task_struct *); extern int send_sig(int, struct task_struct *, int); -extern int zap_other_threads(struct task_struct *p); +extern void zap_other_threads(struct task_struct *p); extern struct sigqueue *sigqueue_alloc(void); extern void sigqueue_free(struct sigqueue *); extern int send_sigqueue(struct sigqueue *, struct task_struct *, int group); diff --git a/kernel/exit.c b/kernel/exit.c index 5cfbd595f918..dc9bc2bdb45a 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -111,13 +111,6 @@ static void __exit_signal(struct task_struct *tsk) tty = sig->tty; sig->tty = NULL; } else { - /* - * If there is any task waiting for the group exit - * then notify it: - */ - if (sig->notify_count > 0 && !--sig->notify_count) - wake_up_process(sig->group_exit_task); - if (tsk == sig->curr_target) sig->curr_target = next_thread(tsk); } @@ -701,10 +694,6 @@ static void exit_notify(struct task_struct *tsk, int group_dead) tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE; if (tsk->exit_state == EXIT_DEAD) list_add(&tsk->ptrace_entry, &dead); - - /* mt-exec, de_thread() is waiting for group leader */ - if (unlikely(tsk->signal->notify_count < 0)) - wake_up_process(tsk->signal->group_exit_task); write_unlock_irq(&tasklist_lock); list_for_each_entry_safe(p, n, &dead, ptrace_entry) { @@ -740,7 +729,7 @@ static inline void check_stack_usage(void) {} void __noreturn do_exit(long code) { struct task_struct *tsk = current; - int group_dead; + int group_left, group_dead; TASKS_RCU(int tasks_rcu_i); profile_task_exit(tsk); @@ -809,7 +798,8 @@ void __noreturn do_exit(long code) if (tsk->mm) sync_mm_rss(tsk->mm); acct_update_integrals(tsk); - group_dead = atomic_dec_and_test(&tsk->signal->live); + group_left = atomic_dec_return(&tsk->signal->live); + group_dead = group_left == 0; if (group_dead) { #ifdef CONFIG_POSIX_TIMERS hrtimer_cancel(&tsk->signal->real_timer); @@ -818,6 +808,8 @@ void __noreturn do_exit(long code) if (tsk->mm) setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm); } + if ((group_left == 1) && tsk->signal->group_exit_task) + wake_up_process(tsk->signal->group_exit_task); acct_collect(code, group_dead); if (group_dead) tty_audit_exit(); diff --git a/kernel/signal.c b/kernel/signal.c index fbbab5a7c84d..17312c71f1ae 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1191,16 +1191,14 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) /* * Nuke all other threads in the group. */ -int zap_other_threads(struct task_struct *p) +void zap_other_threads(struct task_struct *p) { struct task_struct *t = p; - int count = 0; p->signal->group_stop_count = 0; while_each_thread(p, t) { task_clear_jobctl_pending(t, JOBCTL_PENDING_MASK); - count++; /* Don't bother with already dead threads */ if (t->exit_state) @@ -1208,8 +1206,6 @@ int zap_other_threads(struct task_struct *p) sigaddset(&t->pending.signal, SIGKILL); signal_wake_up(t, 1); } - - return count; } struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, -- 2.10.1
WARNING: multiple messages have this Message-ID (diff)
From: ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org (Eric W. Biederman) To: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>, Aleksa Sarai <asarai-IBi9RG/b67k@public.gmane.org>, Andy Lutomirski <luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org>, Attila Fazekas <afazekas-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>, Jann Horn <jann-XZ1E9jl8jIdeoWH0uzbU5w@public.gmane.org>, Kees Cook <keescook-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, Michal Hocko <mhocko-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, Ulrich Obergfell <uobergfe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: [RFC][PATCH] exec: Don't wait for ptraced threads to be reaped. Date: Fri, 03 Mar 2017 14:11:16 -0600 [thread overview] Message-ID: <87lgsmunmj.fsf_-_@xmission.com> (raw) In-Reply-To: <87tw7aunuh.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org> (Eric W. Biederman's message of "Fri, 03 Mar 2017 14:06:30 -0600") Ever since CLONE_THREAD support was added to the kernel it has been possible to dead-lock userspace by ptracing a process and not reaping it's child threads. With use of the cred_guard_mutex in proc the ways userspace can unknowningly trigger a dead-lock have grown. Which makes a simple -f strace on a program that performs a mult-threaded exec unsafe. #include <unistd.h> #include <signal.h> #include <sys/ptrace.h> #include <pthread.h> void *thread(void *arg) { ptrace(PTRACE_TRACEME, 0,0,0); return NULL; } int main(void) { int pid = fork(); if (!pid) { pthread_t pt; pthread_create(&pt, NULL, thread, NULL); pthread_join(pt, NULL); execlp("echo", "echo", "passed", NULL); } sleep(1); // or anything else which needs ->cred_guard_mutex, // say open(/proc/$pid/mem) ptrace(PTRACE_ATTACH, pid, 0,0); kill(pid, SIGCONT); return 0; } Sovle this by modifying exec to only wait until all of the other threads are zombies, and not waiting until the other threads are reaped. As well as simplifying the userspace semantics this simplifies the code. Reported-by: Ulrich Obergfell <uobergfe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Reported-by: Attila Fazekas <afazekas-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Reported-by: Aleksa Sarai <asarai-IBi9RG/b67k@public.gmane.org> Reported-by: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Fixes: v2.4.0 Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Signed-off-by: "Eric W. Biederman" <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org> --- fs/exec.c | 31 +++++-------------------------- include/linux/sched.h | 5 ++--- kernel/exit.c | 18 +++++------------- kernel/signal.c | 6 +----- 4 files changed, 13 insertions(+), 47 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index 698a86094f76..f78205a72304 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1065,11 +1065,8 @@ static int de_thread(struct task_struct *tsk) } sig->group_exit_task = tsk; - sig->notify_count = zap_other_threads(tsk); - if (!thread_group_leader(tsk)) - sig->notify_count--; - - while (sig->notify_count) { + zap_other_threads(tsk); + while (atomic_read(&sig->live) > 1) { __set_current_state(TASK_KILLABLE); spin_unlock_irq(lock); schedule(); @@ -1081,29 +1078,13 @@ static int de_thread(struct task_struct *tsk) /* * At this point all other threads have exited, all we have to - * do is to wait for the thread group leader to become inactive, - * and to assume its PID: + * do is to assume the PID of the thread group leader. */ if (!thread_group_leader(tsk)) { struct task_struct *leader = tsk->group_leader; - for (;;) { - threadgroup_change_begin(tsk); - write_lock_irq(&tasklist_lock); - /* - * Do this under tasklist_lock to ensure that - * exit_notify() can't miss ->group_exit_task - */ - sig->notify_count = -1; - if (likely(leader->exit_state)) - break; - __set_current_state(TASK_KILLABLE); - write_unlock_irq(&tasklist_lock); - threadgroup_change_end(tsk); - schedule(); - if (unlikely(__fatal_signal_pending(tsk))) - goto killed; - } + threadgroup_change_begin(tsk); + write_lock_irq(&tasklist_lock); /* * The only record we have of the real-time age of a @@ -1163,7 +1144,6 @@ static int de_thread(struct task_struct *tsk) } sig->group_exit_task = NULL; - sig->notify_count = 0; no_thread_group: /* we have changed execution domain */ @@ -1204,7 +1184,6 @@ static int de_thread(struct task_struct *tsk) /* protects against exit_notify() and __exit_signal() */ read_lock(&tasklist_lock); sig->group_exit_task = NULL; - sig->notify_count = 0; read_unlock(&tasklist_lock); return -EAGAIN; } diff --git a/include/linux/sched.h b/include/linux/sched.h index 6261bfc12853..ff6aa76beac5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -711,11 +711,10 @@ struct signal_struct { /* thread group exit support */ int group_exit_code; /* overloaded: - * - notify group_exit_task when ->count is equal to notify_count + * - notify group_exit_task when ->live is equal to 1 * - everyone except group_exit_task is stopped during signal delivery * of fatal signals, group_exit_task processes the signal. */ - int notify_count; struct task_struct *group_exit_task; /* thread group stop support, overloads group_exit_code too */ @@ -2763,7 +2762,7 @@ extern __must_check bool do_notify_parent(struct task_struct *, int); extern void __wake_up_parent(struct task_struct *p, struct task_struct *parent); extern void force_sig(int, struct task_struct *); extern int send_sig(int, struct task_struct *, int); -extern int zap_other_threads(struct task_struct *p); +extern void zap_other_threads(struct task_struct *p); extern struct sigqueue *sigqueue_alloc(void); extern void sigqueue_free(struct sigqueue *); extern int send_sigqueue(struct sigqueue *, struct task_struct *, int group); diff --git a/kernel/exit.c b/kernel/exit.c index 5cfbd595f918..dc9bc2bdb45a 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -111,13 +111,6 @@ static void __exit_signal(struct task_struct *tsk) tty = sig->tty; sig->tty = NULL; } else { - /* - * If there is any task waiting for the group exit - * then notify it: - */ - if (sig->notify_count > 0 && !--sig->notify_count) - wake_up_process(sig->group_exit_task); - if (tsk == sig->curr_target) sig->curr_target = next_thread(tsk); } @@ -701,10 +694,6 @@ static void exit_notify(struct task_struct *tsk, int group_dead) tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE; if (tsk->exit_state == EXIT_DEAD) list_add(&tsk->ptrace_entry, &dead); - - /* mt-exec, de_thread() is waiting for group leader */ - if (unlikely(tsk->signal->notify_count < 0)) - wake_up_process(tsk->signal->group_exit_task); write_unlock_irq(&tasklist_lock); list_for_each_entry_safe(p, n, &dead, ptrace_entry) { @@ -740,7 +729,7 @@ static inline void check_stack_usage(void) {} void __noreturn do_exit(long code) { struct task_struct *tsk = current; - int group_dead; + int group_left, group_dead; TASKS_RCU(int tasks_rcu_i); profile_task_exit(tsk); @@ -809,7 +798,8 @@ void __noreturn do_exit(long code) if (tsk->mm) sync_mm_rss(tsk->mm); acct_update_integrals(tsk); - group_dead = atomic_dec_and_test(&tsk->signal->live); + group_left = atomic_dec_return(&tsk->signal->live); + group_dead = group_left == 0; if (group_dead) { #ifdef CONFIG_POSIX_TIMERS hrtimer_cancel(&tsk->signal->real_timer); @@ -818,6 +808,8 @@ void __noreturn do_exit(long code) if (tsk->mm) setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm); } + if ((group_left == 1) && tsk->signal->group_exit_task) + wake_up_process(tsk->signal->group_exit_task); acct_collect(code, group_dead); if (group_dead) tty_audit_exit(); diff --git a/kernel/signal.c b/kernel/signal.c index fbbab5a7c84d..17312c71f1ae 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1191,16 +1191,14 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) /* * Nuke all other threads in the group. */ -int zap_other_threads(struct task_struct *p) +void zap_other_threads(struct task_struct *p) { struct task_struct *t = p; - int count = 0; p->signal->group_stop_count = 0; while_each_thread(p, t) { task_clear_jobctl_pending(t, JOBCTL_PENDING_MASK); - count++; /* Don't bother with already dead threads */ if (t->exit_state) @@ -1208,8 +1206,6 @@ int zap_other_threads(struct task_struct *p) sigaddset(&t->pending.signal, SIGKILL); signal_wake_up(t, 1); } - - return count; } struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, -- 2.10.1
next prev parent reply other threads:[~2017-03-03 20:16 UTC|newest] Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-02-13 14:14 [PATCH 0/2] fix the traced mt-exec deadlock Oleg Nesterov 2017-02-13 14:15 ` [PATCH 1/2] exec: don't wait for zombie threads with cred_guard_mutex held Oleg Nesterov 2017-02-13 16:12 ` kbuild test robot 2017-02-13 16:47 ` Oleg Nesterov 2017-02-13 16:39 ` kbuild test robot 2017-02-13 17:27 ` Mika Penttilä 2017-02-13 18:01 ` Oleg Nesterov 2017-02-13 18:04 ` [PATCH V2 " Oleg Nesterov 2017-02-16 11:42 ` Eric W. Biederman 2017-02-20 15:22 ` Oleg Nesterov 2017-02-20 15:36 ` Oleg Nesterov 2017-02-20 22:30 ` Eric W. Biederman 2017-02-21 17:53 ` Oleg Nesterov 2017-02-21 20:20 ` Eric W. Biederman 2017-02-22 17:41 ` Oleg Nesterov 2017-02-17 4:42 ` Eric W. Biederman 2017-02-20 15:50 ` Oleg Nesterov 2017-02-13 14:15 ` [PATCH 2/2] ptrace: ensure PTRACE_EVENT_EXIT won't stop if the tracee is killed by exec Oleg Nesterov 2017-02-24 16:03 ` [PATCH 0/2] fix the traced mt-exec deadlock Oleg Nesterov 2017-03-03 1:05 ` Eric W. Biederman 2017-03-03 17:33 ` Oleg Nesterov 2017-03-03 18:23 ` Eric W. Biederman 2017-03-03 18:23 ` Eric W. Biederman 2017-03-03 18:59 ` Eric W. Biederman 2017-03-03 18:59 ` Eric W. Biederman 2017-03-03 20:06 ` Eric W. Biederman 2017-03-03 20:06 ` Eric W. Biederman 2017-03-03 20:11 ` Eric W. Biederman [this message] 2017-03-03 20:11 ` [RFC][PATCH] exec: Don't wait for ptraced threads to be reaped Eric W. Biederman 2017-03-04 17:03 ` Oleg Nesterov 2017-03-30 8:07 ` Eric W. Biederman 2017-04-01 5:11 ` [RFC][PATCH 0/2] exec: Fixing ptrace'd mulit-threaded hang Eric W. Biederman 2017-04-01 5:11 ` Eric W. Biederman 2017-04-01 5:14 ` [RFC][PATCH 1/2] sighand: Count each thread group once in sighand_struct Eric W. Biederman 2017-04-01 5:14 ` Eric W. Biederman 2017-04-01 5:16 ` [RFC][PATCH 2/2] exec: If possible don't wait for ptraced threads to be reaped Eric W. Biederman 2017-04-01 5:16 ` Eric W. Biederman 2017-04-02 15:35 ` Oleg Nesterov 2017-04-02 15:35 ` Oleg Nesterov 2017-04-02 18:53 ` Eric W. Biederman 2017-04-02 18:53 ` Eric W. Biederman 2017-04-03 18:12 ` Oleg Nesterov 2017-04-03 18:12 ` Oleg Nesterov 2017-04-03 21:04 ` Eric W. Biederman 2017-04-05 16:44 ` Oleg Nesterov 2017-04-02 15:38 ` [RFC][PATCH 0/2] exec: Fixing ptrace'd mulit-threaded hang Oleg Nesterov 2017-04-02 15:38 ` Oleg Nesterov 2017-04-02 22:50 ` [RFC][PATCH v2 0/5] " Eric W. Biederman 2017-04-02 22:50 ` Eric W. Biederman 2017-04-02 22:51 ` [RFC][PATCH v2 1/5] ptrace: Don't wait in PTRACE_O_TRACEEXIT for exec or coredump Eric W. Biederman 2017-04-02 22:51 ` Eric W. Biederman 2017-04-05 16:19 ` Oleg Nesterov 2017-04-02 22:51 ` [RFC][PATCH v2 2/5] sighand: Count each thread group once in sighand_struct Eric W. Biederman 2017-04-02 22:51 ` Eric W. Biederman 2017-04-02 22:52 ` [RFC][PATCH v2 3/5] clone: Disallown CLONE_THREAD with a shared sighand_struct Eric W. Biederman 2017-04-02 22:52 ` Eric W. Biederman 2017-04-05 16:24 ` Oleg Nesterov 2017-04-05 16:24 ` Oleg Nesterov 2017-04-05 17:34 ` Eric W. Biederman 2017-04-05 18:11 ` Oleg Nesterov 2017-04-02 22:53 ` [RFC][PATCH v2 4/5] exec: If possible don't wait for ptraced threads to be reaped Eric W. Biederman 2017-04-02 22:53 ` Eric W. Biederman 2017-04-05 16:15 ` Oleg Nesterov 2017-04-02 22:57 ` [RFC][PATCH v2 5/5] signal: Don't allow accessing signal_struct by old threads after exec Eric W. Biederman 2017-04-02 22:57 ` Eric W. Biederman 2017-04-05 16:18 ` Oleg Nesterov 2017-04-05 16:18 ` Oleg Nesterov 2017-04-05 18:16 ` Eric W. Biederman 2017-04-05 18:16 ` Eric W. Biederman 2017-04-06 15:48 ` Oleg Nesterov 2017-04-06 15:48 ` Oleg Nesterov 2017-04-02 16:15 ` [RFC][PATCH] exec: Don't wait for ptraced threads to be reaped Oleg Nesterov 2017-04-02 16:15 ` Oleg Nesterov 2017-04-02 21:07 ` Eric W. Biederman 2017-04-02 21:07 ` Eric W. Biederman 2017-04-03 18:37 ` Oleg Nesterov 2017-04-03 18:37 ` Oleg Nesterov 2017-04-03 22:49 ` Eric W. Biederman 2017-04-03 22:49 ` Eric W. Biederman 2017-04-03 22:49 ` scope of cred_guard_mutex Eric W. Biederman 2017-04-03 22:49 ` Eric W. Biederman 2017-04-05 16:08 ` Oleg Nesterov 2017-04-05 16:11 ` Kees Cook 2017-04-05 17:53 ` Eric W. Biederman 2017-04-05 18:15 ` Oleg Nesterov 2017-04-06 15:55 ` Oleg Nesterov 2017-04-06 15:55 ` Oleg Nesterov 2017-04-07 22:07 ` Kees Cook 2017-04-07 22:07 ` Kees Cook 2017-09-04 3:19 ` [RFC][PATCH] exec: Don't wait for ptraced threads to be reaped Robert O'Callahan 2017-09-04 3:19 ` Robert O'Callahan 2017-03-04 16:54 ` [PATCH 0/2] fix the traced mt-exec deadlock Oleg Nesterov 2017-03-04 16:54 ` Oleg Nesterov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=87lgsmunmj.fsf_-_@xmission.com \ --to=ebiederm@xmission.com \ --cc=afazekas@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=asarai@suse.com \ --cc=jann@thejh.net \ --cc=keescook@chromium.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@amacapital.net \ --cc=mhocko@kernel.org \ --cc=oleg@redhat.com \ --cc=uobergfe@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.