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); |