On Thu, Jul 10, 2014 at 8:08 AM, Oleg Nesterov <oleg@xxxxxxxxxx> wrote: > On 07/10, Kees Cook wrote: >> >> On Wed, Jul 9, 2014 at 11:05 AM, Oleg Nesterov <oleg@xxxxxxxxxx> wrote: >> > >> >> + /* >> >> + * Make sure we cannot change seccomp or nnp state via TSYNC >> >> + * while another thread is in the middle of calling exec. >> >> + */ >> >> + if (flags & SECCOMP_FILTER_FLAG_TSYNC && >> >> + mutex_lock_killable(¤t->signal->cred_guard_mutex)) >> >> + goto out_free; >> > >> > -EINVAL looks a bit confusing in this case, but this is cosemtic because >> > userspace won't see this error-code anyway. >> >> Happy to use whatever since, as you say, it's cosmetic. Perhaps -EAGAIN? > > Or -EINTR. I do not really mind, I only mentioned this because I had another > nit. > >> >> spin_lock_irq(¤t->sighand->siglock); >> >> + if (unlikely(signal_group_exit(current->signal))) { >> >> + /* If thread is dying, return to process the signal. */ >> > >> > OK, this doesn't hurt, but why? >> > >> > You could check __fatal_signal_pending() with the same effect. And since >> > we hold this mutex, exec (de_thread) can be the source of that SIGKILL. >> > We take this mutex specially to avoid the race with exec. >> > >> > So why do we need to abort if we race with kill() or exit_grouo() ? >> >> In my initial code inspection that we could block waiting for the >> cred_guard mutex, with exec holding it, exec would schedule death in >> de_thread, and then once it released, the tsync thread would try to >> keep running. >> >> However, in looking at this again, now I'm concerned this produces a >> dead-lock in de_thread, since it waits for all threads to actually >> die, but tsync will be waiting with the killable mutex. > > That is why you should always use _killable (or _interruptible) if you > want to take ->cred_guard_mutex. > > If this thread races with de_thread() which holds this mutex, it will > be killed and mutex_lock_killable() will fail. > > (to clarify; this deadlock is not "fatal", de_thread() can be killed too, > but this doesn't really matter). > >> So I think I got too defensive when I read the top of de_thread where >> it checks for pending signals itself. >> >> It seems like I can just safely remove the singal_group_exit checks? >> The other paths (non-tsync seccomp_set_mode_filter, and >> seccomp_set_mode_strict) > > Yes, I missed another signal_group_exit() in seccomp_set_mode_strict(). > It looks equally unneeded. > >> I can't decide which feels cleaner: just letting stuff >> clean up naturally on death or to short-circuit after taking >> sighand->siglock. > > I'd prefer to simply remove the singal_group_exit checks. > > I won't argue if you prefer to keep them, but then please add a comment > to explain that this is not needed for correctness. > > Because otherwise the code looks confusing, as if there is a subtle reason > why we must not do this if killed. Sounds good! I'll clean it all up for v10. -Kees -- Kees Cook Chrome OS Security -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html