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>
This commit is contained in:
parent
24122c7f49
commit
0102498083
3 changed files with 11 additions and 6 deletions
|
@ -254,11 +254,13 @@ static inline int valid_signal(unsigned long sig)
|
|||
|
||||
struct timespec;
|
||||
struct pt_regs;
|
||||
enum pid_type;
|
||||
|
||||
extern int next_signal(struct sigpending *pending, sigset_t *mask);
|
||||
extern int do_send_sig_info(int sig, struct siginfo *info,
|
||||
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 sigprocmask(int, sigset_t *, sigset_t *);
|
||||
extern void set_current_blocked(sigset_t *);
|
||||
|
|
|
@ -681,7 +681,8 @@ static void forget_original_parent(struct task_struct *father,
|
|||
t->parent = t->real_parent;
|
||||
if (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
|
||||
|
|
|
@ -1274,7 +1274,8 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,
|
|||
/*
|
||||
* 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;
|
||||
|
||||
|
@ -1301,7 +1302,7 @@ int __kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp)
|
|||
success = 0;
|
||||
retval = -ESRCH;
|
||||
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;
|
||||
retval = err;
|
||||
} 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();
|
||||
p = pid_task(pid, PIDTYPE_PID);
|
||||
if (p)
|
||||
error = group_send_sig_info(sig, info, p);
|
||||
error = group_send_sig_info(sig, info, p, PIDTYPE_TGID);
|
||||
rcu_read_unlock();
|
||||
if (likely(!p || error != -ESRCH))
|
||||
return error;
|
||||
|
@ -1420,7 +1421,8 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid)
|
|||
for_each_process(p) {
|
||||
if (task_pid_vnr(p) > 1 &&
|
||||
!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;
|
||||
if (err != -EPERM)
|
||||
retval = err;
|
||||
|
|
Loading…
Reference in a new issue