diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 25 |
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 | ||
2899 | int 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 |
2900 | int copy_siginfo_to_user32(struct compat_siginfo __user *to, | 2907 | int 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 |