[PATCH] cleanup the usage of SEND_SIG_xxx constants
This patch simplifies some checks for magic siginfo values. It should not change the behaviour in any way. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
b67a1b9e4b
commit
621d31219d
@ -1084,6 +1084,11 @@ extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned lon
|
||||
#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. */
|
||||
|
||||
static inline int on_sig_stack(unsigned long sp)
|
||||
|
@ -651,9 +651,7 @@ static int check_kill_permission(int sig, struct siginfo *info,
|
||||
if (!valid_signal(sig))
|
||||
return error;
|
||||
error = -EPERM;
|
||||
if ((info == SEND_SIG_NOINFO ||
|
||||
(info != SEND_SIG_PRIV && info != SEND_SIG_FORCED
|
||||
&& SI_FROMUSER(info)))
|
||||
if ((info == SEND_SIG_NOINFO || (!is_si_special(info) && SI_FROMUSER(info)))
|
||||
&& ((sig != SIGCONT) ||
|
||||
(current->signal->session != t->signal->session))
|
||||
&& (current->euid ^ t->suid) && (current->euid ^ t->uid)
|
||||
@ -802,7 +800,7 @@ static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
||||
pass on the info struct. */
|
||||
|
||||
q = __sigqueue_alloc(t, GFP_ATOMIC, (sig < SIGRTMIN &&
|
||||
(info < SEND_SIG_FORCED ||
|
||||
(is_si_special(info) ||
|
||||
info->si_code >= 0)));
|
||||
if (q) {
|
||||
list_add_tail(&q->list, &signals->list);
|
||||
@ -825,16 +823,14 @@ static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
||||
copy_siginfo(&q->info, info);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (sig >= SIGRTMIN
|
||||
&& info != SEND_SIG_NOINFO && info != SEND_SIG_PRIV
|
||||
&& info->si_code != SI_USER)
|
||||
} else if (!is_si_special(info)) {
|
||||
if (sig >= SIGRTMIN && info->si_code != SI_USER)
|
||||
/*
|
||||
* Queue overflow, abort. We may abort if the signal was rt
|
||||
* and sent by user using something other than kill().
|
||||
*/
|
||||
return -EAGAIN;
|
||||
if ((info > SEND_SIG_PRIV) && (info->si_code == SI_TIMER))
|
||||
if (info->si_code == SI_TIMER)
|
||||
/*
|
||||
* Set up a return to indicate that we dropped
|
||||
* the signal.
|
||||
@ -860,7 +856,7 @@ specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
|
||||
BUG();
|
||||
assert_spin_locked(&t->sighand->siglock);
|
||||
|
||||
if ((info > SEND_SIG_FORCED) && (info->si_code == SI_TIMER))
|
||||
if (!is_si_special(info) && (info->si_code == SI_TIMER))
|
||||
/*
|
||||
* Set up a return to indicate that we dropped the signal.
|
||||
*/
|
||||
@ -1052,7 +1048,7 @@ __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
|
||||
assert_spin_locked(&p->sighand->siglock);
|
||||
handle_stop_signal(sig, p);
|
||||
|
||||
if ((info > SEND_SIG_FORCED) && (info->si_code == SI_TIMER))
|
||||
if (!is_si_special(info) && (info->si_code == SI_TIMER))
|
||||
/*
|
||||
* Set up a return to indicate that we dropped the signal.
|
||||
*/
|
||||
|
@ -2713,8 +2713,7 @@ static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int si
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (info != SEND_SIG_NOINFO && (info == SEND_SIG_PRIV ||
|
||||
info == SEND_SIG_FORCED || SI_FROMKERNEL(info)))
|
||||
if (info != SEND_SIG_NOINFO && (is_si_special(info) || SI_FROMKERNEL(info)))
|
||||
return 0;
|
||||
|
||||
if (!sig)
|
||||
|
Loading…
Reference in New Issue
Block a user