1
0
Fork 0

signal: Pass pid type into group_send_sig_info

This passes the information we already have at the call sight
into group_send_sig_info.  Ultimatelly allowing for to better handle
signals sent to a group of processes.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
hifive-unleashed-5.1
Eric W. Biederman 2018-07-13 18:40:57 -05:00
parent 24122c7f49
commit 0102498083
3 changed files with 11 additions and 6 deletions

View File

@ -254,11 +254,13 @@ static inline int valid_signal(unsigned long sig)
struct timespec; struct timespec;
struct pt_regs; struct pt_regs;
enum pid_type;
extern int next_signal(struct sigpending *pending, sigset_t *mask); extern int next_signal(struct sigpending *pending, sigset_t *mask);
extern int do_send_sig_info(int sig, struct siginfo *info, extern int do_send_sig_info(int sig, struct siginfo *info,
struct task_struct *p, bool group); struct task_struct *p, bool group);
extern int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p); extern int group_send_sig_info(int sig, struct siginfo *info,
struct task_struct *p, enum pid_type type);
extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *); extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *);
extern int sigprocmask(int, sigset_t *, sigset_t *); extern int sigprocmask(int, sigset_t *, sigset_t *);
extern void set_current_blocked(sigset_t *); extern void set_current_blocked(sigset_t *);

View File

@ -681,7 +681,8 @@ static void forget_original_parent(struct task_struct *father,
t->parent = t->real_parent; t->parent = t->real_parent;
if (t->pdeath_signal) if (t->pdeath_signal)
group_send_sig_info(t->pdeath_signal, group_send_sig_info(t->pdeath_signal,
SEND_SIG_NOINFO, t); SEND_SIG_NOINFO, t,
PIDTYPE_TGID);
} }
/* /*
* If this is a threaded reparent there is no need to * If this is a threaded reparent there is no need to

View File

@ -1274,7 +1274,8 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,
/* /*
* send signal info to all the members of a group * send signal info to all the members of a group
*/ */
int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p,
enum pid_type type)
{ {
int ret; int ret;
@ -1301,7 +1302,7 @@ int __kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp)
success = 0; success = 0;
retval = -ESRCH; retval = -ESRCH;
do_each_pid_task(pgrp, PIDTYPE_PGID, p) { do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
int err = group_send_sig_info(sig, info, p); int err = group_send_sig_info(sig, info, p, PIDTYPE_PGID);
success |= !err; success |= !err;
retval = err; retval = err;
} while_each_pid_task(pgrp, PIDTYPE_PGID, p); } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
@ -1317,7 +1318,7 @@ int kill_pid_info(int sig, struct siginfo *info, struct pid *pid)
rcu_read_lock(); rcu_read_lock();
p = pid_task(pid, PIDTYPE_PID); p = pid_task(pid, PIDTYPE_PID);
if (p) if (p)
error = group_send_sig_info(sig, info, p); error = group_send_sig_info(sig, info, p, PIDTYPE_TGID);
rcu_read_unlock(); rcu_read_unlock();
if (likely(!p || error != -ESRCH)) if (likely(!p || error != -ESRCH))
return error; return error;
@ -1420,7 +1421,8 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid)
for_each_process(p) { for_each_process(p) {
if (task_pid_vnr(p) > 1 && if (task_pid_vnr(p) > 1 &&
!same_thread_group(p, current)) { !same_thread_group(p, current)) {
int err = group_send_sig_info(sig, info, p); int err = group_send_sig_info(sig, info, p,
PIDTYPE_MAX);
++count; ++count;
if (err != -EPERM) if (err != -EPERM)
retval = err; retval = err;