mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
signals: cleanup security_task_kill() usage/implementation
Every implementation of ->task_kill() does nothing when the signal comes from the kernel. This is correct, but means that check_kill_permission() should call security_task_kill() only for SI_FROMUSER() case, and we can remove the same check from ->task_kill() implementations. (sadly, check_kill_permission() is the last user of signal->session/__session but we can't s/task_session_nr/task_session/ here). NOTE: Eric W. Biederman pointed out cap_task_kill() should die, and I think he is very right. Signed-off-by: Oleg Nesterov <[email protected]> Cc: "Eric W. Biederman" <[email protected]> Cc: Serge Hallyn <[email protected]> Cc: Roland McGrath <[email protected]> Cc: Casey Schaufler <[email protected]> Cc: David Quigley <[email protected]> Cc: Eric Paris <[email protected]> Cc: Harald Welte <[email protected]> Cc: Pavel Emelyanov <[email protected]> Cc: Stephen Smalley <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
9e3bd6c3fb
commit
3b5e9e53c6
3 changed files with 14 additions and 25 deletions
|
|
@ -533,22 +533,23 @@ static int rm_from_queue(unsigned long mask, struct sigpending *s)
|
|||
static int check_kill_permission(int sig, struct siginfo *info,
|
||||
struct task_struct *t)
|
||||
{
|
||||
int error = -EINVAL;
|
||||
int error;
|
||||
|
||||
if (!valid_signal(sig))
|
||||
return -EINVAL;
|
||||
|
||||
if (info != SEND_SIG_NOINFO && (is_si_special(info) || SI_FROMKERNEL(info)))
|
||||
return 0;
|
||||
|
||||
error = audit_signal_info(sig, t); /* Let audit system see the signal */
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (info == SEND_SIG_NOINFO || (!is_si_special(info) && SI_FROMUSER(info))) {
|
||||
error = audit_signal_info(sig, t); /* Let audit system see the signal */
|
||||
if (error)
|
||||
return error;
|
||||
error = -EPERM;
|
||||
if (((sig != SIGCONT) ||
|
||||
(task_session_nr(current) != task_session_nr(t)))
|
||||
&& (current->euid ^ t->suid) && (current->euid ^ t->uid)
|
||||
&& (current->uid ^ t->suid) && (current->uid ^ t->uid)
|
||||
&& !capable(CAP_KILL))
|
||||
return error;
|
||||
}
|
||||
if (((sig != SIGCONT) || (task_session_nr(current) != task_session_nr(t)))
|
||||
&& (current->euid ^ t->suid) && (current->euid ^ t->uid)
|
||||
&& (current->uid ^ t->suid) && (current->uid ^ t->uid)
|
||||
&& !capable(CAP_KILL))
|
||||
return -EPERM;
|
||||
|
||||
return security_task_kill(t, info, sig, 0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue