From 209161613b03db610104dacf43dd9f45004b4a8d Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Tue, 15 Dec 2009 16:47:22 -0800 Subject: [PATCH] --- yaml --- r: 176684 b: refs/heads/master c: 614c517d7c00af1b26ded20646b329397d6f51a1 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/sched.h | 5 ----- trunk/kernel/signal.c | 16 +++++++++++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index e40f06fdcd9a..c5878a168f92 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d51965037325e51f6cd68583413243c3573e47b0 +refs/heads/master: 614c517d7c00af1b26ded20646b329397d6f51a1 diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index f4c145410a8d..57b3516f055b 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -2102,11 +2102,6 @@ static inline int kill_cad_pid(int sig, int priv) #define SEND_SIG_PRIV ((struct siginfo *) 1) #define SEND_SIG_FORCED ((struct siginfo *) 2) -static inline int is_si_special(const struct siginfo *info) -{ - return info <= SEND_SIG_FORCED; -} - /* * True if we are on the alternate signal stack. */ diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c index 6b982f2cf524..a0ba428954b6 100644 --- a/trunk/kernel/signal.c +++ b/trunk/kernel/signal.c @@ -607,6 +607,17 @@ static int rm_from_queue(unsigned long mask, struct sigpending *s) return 1; } +static inline int is_si_special(const struct siginfo *info) +{ + return info <= SEND_SIG_FORCED; +} + +static inline bool si_fromuser(const struct siginfo *info) +{ + return info == SEND_SIG_NOINFO || + (!is_si_special(info) && SI_FROMUSER(info)); +} + /* * Bad permissions for sending the signal * - the caller must hold at least the RCU read lock @@ -621,7 +632,7 @@ static int check_kill_permission(int sig, struct siginfo *info, if (!valid_signal(sig)) return -EINVAL; - if (info != SEND_SIG_NOINFO && (is_si_special(info) || SI_FROMKERNEL(info))) + if (!si_fromuser(info)) return 0; error = audit_signal_info(sig, t); /* Let audit system see the signal */ @@ -1186,8 +1197,7 @@ int kill_pid_info_as_uid(int sig, struct siginfo *info, struct pid *pid, goto out_unlock; } pcred = __task_cred(p); - if ((info == SEND_SIG_NOINFO || - (!is_si_special(info) && SI_FROMUSER(info))) && + if (si_fromuser(info) && euid != pcred->suid && euid != pcred->uid && uid != pcred->suid && uid != pcred->uid) { ret = -EPERM;