Message ID | 87czst5yxh.fsf_-_@disp2133 (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [CFT}[PATCH] coredump: Limit what can interrupt coredumps | expand |
On Thu, Jun 10, 2021 at 12:01 PM Eric W. Biederman <ebiederm@xmission.com> wrote: > > diff --git a/kernel/signal.c b/kernel/signal.c > index f7c6ffcbd044..83d534deeb76 100644 > --- a/kernel/signal.c > +++ b/kernel/signal.c > @@ -943,8 +943,6 @@ static bool prepare_signal(int sig, struct task_struct *p, bool force) > sigset_t flush; > > if (signal->flags & (SIGNAL_GROUP_EXIT | SIGNAL_GROUP_COREDUMP)) { > - if (!(signal->flags & SIGNAL_GROUP_EXIT)) > - return sig == SIGKILL; > /* > * The process is in the middle of dying, nothing to do. > */ I do think this part of the patch is correct, but I'd like to know what triggered this change? It seems fairly harmless - SIGKILL used to be the only signal that was passed through in the coredump case, now you pass through all non-ignored signals. But since SIGKILL is the only signal that is relevant for the fatal_signal_pending() case, this change seems irrelevant for the coredump issue. Any other signals passed through won't matter. End result: I think removing those two lines is likely a good idea, but I also suspect it could/should just be a separate patch with a separate explanation for it. Hmm? Linus
Linus Torvalds <torvalds@linux-foundation.org> writes: > On Thu, Jun 10, 2021 at 12:01 PM Eric W. Biederman > <ebiederm@xmission.com> wrote: >> >> diff --git a/kernel/signal.c b/kernel/signal.c >> index f7c6ffcbd044..83d534deeb76 100644 >> --- a/kernel/signal.c >> +++ b/kernel/signal.c >> @@ -943,8 +943,6 @@ static bool prepare_signal(int sig, struct task_struct *p, bool force) >> sigset_t flush; >> >> if (signal->flags & (SIGNAL_GROUP_EXIT | SIGNAL_GROUP_COREDUMP)) { >> - if (!(signal->flags & SIGNAL_GROUP_EXIT)) >> - return sig == SIGKILL; >> /* >> * The process is in the middle of dying, nothing to do. >> */ > > I do think this part of the patch is correct, but I'd like to know > what triggered this change? > > It seems fairly harmless - SIGKILL used to be the only signal that was > passed through in the coredump case, now you pass through all > non-ignored signals. > > But since SIGKILL is the only signal that is relevant for the > fatal_signal_pending() case, this change seems irrelevant for the > coredump issue. Any other signals passed through won't matter. > > End result: I think removing those two lines is likely a good idea, > but I also suspect it could/should just be a separate patch with a > separate explanation for it. > > Hmm? I just didn't want those two lines hiding any other issues we might have in the coredumps. That is probably better development thinking than minimal fix thinking. I am annoyed at the moment that those two lines even exist and figure they are the confusing root cause of the problem. That if we had realized all it would take was to call fatal_signal_pending || freezing than we could have avoided a problem entirely. Eric
On Thu, Jun 10, 2021 at 12:18 PM Eric W. Biederman <ebiederm@xmission.com> wrote: > > I just didn't want those two lines hiding any other issues we might > have in the coredumps. > > That is probably better development thinking than minimal fix thinking. Well, I think we should first do the minimal targeted fix (the part in fs/coredump.c). Then we should look at whether we could do cleanups as a result of that fix. And I suspect the cleanups might bigger than the two-liner removal. The whole SIGNAL_GROUP_COREDUMP flag was introduced for this issue, See commit 403bad72b67d ("coredump: only SIGKILL should interrupt the coredumping task") which introduced this all. Now, we have since grown other users of SIGNAL_GROUP_COREDUMP - OOM hanmdling and the clear_child_tid thing in mm_release(). So maybe we should keep SIGNAL_GROUP_COREDUMP around. So maybe only those two lines end up being the ones to remove, but I'd really like to think of it as a separate thing from the fix itself. Linus
diff --git a/fs/coredump.c b/fs/coredump.c index 2868e3e171ae..c3d8fc14b993 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -519,7 +519,7 @@ static bool dump_interrupted(void) * but then we need to teach dump_write() to restart and clear * TIF_SIGPENDING. */ - return signal_pending(current); + return fatal_signal_pending(current) || freezing(current); } static void wait_for_dump_helpers(struct file *file) diff --git a/kernel/signal.c b/kernel/signal.c index f7c6ffcbd044..83d534deeb76 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -943,8 +943,6 @@ static bool prepare_signal(int sig, struct task_struct *p, bool force) sigset_t flush; if (signal->flags & (SIGNAL_GROUP_EXIT | SIGNAL_GROUP_COREDUMP)) { - if (!(signal->flags & SIGNAL_GROUP_EXIT)) - return sig == SIGKILL; /* * The process is in the middle of dying, nothing to do. */