All of lore.kernel.org
 help / color / mirror / Atom feed
From: Evgeniy Polyakov <zbr@ioremap.net>
To: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Oleg Nesterov <oleg@redhat.com>,
	Evgeny Polyakov <johnpol@2ka.mipt.ru>,
	Scott James Remnant <scott@ubuntu.com>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	Matt Helsley <matthltc@us.ibm.com>,
	"David S. Miller" <davem@davemloft.net>,
	netdev@vger.kernel.org
Subject: Re: [PATCH] connector: Fix sid connector (was: Badness at kernel/softirq.c:143...)
Date: Tue, 29 Sep 2009 18:07:18 +0400	[thread overview]
Message-ID: <20090929140718.GA23858@ioremap.net> (raw)
In-Reply-To: <200909291547.21528.borntraeger@de.ibm.com>

On Tue, Sep 29, 2009 at 03:47:21PM +0200, Christian Borntraeger (borntraeger@de.ibm.com) wrote:
> Ok,  can confirm that this patch fixes my problem, but I am not sure if the
> intended behaviour is still working as expected.

Your patch breaks assumption that task_session(current->group_leader) is
not equal to new session id, but to check task_session() we need either
rcu or task lock. Also setsid() return value is not zero or negative
error, but new session ID or negative error, so I believe attached patch
is a proper fix, although it looks rather ugly.

Also proc_sid_connector() uses GFP_KERNEL allocation which is way too
wrong to use under any locks.

Something like this (not tested :)

diff --git a/kernel/exit.c b/kernel/exit.c
index 5859f59..1565baf 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -359,10 +359,8 @@ void __set_special_pids(struct pid *pid)
 {
 	struct task_struct *curr = current->group_leader;
 
-	if (task_session(curr) != pid) {
+	if (task_session(curr) != pid)
 		change_pid(curr, PIDTYPE_SID, pid);
-		proc_sid_connector(curr);
-	}
 
 	if (task_pgrp(curr) != pid)
 		change_pid(curr, PIDTYPE_PGID, pid);
diff --git a/kernel/sys.c b/kernel/sys.c
index 255475d..b852a8b 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1090,6 +1090,7 @@ SYSCALL_DEFINE0(setsid)
 	struct pid *sid = task_pid(group_leader);
 	pid_t session = pid_vnr(sid);
 	int err = -EPERM;
+	int send_cn = 0;
 
 	write_lock_irq(&tasklist_lock);
 	/* Fail if I am already a session leader */
@@ -1104,12 +1105,18 @@ SYSCALL_DEFINE0(setsid)
 
 	group_leader->signal->leader = 1;
 	__set_special_pids(sid);
+	if (task_session(group_leader) != sid)
+		send_cn = 1;
 
 	proc_clear_tty(group_leader);
 
 	err = session;
 out:
 	write_unlock_irq(&tasklist_lock);
+
+	if (send_cn)
+		proc_sid_connector(group_leader);
+
 	return err;
 }
 

-- 
	Evgeniy Polyakov

  parent reply	other threads:[~2009-09-29 14:07 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-25  9:23 2.3.31++: Badness at kernel/softirq.c:143 due to new session leader connector Christian Borntraeger
2009-09-29 10:26 ` Christian Borntraeger
     [not found]   ` <fbbbe0a028fa.4ac1f1c0@2ka.mipt.ru>
2009-09-29 13:24     ` Oleg Nesterov
2009-09-29 13:47       ` [PATCH] connector: Fix sid connector (was: Badness at kernel/softirq.c:143...) Christian Borntraeger
2009-09-29 13:59         ` Oleg Nesterov
2009-09-29 14:07         ` Evgeniy Polyakov [this message]
2009-09-29 14:15           ` Christian Borntraeger
2009-09-29 14:25           ` Oleg Nesterov
2009-09-29 14:45             ` Oleg Nesterov
2009-09-29 15:12               ` Christian Borntraeger
2009-09-29 16:28                 ` Oleg Nesterov
2009-09-30  6:43                   ` [PATCH] connector: Fix regression introduced by sid connector Christian Borntraeger
2009-10-01 21:14                     ` Andrew Morton
2009-10-01 22:29                       ` Oleg Nesterov
2009-10-02  6:16                       ` Christian Borntraeger
2009-10-14  0:53                         ` David Rientjes
2009-09-29 17:07                 ` [PATCH] connector: Fix sid connector (was: Badness at kernel/softirq.c:143...) Evgeniy Polyakov
2009-09-29 14:54             ` Evgeniy Polyakov
2009-09-29 15:36               ` Oleg Nesterov
2009-09-29 17:08                 ` Evgeniy Polyakov
2009-09-29 13:22 ` 2.3.31++: Badness at kernel/softirq.c:143 due to new session leader connector 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=20090929140718.GA23858@ioremap.net \
    --to=zbr@ioremap.net \
    --cc=borntraeger@de.ibm.com \
    --cc=davem@davemloft.net \
    --cc=johnpol@2ka.mipt.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthltc@us.ibm.com \
    --cc=netdev@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=scott@ubuntu.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.