All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Américo Wang" <xiyou.wangcong@gmail.com>,
	"Frank Heckenbach" <f.heckenbach@fh-soft.de>,
	"Neil Horman" <nhorman@tuxdriver.com>,
	"Roland McGrath" <roland@redhat.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH] coredump: set ->group_exit_code for other CLONE_VM tasks too
Date: Sun, 7 Feb 2010 18:16:15 +0100	[thread overview]
Message-ID: <20100207171615.GA9854@redhat.com> (raw)

User visible change.

do_coredump() kills all threads which share the same ->mm but only
the coredumping process gets the proper exit_code. Other tasks which
share the same ->mm die "silently" and return status == 0 to parent.

This is historical behaviour, not actually a bug. But I think Frank
Heckenbach rightly dislikes the current behaviour. Simple test-case:

	#include <stdio.h>
	#include <unistd.h>
	#include <signal.h>
	#include <sys/wait.h>

	int main(void)
	{
		int stat;

		if (!fork()) {
			if (!vfork())
				kill(getpid(), SIGQUIT);
		}

		wait(&stat);
		printf("stat=%x\n", stat);
		return 0;
	}

Before this patch it prints "stat=0" despite the fact the child was
killed by SIGQUIT. After this patch the output is "stat=3" which
obviously makes more sense.

Even with this patch, only the task which originates the coredumping
gets "|= 0x80" if the core was actually dumped, but at least the
coredumping signal is visible to do_wait/etc.

Reported-by: Frank Heckenbach <f.heckenbach@fh-soft.de>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---

 fs/exec.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

--- V1/fs/exec.c~CD_STATUS	2009-12-18 00:20:50.000000000 +0100
+++ V1/fs/exec.c	2010-02-07 17:28:24.000000000 +0100
@@ -1536,12 +1536,13 @@ out:
 	return ispipe;
 }
 
-static int zap_process(struct task_struct *start)
+static int zap_process(struct task_struct *start, int exit_code)
 {
 	struct task_struct *t;
 	int nr = 0;
 
 	start->signal->flags = SIGNAL_GROUP_EXIT;
+	start->signal->group_exit_code = exit_code;
 	start->signal->group_stop_count = 0;
 
 	t = start;
@@ -1566,8 +1567,7 @@ static inline int zap_threads(struct tas
 	spin_lock_irq(&tsk->sighand->siglock);
 	if (!signal_group_exit(tsk->signal)) {
 		mm->core_state = core_state;
-		tsk->signal->group_exit_code = exit_code;
-		nr = zap_process(tsk);
+		nr = zap_process(tsk, exit_code);
 	}
 	spin_unlock_irq(&tsk->sighand->siglock);
 	if (unlikely(nr < 0))
@@ -1616,7 +1616,7 @@ static inline int zap_threads(struct tas
 			if (p->mm) {
 				if (unlikely(p->mm == mm)) {
 					lock_task_sighand(p, &flags);
-					nr += zap_process(p);
+					nr += zap_process(p, exit_code);
 					unlock_task_sighand(p, &flags);
 				}
 				break;


             reply	other threads:[~2010-02-07 17:17 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-07 17:16 Oleg Nesterov [this message]
2010-02-08 10:13 ` [PATCH] coredump: set ->group_exit_code for other CLONE_VM tasks too Américo Wang
2010-02-08 18:06 ` Roland McGrath

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=20100207171615.GA9854@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=f.heckenbach@fh-soft.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nhorman@tuxdriver.com \
    --cc=roland@redhat.com \
    --cc=xiyou.wangcong@gmail.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: link
Be 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.