diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index e2c5d84f2dac..2734dc965f69 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -1038,8 +1038,10 @@ static inline void userns_fixup_signal_uid(struct siginfo *info, struct task_str | |||
1038 | if (SI_FROMKERNEL(info)) | 1038 | if (SI_FROMKERNEL(info)) |
1039 | return; | 1039 | return; |
1040 | 1040 | ||
1041 | info->si_uid = user_ns_map_uid(task_cred_xxx(t, user_ns), | 1041 | rcu_read_lock(); |
1042 | current_cred(), info->si_uid); | 1042 | info->si_uid = from_kuid_munged(task_cred_xxx(t, user_ns), |
1043 | make_kuid(current_user_ns(), info->si_uid)); | ||
1044 | rcu_read_unlock(); | ||
1043 | } | 1045 | } |
1044 | #else | 1046 | #else |
1045 | static inline void userns_fixup_signal_uid(struct siginfo *info, struct task_struct *t) | 1047 | static inline void userns_fixup_signal_uid(struct siginfo *info, struct task_struct *t) |
@@ -1106,7 +1108,7 @@ static int __send_signal(int sig, struct siginfo *info, struct task_struct *t, | |||
1106 | q->info.si_code = SI_USER; | 1108 | q->info.si_code = SI_USER; |
1107 | q->info.si_pid = task_tgid_nr_ns(current, | 1109 | q->info.si_pid = task_tgid_nr_ns(current, |
1108 | task_active_pid_ns(t)); | 1110 | task_active_pid_ns(t)); |
1109 | q->info.si_uid = current_uid(); | 1111 | q->info.si_uid = from_kuid_munged(current_user_ns(), current_uid()); |
1110 | break; | 1112 | break; |
1111 | case (unsigned long) SEND_SIG_PRIV: | 1113 | case (unsigned long) SEND_SIG_PRIV: |
1112 | q->info.si_signo = sig; | 1114 | q->info.si_signo = sig; |
@@ -1973,7 +1975,7 @@ static void ptrace_do_notify(int signr, int exit_code, int why) | |||
1973 | info.si_signo = signr; | 1975 | info.si_signo = signr; |
1974 | info.si_code = exit_code; | 1976 | info.si_code = exit_code; |
1975 | info.si_pid = task_pid_vnr(current); | 1977 | info.si_pid = task_pid_vnr(current); |
1976 | info.si_uid = current_uid(); | 1978 | info.si_uid = from_kuid_munged(current_user_ns(), current_uid()); |
1977 | 1979 | ||
1978 | /* Let the debugger run. */ | 1980 | /* Let the debugger run. */ |
1979 | ptrace_stop(exit_code, why, 1, &info); | 1981 | ptrace_stop(exit_code, why, 1, &info); |
@@ -2828,7 +2830,7 @@ SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) | |||
2828 | info.si_errno = 0; | 2830 | info.si_errno = 0; |
2829 | info.si_code = SI_USER; | 2831 | info.si_code = SI_USER; |
2830 | info.si_pid = task_tgid_vnr(current); | 2832 | info.si_pid = task_tgid_vnr(current); |
2831 | info.si_uid = current_uid(); | 2833 | info.si_uid = from_kuid_munged(current_user_ns(), current_uid()); |
2832 | 2834 | ||
2833 | return kill_something_info(sig, &info, pid); | 2835 | return kill_something_info(sig, &info, pid); |
2834 | } | 2836 | } |
@@ -2871,7 +2873,7 @@ static int do_tkill(pid_t tgid, pid_t pid, int sig) | |||
2871 | info.si_errno = 0; | 2873 | info.si_errno = 0; |
2872 | info.si_code = SI_TKILL; | 2874 | info.si_code = SI_TKILL; |
2873 | info.si_pid = task_tgid_vnr(current); | 2875 | info.si_pid = task_tgid_vnr(current); |
2874 | info.si_uid = current_uid(); | 2876 | info.si_uid = from_kuid_munged(current_user_ns(), current_uid()); |
2875 | 2877 | ||
2876 | return do_send_specific(tgid, pid, sig, &info); | 2878 | return do_send_specific(tgid, pid, sig, &info); |
2877 | } | 2879 | } |