Skip to content

Commit

Permalink
[PATCH] cleanup the usage of SEND_SIG_xxx constants
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oleg Nesterov authored and Linus Torvalds committed Oct 31, 2005
1 parent b67a1b9 commit 621d312
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 13 deletions.
5 changes: 5 additions & 0 deletions include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
18 changes: 7 additions & 11 deletions kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand All @@ -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.
Expand All @@ -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.
*/
Expand Down Expand Up @@ -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.
*/
Expand Down
3 changes: 1 addition & 2 deletions security/selinux/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 621d312

Please sign in to comment.