aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index debb485a76db..c0e289e62d77 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2896,6 +2896,13 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
2896 return 0; 2896 return 0;
2897} 2897}
2898 2898
2899int copy_siginfo_from_user(siginfo_t *to, const siginfo_t __user *from)
2900{
2901 if (copy_from_user(to, from, sizeof(struct siginfo)))
2902 return -EFAULT;
2903 return 0;
2904}
2905
2899#ifdef CONFIG_COMPAT 2906#ifdef CONFIG_COMPAT
2900int copy_siginfo_to_user32(struct compat_siginfo __user *to, 2907int copy_siginfo_to_user32(struct compat_siginfo __user *to,
2901 const struct siginfo *from) 2908 const struct siginfo *from)
@@ -3323,8 +3330,9 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig,
3323 siginfo_t __user *, uinfo) 3330 siginfo_t __user *, uinfo)
3324{ 3331{
3325 siginfo_t info; 3332 siginfo_t info;
3326 if (copy_from_user(&info, uinfo, sizeof(siginfo_t))) 3333 int ret = copy_siginfo_from_user(&info, uinfo);
3327 return -EFAULT; 3334 if (unlikely(ret))
3335 return ret;
3328 return do_rt_sigqueueinfo(pid, sig, &info); 3336 return do_rt_sigqueueinfo(pid, sig, &info);
3329} 3337}
3330 3338
@@ -3365,10 +3373,9 @@ SYSCALL_DEFINE4(rt_tgsigqueueinfo, pid_t, tgid, pid_t, pid, int, sig,
3365 siginfo_t __user *, uinfo) 3373 siginfo_t __user *, uinfo)
3366{ 3374{
3367 siginfo_t info; 3375 siginfo_t info;
3368 3376 int ret = copy_siginfo_from_user(&info, uinfo);
3369 if (copy_from_user(&info, uinfo, sizeof(siginfo_t))) 3377 if (unlikely(ret))
3370 return -EFAULT; 3378 return ret;
3371
3372 return do_rt_tgsigqueueinfo(tgid, pid, sig, &info); 3379 return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
3373} 3380}
3374 3381
@@ -3380,9 +3387,9 @@ COMPAT_SYSCALL_DEFINE4(rt_tgsigqueueinfo,
3380 struct compat_siginfo __user *, uinfo) 3387 struct compat_siginfo __user *, uinfo)
3381{ 3388{
3382 siginfo_t info; 3389 siginfo_t info;
3383 3390 int ret = copy_siginfo_from_user32(&info, uinfo);
3384 if (copy_siginfo_from_user32(&info, uinfo)) 3391 if (unlikely(ret))
3385 return -EFAULT; 3392 return ret;
3386 return do_rt_tgsigqueueinfo(tgid, pid, sig, &info); 3393 return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
3387} 3394}
3388#endif 3395#endif