From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
To: oleg@redhat.com, ebiederm@xmission.com, roland@redhat.com,
bastian@waldi.eu.org
Cc: daniel@hozac.com, xemul@openvz.org, containers@lists.osdl.org,
linux-kernel@vger.kernel.org, sukadev@us.ibm.com
Subject: [RFC][PATCH 5/6][v3] Protect cinit from unblocked SIG_DFL signals
Date: Sat, 20 Dec 2008 16:54:54 -0800 [thread overview]
Message-ID: <20081221005454.GE5025@us.ibm.com> (raw)
In-Reply-To: <20081221005106.GA4912@us.ibm.com>
From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Date: Sat, 20 Dec 2008 13:25:24 -0800
Subject: [RFC][PATCH 5/6][v3] Protect cinit from unblocked SIG_DFL signals
Drop early any SIG_DFL or SIG_IGN signals to container-init from within
the same container. But queue SIGSTOP and SIGKILL to the container-init
if they are from an acnestor container.
Blocked, fatal signals (i.e when SIG_DFL is to terminate) from within the
container can still terminate the container-init. That will be addressed
in the next patch.
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
---
kernel/signal.c | 43 ++++++++++++++++++++++++++++++++++---------
1 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 058b4c0..2dfca62 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -53,20 +53,39 @@ static int sig_handler_ignored(void __user *handler, int sig)
(handler == SIG_DFL && sig_kernel_ignore(sig));
}
-static int sig_task_ignored(struct task_struct *t, int sig)
+/*
+ *
+ * Return 1 if task @t is either the global init or the container-init
+ * of the sender's container. Return 0 otherwise.
+ *
+ * @same_ns = 1 indicates that sender of signal is in same pid namespace
+ * as sender.
+ */
+static int sig_task_unkillable(struct task_struct *t, int same_ns)
+{
+ int flags = t->signal->flags;
+
+ if (unlikely(flags & SIGNAL_UNKILLABLE) ||
+ (same_ns && (flags & SIGNAL_UNKILLABLE_FROM_NS)))
+ return 1;
+
+ return 0;
+}
+
+static int sig_task_ignored(struct task_struct *t, int sig, int same_ns)
{
void __user *handler;
handler = sig_handler(t, sig);
- if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
+ if (sig_task_unkillable(t, same_ns) &&
(handler == SIG_IGN || handler == SIG_DFL))
return 1;
-
+
return sig_handler_ignored(handler, sig);
}
-static int sig_ignored(struct task_struct *t, int sig)
+static int sig_ignored(struct task_struct *t, int sig, int same_ns)
{
/*
* Blocked signals are never ignored, since the
@@ -76,7 +95,7 @@ static int sig_ignored(struct task_struct *t, int sig)
if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
return 0;
- if (!sig_task_ignored(t, sig))
+ if (!sig_task_ignored(t, sig, same_ns))
return 0;
/*
@@ -632,7 +651,7 @@ static int check_kill_permission(int sig, struct siginfo *info,
* Returns true if the signal should be actually delivered, otherwise
* it should be dropped.
*/
-static int prepare_signal(int sig, struct task_struct *p)
+static int prepare_signal(int sig, struct task_struct *p, int same_ns)
{
struct signal_struct *signal = p->signal;
struct task_struct *t;
@@ -716,7 +735,7 @@ static int prepare_signal(int sig, struct task_struct *p)
}
}
- return !sig_ignored(p, sig);
+ return !sig_ignored(p, sig, same_ns);
}
/*
@@ -867,11 +886,17 @@ static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
{
struct sigpending *pending;
struct sigqueue *q;
+ int same_ns;
trace_sched_signal_send(sig, t);
assert_spin_locked(&t->sighand->siglock);
- if (!prepare_signal(sig, t))
+
+ same_ns = 1;
+ if (siginfo_from_ancestor_ns(t, info))
+ same_ns = 0;
+
+ if (!prepare_signal(sig, t, same_ns))
return 0;
pending = group ? &t->signal->shared_pending : &t->pending;
@@ -1366,7 +1391,7 @@ int send_sigqueue(struct sigqueue *q, struct task_struct *t, int group)
goto ret;
ret = 1; /* the signal is ignored */
- if (!prepare_signal(sig, t))
+ if (!prepare_signal(sig, t, 1))
goto out;
ret = 0;
--
1.5.2.5
next prev parent reply other threads:[~2008-12-21 0:54 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-21 0:51 [RFC][PATCH 0/6][v3] Container-init signal semantics Sukadev Bhattiprolu
2008-12-21 0:52 ` [RFC][PATCH 1/6][v3] Remove 'handler' parameter to tracehook functions Sukadev Bhattiprolu
2008-12-23 19:30 ` Roland McGrath
2008-12-21 0:53 ` [RFC][PATCH 2/6][v3] Protect init from unwanted signals more Sukadev Bhattiprolu
[not found] ` <20081221005319.GB5025-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-12-23 19:31 ` Roland McGrath
2008-12-23 19:31 ` Roland McGrath
[not found] ` <20081221005106.GA4912-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-12-21 0:53 ` [RFC][PATCH 3/6][v3] Define/set SIGNAL_UNKILLABLE_FROM_NS Sukadev Bhattiprolu
2008-12-21 0:53 ` Sukadev Bhattiprolu
2008-12-21 0:54 ` [RFC][PATCH 4/6][v3] Define siginfo_from_ancestor_ns() Sukadev Bhattiprolu
2008-12-22 22:26 ` Oleg Nesterov
[not found] ` <20081222222604.GA1536-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-12-22 23:01 ` Oleg Nesterov
2008-12-22 23:01 ` Oleg Nesterov
2008-12-22 23:58 ` Sukadev Bhattiprolu
2008-12-23 0:22 ` Oleg Nesterov
[not found] ` <20081223002215.GA7984-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-12-23 0:32 ` Eric W. Biederman
2008-12-23 0:32 ` Eric W. Biederman
2008-12-23 4:47 ` Sukadev Bhattiprolu
2008-12-22 23:45 ` Sukadev Bhattiprolu
2008-12-22 23:54 ` Oleg Nesterov
2008-12-21 0:54 ` Sukadev Bhattiprolu [this message]
2008-12-22 22:46 ` [RFC][PATCH 5/6][v3] Protect cinit from unblocked SIG_DFL signals Oleg Nesterov
2008-12-21 0:55 ` [RFC][PATCH 6/6][v3] Protect cinit from blocked fatal signals Sukadev Bhattiprolu
[not found] ` <20081221005529.GF5025-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-12-22 22:58 ` Oleg Nesterov
2008-12-22 22:58 ` Oleg Nesterov
2008-12-22 23:38 ` Sukadev Bhattiprolu
[not found] ` <20081222233855.GA13079-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-12-23 0:03 ` Oleg Nesterov
2008-12-23 0:03 ` Oleg Nesterov
2008-12-22 10:55 ` [RFC][PATCH 0/6][v3] Container-init signal semantics Eric W. Biederman
2008-12-22 19:47 ` Sukadev Bhattiprolu
[not found] ` <20081222194737.GC9085-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-12-23 0:27 ` Eric W. Biederman
2008-12-23 0:27 ` Eric W. Biederman
2008-12-23 2:12 ` Sukadev Bhattiprolu
2008-12-23 16:51 ` Serge E. Hallyn
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=20081221005454.GE5025@us.ibm.com \
--to=sukadev@linux.vnet.ibm.com \
--cc=bastian@waldi.eu.org \
--cc=containers@lists.osdl.org \
--cc=daniel@hozac.com \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=roland@redhat.com \
--cc=sukadev@us.ibm.com \
--cc=xemul@openvz.org \
/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.