diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 9 | 
1 files changed, 6 insertions, 3 deletions
| diff --git a/kernel/signal.c b/kernel/signal.c index 906ae5a1779c..bded65187780 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -637,7 +637,7 @@ static inline bool si_fromuser(const struct siginfo *info) | |||
| 637 | 637 | ||
| 638 | /* | 638 | /* | 
| 639 | * Bad permissions for sending the signal | 639 | * Bad permissions for sending the signal | 
| 640 | * - the caller must hold at least the RCU read lock | 640 | * - the caller must hold the RCU read lock | 
| 641 | */ | 641 | */ | 
| 642 | static int check_kill_permission(int sig, struct siginfo *info, | 642 | static int check_kill_permission(int sig, struct siginfo *info, | 
| 643 | struct task_struct *t) | 643 | struct task_struct *t) | 
| @@ -1127,11 +1127,14 @@ struct sighand_struct *lock_task_sighand(struct task_struct *tsk, unsigned long | |||
| 1127 | 1127 | ||
| 1128 | /* | 1128 | /* | 
| 1129 | * send signal info to all the members of a group | 1129 | * send signal info to all the members of a group | 
| 1130 | * - the caller must hold the RCU read lock at least | ||
| 1131 | */ | 1130 | */ | 
| 1132 | int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) | 1131 | int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) | 
| 1133 | { | 1132 | { | 
| 1134 | int ret = check_kill_permission(sig, info, p); | 1133 | int ret; | 
| 1134 | |||
| 1135 | rcu_read_lock(); | ||
| 1136 | ret = check_kill_permission(sig, info, p); | ||
| 1137 | rcu_read_unlock(); | ||
| 1135 | 1138 | ||
| 1136 | if (!ret && sig) | 1139 | if (!ret && sig) | 
| 1137 | ret = do_send_sig_info(sig, info, p, true); | 1140 | ret = do_send_sig_info(sig, info, p, true); | 
