projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'perf/core' into perf/uprobes
[deliverable/linux.git]
/
kernel
/
signal.c
diff --git
a/kernel/signal.c
b/kernel/signal.c
index e93ff0a719a0a91d4f9f652284e696d72e3a1386..60d80ab2601c544ac03460cdb6888dd8c699dd4f 100644
(file)
--- a/
kernel/signal.c
+++ b/
kernel/signal.c
@@
-37,6
+37,7
@@
#include <asm/uaccess.h>
#include <asm/unistd.h>
#include <asm/siginfo.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
#include <asm/siginfo.h>
+#include <asm/cacheflush.h>
#include "audit.h" /* audit_signal_info() */
/*
#include "audit.h" /* audit_signal_info() */
/*
@@
-59,21
+60,20
@@
static int sig_handler_ignored(void __user *handler, int sig)
(handler == SIG_DFL && sig_kernel_ignore(sig));
}
(handler == SIG_DFL && sig_kernel_ignore(sig));
}
-static int sig_task_ignored(struct task_struct *t, int sig,
- int from_ancestor_ns)
+static int sig_task_ignored(struct task_struct *t, int sig, bool force)
{
void __user *handler;
handler = sig_handler(t, sig);
if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
{
void __user *handler;
handler = sig_handler(t, sig);
if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
- handler == SIG_DFL && !f
rom_ancestor_ns
)
+ handler == SIG_DFL && !f
orce
)
return 1;
return sig_handler_ignored(handler, sig);
}
return 1;
return sig_handler_ignored(handler, sig);
}
-static int sig_ignored(struct task_struct *t, int sig,
int from_ancestor_ns
)
+static int sig_ignored(struct task_struct *t, int sig,
bool force
)
{
/*
* Blocked signals are never ignored, since the
{
/*
* Blocked signals are never ignored, since the
@@
-83,7
+83,7
@@
static int sig_ignored(struct task_struct *t, int sig, int from_ancestor_ns)
if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
return 0;
if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
return 0;
- if (!sig_task_ignored(t, sig, f
rom_ancestor_ns
))
+ if (!sig_task_ignored(t, sig, f
orce
))
return 0;
/*
return 0;
/*
@@
-856,7
+856,7
@@
static void ptrace_trap_notify(struct task_struct *t)
* Returns true if the signal should be actually delivered, otherwise
* it should be dropped.
*/
* Returns true if the signal should be actually delivered, otherwise
* it should be dropped.
*/
-static int prepare_signal(int sig, struct task_struct *p,
int from_ancestor_ns
)
+static int prepare_signal(int sig, struct task_struct *p,
bool force
)
{
struct signal_struct *signal = p->signal;
struct task_struct *t;
{
struct signal_struct *signal = p->signal;
struct task_struct *t;
@@
-916,7
+916,7
@@
static int prepare_signal(int sig, struct task_struct *p, int from_ancestor_ns)
}
}
}
}
- return !sig_ignored(p, sig, f
rom_ancestor_ns
);
+ return !sig_ignored(p, sig, f
orce
);
}
/*
}
/*
@@
-1060,7
+1060,8
@@
static int __send_signal(int sig, struct siginfo *info, struct task_struct *t,
assert_spin_locked(&t->sighand->siglock);
result = TRACE_SIGNAL_IGNORED;
assert_spin_locked(&t->sighand->siglock);
result = TRACE_SIGNAL_IGNORED;
- if (!prepare_signal(sig, t, from_ancestor_ns))
+ if (!prepare_signal(sig, t,
+ from_ancestor_ns || (info == SEND_SIG_FORCED)))
goto ret;
pending = group ? &t->signal->shared_pending : &t->pending;
goto ret;
pending = group ? &t->signal->shared_pending : &t->pending;
@@
-1602,7
+1603,7
@@
int send_sigqueue(struct sigqueue *q, struct task_struct *t, int group)
ret = 1; /* the signal is ignored */
result = TRACE_SIGNAL_IGNORED;
ret = 1; /* the signal is ignored */
result = TRACE_SIGNAL_IGNORED;
- if (!prepare_signal(sig, t,
0
))
+ if (!prepare_signal(sig, t,
false
))
goto out;
ret = 0;
goto out;
ret = 0;
@@
-1653,6
+1654,15
@@
bool do_notify_parent(struct task_struct *tsk, int sig)
BUG_ON(!tsk->ptrace &&
(tsk->group_leader != tsk || !thread_group_empty(tsk)));
BUG_ON(!tsk->ptrace &&
(tsk->group_leader != tsk || !thread_group_empty(tsk)));
+ if (sig != SIGCHLD) {
+ /*
+ * This is only possible if parent == real_parent.
+ * Check if it has changed security domain.
+ */
+ if (tsk->parent_exec_id != tsk->parent->self_exec_id)
+ sig = SIGCHLD;
+ }
+
info.si_signo = sig;
info.si_errno = 0;
/*
info.si_signo = sig;
info.si_errno = 0;
/*
This page took
0.026498 seconds
and
5
git commands to generate.