diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 151 |
1 files changed, 99 insertions, 52 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index c0e289e62d77..161cad4e448c 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -549,7 +549,7 @@ bool unhandled_signal(struct task_struct *tsk, int sig) | |||
549 | return !tsk->ptrace; | 549 | return !tsk->ptrace; |
550 | } | 550 | } |
551 | 551 | ||
552 | static void collect_signal(int sig, struct sigpending *list, siginfo_t *info, | 552 | static void collect_signal(int sig, struct sigpending *list, kernel_siginfo_t *info, |
553 | bool *resched_timer) | 553 | bool *resched_timer) |
554 | { | 554 | { |
555 | struct sigqueue *q, *first = NULL; | 555 | struct sigqueue *q, *first = NULL; |
@@ -595,7 +595,7 @@ still_pending: | |||
595 | } | 595 | } |
596 | 596 | ||
597 | static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, | 597 | static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, |
598 | siginfo_t *info, bool *resched_timer) | 598 | kernel_siginfo_t *info, bool *resched_timer) |
599 | { | 599 | { |
600 | int sig = next_signal(pending, mask); | 600 | int sig = next_signal(pending, mask); |
601 | 601 | ||
@@ -610,7 +610,7 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, | |||
610 | * | 610 | * |
611 | * All callers have to hold the siglock. | 611 | * All callers have to hold the siglock. |
612 | */ | 612 | */ |
613 | int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) | 613 | int dequeue_signal(struct task_struct *tsk, sigset_t *mask, kernel_siginfo_t *info) |
614 | { | 614 | { |
615 | bool resched_timer = false; | 615 | bool resched_timer = false; |
616 | int signr; | 616 | int signr; |
@@ -737,12 +737,12 @@ static void flush_sigqueue_mask(sigset_t *mask, struct sigpending *s) | |||
737 | } | 737 | } |
738 | } | 738 | } |
739 | 739 | ||
740 | static inline int is_si_special(const struct siginfo *info) | 740 | static inline int is_si_special(const struct kernel_siginfo *info) |
741 | { | 741 | { |
742 | return info <= SEND_SIG_PRIV; | 742 | return info <= SEND_SIG_PRIV; |
743 | } | 743 | } |
744 | 744 | ||
745 | static inline bool si_fromuser(const struct siginfo *info) | 745 | static inline bool si_fromuser(const struct kernel_siginfo *info) |
746 | { | 746 | { |
747 | return info == SEND_SIG_NOINFO || | 747 | return info == SEND_SIG_NOINFO || |
748 | (!is_si_special(info) && SI_FROMUSER(info)); | 748 | (!is_si_special(info) && SI_FROMUSER(info)); |
@@ -767,7 +767,7 @@ static bool kill_ok_by_cred(struct task_struct *t) | |||
767 | * Bad permissions for sending the signal | 767 | * Bad permissions for sending the signal |
768 | * - the caller must hold the RCU read lock | 768 | * - the caller must hold the RCU read lock |
769 | */ | 769 | */ |
770 | static int check_kill_permission(int sig, struct siginfo *info, | 770 | static int check_kill_permission(int sig, struct kernel_siginfo *info, |
771 | struct task_struct *t) | 771 | struct task_struct *t) |
772 | { | 772 | { |
773 | struct pid *sid; | 773 | struct pid *sid; |
@@ -1010,7 +1010,7 @@ static inline bool legacy_queue(struct sigpending *signals, int sig) | |||
1010 | } | 1010 | } |
1011 | 1011 | ||
1012 | #ifdef CONFIG_USER_NS | 1012 | #ifdef CONFIG_USER_NS |
1013 | static inline void userns_fixup_signal_uid(struct siginfo *info, struct task_struct *t) | 1013 | static inline void userns_fixup_signal_uid(struct kernel_siginfo *info, struct task_struct *t) |
1014 | { | 1014 | { |
1015 | if (current_user_ns() == task_cred_xxx(t, user_ns)) | 1015 | if (current_user_ns() == task_cred_xxx(t, user_ns)) |
1016 | return; | 1016 | return; |
@@ -1024,13 +1024,13 @@ static inline void userns_fixup_signal_uid(struct siginfo *info, struct task_str | |||
1024 | rcu_read_unlock(); | 1024 | rcu_read_unlock(); |
1025 | } | 1025 | } |
1026 | #else | 1026 | #else |
1027 | static inline void userns_fixup_signal_uid(struct siginfo *info, struct task_struct *t) | 1027 | static inline void userns_fixup_signal_uid(struct kernel_siginfo *info, struct task_struct *t) |
1028 | { | 1028 | { |
1029 | return; | 1029 | return; |
1030 | } | 1030 | } |
1031 | #endif | 1031 | #endif |
1032 | 1032 | ||
1033 | static int __send_signal(int sig, struct siginfo *info, struct task_struct *t, | 1033 | static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struct *t, |
1034 | enum pid_type type, int from_ancestor_ns) | 1034 | enum pid_type type, int from_ancestor_ns) |
1035 | { | 1035 | { |
1036 | struct sigpending *pending; | 1036 | struct sigpending *pending; |
@@ -1150,7 +1150,7 @@ ret: | |||
1150 | return ret; | 1150 | return ret; |
1151 | } | 1151 | } |
1152 | 1152 | ||
1153 | static int send_signal(int sig, struct siginfo *info, struct task_struct *t, | 1153 | static int send_signal(int sig, struct kernel_siginfo *info, struct task_struct *t, |
1154 | enum pid_type type) | 1154 | enum pid_type type) |
1155 | { | 1155 | { |
1156 | int from_ancestor_ns = 0; | 1156 | int from_ancestor_ns = 0; |
@@ -1197,12 +1197,12 @@ static int __init setup_print_fatal_signals(char *str) | |||
1197 | __setup("print-fatal-signals=", setup_print_fatal_signals); | 1197 | __setup("print-fatal-signals=", setup_print_fatal_signals); |
1198 | 1198 | ||
1199 | int | 1199 | int |
1200 | __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) | 1200 | __group_send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p) |
1201 | { | 1201 | { |
1202 | return send_signal(sig, info, p, PIDTYPE_TGID); | 1202 | return send_signal(sig, info, p, PIDTYPE_TGID); |
1203 | } | 1203 | } |
1204 | 1204 | ||
1205 | int do_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, | 1205 | int do_send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p, |
1206 | enum pid_type type) | 1206 | enum pid_type type) |
1207 | { | 1207 | { |
1208 | unsigned long flags; | 1208 | unsigned long flags; |
@@ -1228,7 +1228,7 @@ int do_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, | |||
1228 | * that is why we also clear SIGNAL_UNKILLABLE. | 1228 | * that is why we also clear SIGNAL_UNKILLABLE. |
1229 | */ | 1229 | */ |
1230 | int | 1230 | int |
1231 | force_sig_info(int sig, struct siginfo *info, struct task_struct *t) | 1231 | force_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *t) |
1232 | { | 1232 | { |
1233 | unsigned long int flags; | 1233 | unsigned long int flags; |
1234 | int ret, blocked, ignored; | 1234 | int ret, blocked, ignored; |
@@ -1316,8 +1316,8 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, | |||
1316 | /* | 1316 | /* |
1317 | * send signal info to all the members of a group | 1317 | * send signal info to all the members of a group |
1318 | */ | 1318 | */ |
1319 | int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, | 1319 | int group_send_sig_info(int sig, struct kernel_siginfo *info, |
1320 | enum pid_type type) | 1320 | struct task_struct *p, enum pid_type type) |
1321 | { | 1321 | { |
1322 | int ret; | 1322 | int ret; |
1323 | 1323 | ||
@@ -1336,7 +1336,7 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, | |||
1336 | * control characters do (^C, ^Z etc) | 1336 | * control characters do (^C, ^Z etc) |
1337 | * - the caller must hold at least a readlock on tasklist_lock | 1337 | * - the caller must hold at least a readlock on tasklist_lock |
1338 | */ | 1338 | */ |
1339 | int __kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp) | 1339 | int __kill_pgrp_info(int sig, struct kernel_siginfo *info, struct pid *pgrp) |
1340 | { | 1340 | { |
1341 | struct task_struct *p = NULL; | 1341 | struct task_struct *p = NULL; |
1342 | int retval, success; | 1342 | int retval, success; |
@@ -1351,7 +1351,7 @@ int __kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp) | |||
1351 | return success ? 0 : retval; | 1351 | return success ? 0 : retval; |
1352 | } | 1352 | } |
1353 | 1353 | ||
1354 | int kill_pid_info(int sig, struct siginfo *info, struct pid *pid) | 1354 | int kill_pid_info(int sig, struct kernel_siginfo *info, struct pid *pid) |
1355 | { | 1355 | { |
1356 | int error = -ESRCH; | 1356 | int error = -ESRCH; |
1357 | struct task_struct *p; | 1357 | struct task_struct *p; |
@@ -1373,7 +1373,7 @@ int kill_pid_info(int sig, struct siginfo *info, struct pid *pid) | |||
1373 | } | 1373 | } |
1374 | } | 1374 | } |
1375 | 1375 | ||
1376 | static int kill_proc_info(int sig, struct siginfo *info, pid_t pid) | 1376 | static int kill_proc_info(int sig, struct kernel_siginfo *info, pid_t pid) |
1377 | { | 1377 | { |
1378 | int error; | 1378 | int error; |
1379 | rcu_read_lock(); | 1379 | rcu_read_lock(); |
@@ -1394,7 +1394,7 @@ static inline bool kill_as_cred_perm(const struct cred *cred, | |||
1394 | } | 1394 | } |
1395 | 1395 | ||
1396 | /* like kill_pid_info(), but doesn't use uid/euid of "current" */ | 1396 | /* like kill_pid_info(), but doesn't use uid/euid of "current" */ |
1397 | int kill_pid_info_as_cred(int sig, struct siginfo *info, struct pid *pid, | 1397 | int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, |
1398 | const struct cred *cred) | 1398 | const struct cred *cred) |
1399 | { | 1399 | { |
1400 | int ret = -EINVAL; | 1400 | int ret = -EINVAL; |
@@ -1438,7 +1438,7 @@ EXPORT_SYMBOL_GPL(kill_pid_info_as_cred); | |||
1438 | * is probably wrong. Should make it like BSD or SYSV. | 1438 | * is probably wrong. Should make it like BSD or SYSV. |
1439 | */ | 1439 | */ |
1440 | 1440 | ||
1441 | static int kill_something_info(int sig, struct siginfo *info, pid_t pid) | 1441 | static int kill_something_info(int sig, struct kernel_siginfo *info, pid_t pid) |
1442 | { | 1442 | { |
1443 | int ret; | 1443 | int ret; |
1444 | 1444 | ||
@@ -1482,7 +1482,7 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid) | |||
1482 | * These are for backward compatibility with the rest of the kernel source. | 1482 | * These are for backward compatibility with the rest of the kernel source. |
1483 | */ | 1483 | */ |
1484 | 1484 | ||
1485 | int send_sig_info(int sig, struct siginfo *info, struct task_struct *p) | 1485 | int send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p) |
1486 | { | 1486 | { |
1487 | /* | 1487 | /* |
1488 | * Make sure legacy kernel users don't send in bad values | 1488 | * Make sure legacy kernel users don't send in bad values |
@@ -1533,7 +1533,7 @@ int force_sig_fault(int sig, int code, void __user *addr | |||
1533 | ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) | 1533 | ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) |
1534 | , struct task_struct *t) | 1534 | , struct task_struct *t) |
1535 | { | 1535 | { |
1536 | struct siginfo info; | 1536 | struct kernel_siginfo info; |
1537 | 1537 | ||
1538 | clear_siginfo(&info); | 1538 | clear_siginfo(&info); |
1539 | info.si_signo = sig; | 1539 | info.si_signo = sig; |
@@ -1556,7 +1556,7 @@ int send_sig_fault(int sig, int code, void __user *addr | |||
1556 | ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) | 1556 | ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) |
1557 | , struct task_struct *t) | 1557 | , struct task_struct *t) |
1558 | { | 1558 | { |
1559 | struct siginfo info; | 1559 | struct kernel_siginfo info; |
1560 | 1560 | ||
1561 | clear_siginfo(&info); | 1561 | clear_siginfo(&info); |
1562 | info.si_signo = sig; | 1562 | info.si_signo = sig; |
@@ -1576,7 +1576,7 @@ int send_sig_fault(int sig, int code, void __user *addr | |||
1576 | 1576 | ||
1577 | int force_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct *t) | 1577 | int force_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct *t) |
1578 | { | 1578 | { |
1579 | struct siginfo info; | 1579 | struct kernel_siginfo info; |
1580 | 1580 | ||
1581 | WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); | 1581 | WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); |
1582 | clear_siginfo(&info); | 1582 | clear_siginfo(&info); |
@@ -1590,7 +1590,7 @@ int force_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct | |||
1590 | 1590 | ||
1591 | int send_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct *t) | 1591 | int send_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct *t) |
1592 | { | 1592 | { |
1593 | struct siginfo info; | 1593 | struct kernel_siginfo info; |
1594 | 1594 | ||
1595 | WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); | 1595 | WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); |
1596 | clear_siginfo(&info); | 1596 | clear_siginfo(&info); |
@@ -1605,7 +1605,7 @@ EXPORT_SYMBOL(send_sig_mceerr); | |||
1605 | 1605 | ||
1606 | int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) | 1606 | int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) |
1607 | { | 1607 | { |
1608 | struct siginfo info; | 1608 | struct kernel_siginfo info; |
1609 | 1609 | ||
1610 | clear_siginfo(&info); | 1610 | clear_siginfo(&info); |
1611 | info.si_signo = SIGSEGV; | 1611 | info.si_signo = SIGSEGV; |
@@ -1620,7 +1620,7 @@ int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) | |||
1620 | #ifdef SEGV_PKUERR | 1620 | #ifdef SEGV_PKUERR |
1621 | int force_sig_pkuerr(void __user *addr, u32 pkey) | 1621 | int force_sig_pkuerr(void __user *addr, u32 pkey) |
1622 | { | 1622 | { |
1623 | struct siginfo info; | 1623 | struct kernel_siginfo info; |
1624 | 1624 | ||
1625 | clear_siginfo(&info); | 1625 | clear_siginfo(&info); |
1626 | info.si_signo = SIGSEGV; | 1626 | info.si_signo = SIGSEGV; |
@@ -1637,7 +1637,7 @@ int force_sig_pkuerr(void __user *addr, u32 pkey) | |||
1637 | */ | 1637 | */ |
1638 | int force_sig_ptrace_errno_trap(int errno, void __user *addr) | 1638 | int force_sig_ptrace_errno_trap(int errno, void __user *addr) |
1639 | { | 1639 | { |
1640 | struct siginfo info; | 1640 | struct kernel_siginfo info; |
1641 | 1641 | ||
1642 | clear_siginfo(&info); | 1642 | clear_siginfo(&info); |
1643 | info.si_signo = SIGTRAP; | 1643 | info.si_signo = SIGTRAP; |
@@ -1766,7 +1766,7 @@ ret: | |||
1766 | */ | 1766 | */ |
1767 | bool do_notify_parent(struct task_struct *tsk, int sig) | 1767 | bool do_notify_parent(struct task_struct *tsk, int sig) |
1768 | { | 1768 | { |
1769 | struct siginfo info; | 1769 | struct kernel_siginfo info; |
1770 | unsigned long flags; | 1770 | unsigned long flags; |
1771 | struct sighand_struct *psig; | 1771 | struct sighand_struct *psig; |
1772 | bool autoreap = false; | 1772 | bool autoreap = false; |
@@ -1871,7 +1871,7 @@ bool do_notify_parent(struct task_struct *tsk, int sig) | |||
1871 | static void do_notify_parent_cldstop(struct task_struct *tsk, | 1871 | static void do_notify_parent_cldstop(struct task_struct *tsk, |
1872 | bool for_ptracer, int why) | 1872 | bool for_ptracer, int why) |
1873 | { | 1873 | { |
1874 | struct siginfo info; | 1874 | struct kernel_siginfo info; |
1875 | unsigned long flags; | 1875 | unsigned long flags; |
1876 | struct task_struct *parent; | 1876 | struct task_struct *parent; |
1877 | struct sighand_struct *sighand; | 1877 | struct sighand_struct *sighand; |
@@ -1971,7 +1971,7 @@ static bool sigkill_pending(struct task_struct *tsk) | |||
1971 | * If we actually decide not to stop at all because the tracer | 1971 | * If we actually decide not to stop at all because the tracer |
1972 | * is gone, we keep current->exit_code unless clear_code. | 1972 | * is gone, we keep current->exit_code unless clear_code. |
1973 | */ | 1973 | */ |
1974 | static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info) | 1974 | static void ptrace_stop(int exit_code, int why, int clear_code, kernel_siginfo_t *info) |
1975 | __releases(¤t->sighand->siglock) | 1975 | __releases(¤t->sighand->siglock) |
1976 | __acquires(¤t->sighand->siglock) | 1976 | __acquires(¤t->sighand->siglock) |
1977 | { | 1977 | { |
@@ -2108,7 +2108,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info) | |||
2108 | 2108 | ||
2109 | static void ptrace_do_notify(int signr, int exit_code, int why) | 2109 | static void ptrace_do_notify(int signr, int exit_code, int why) |
2110 | { | 2110 | { |
2111 | siginfo_t info; | 2111 | kernel_siginfo_t info; |
2112 | 2112 | ||
2113 | clear_siginfo(&info); | 2113 | clear_siginfo(&info); |
2114 | info.si_signo = signr; | 2114 | info.si_signo = signr; |
@@ -2289,7 +2289,7 @@ static void do_jobctl_trap(void) | |||
2289 | } | 2289 | } |
2290 | } | 2290 | } |
2291 | 2291 | ||
2292 | static int ptrace_signal(int signr, siginfo_t *info) | 2292 | static int ptrace_signal(int signr, kernel_siginfo_t *info) |
2293 | { | 2293 | { |
2294 | /* | 2294 | /* |
2295 | * We do not check sig_kernel_stop(signr) but set this marker | 2295 | * We do not check sig_kernel_stop(signr) but set this marker |
@@ -2889,14 +2889,14 @@ enum siginfo_layout siginfo_layout(int sig, int si_code) | |||
2889 | return layout; | 2889 | return layout; |
2890 | } | 2890 | } |
2891 | 2891 | ||
2892 | int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from) | 2892 | int copy_siginfo_to_user(siginfo_t __user *to, const kernel_siginfo_t *from) |
2893 | { | 2893 | { |
2894 | if (copy_to_user(to, from , sizeof(struct siginfo))) | 2894 | if (copy_to_user(to, from , sizeof(struct kernel_siginfo))) |
2895 | return -EFAULT; | 2895 | return -EFAULT; |
2896 | return 0; | 2896 | return 0; |
2897 | } | 2897 | } |
2898 | 2898 | ||
2899 | int copy_siginfo_from_user(siginfo_t *to, const siginfo_t __user *from) | 2899 | int copy_siginfo_from_user(kernel_siginfo_t *to, const siginfo_t __user *from) |
2900 | { | 2900 | { |
2901 | if (copy_from_user(to, from, sizeof(struct siginfo))) | 2901 | if (copy_from_user(to, from, sizeof(struct siginfo))) |
2902 | return -EFAULT; | 2902 | return -EFAULT; |
@@ -2905,13 +2905,13 @@ int copy_siginfo_from_user(siginfo_t *to, const siginfo_t __user *from) | |||
2905 | 2905 | ||
2906 | #ifdef CONFIG_COMPAT | 2906 | #ifdef CONFIG_COMPAT |
2907 | int copy_siginfo_to_user32(struct compat_siginfo __user *to, | 2907 | int copy_siginfo_to_user32(struct compat_siginfo __user *to, |
2908 | const struct siginfo *from) | 2908 | const struct kernel_siginfo *from) |
2909 | #if defined(CONFIG_X86_X32_ABI) || defined(CONFIG_IA32_EMULATION) | 2909 | #if defined(CONFIG_X86_X32_ABI) || defined(CONFIG_IA32_EMULATION) |
2910 | { | 2910 | { |
2911 | return __copy_siginfo_to_user32(to, from, in_x32_syscall()); | 2911 | return __copy_siginfo_to_user32(to, from, in_x32_syscall()); |
2912 | } | 2912 | } |
2913 | int __copy_siginfo_to_user32(struct compat_siginfo __user *to, | 2913 | int __copy_siginfo_to_user32(struct compat_siginfo __user *to, |
2914 | const struct siginfo *from, bool x32_ABI) | 2914 | const struct kernel_siginfo *from, bool x32_ABI) |
2915 | #endif | 2915 | #endif |
2916 | { | 2916 | { |
2917 | struct compat_siginfo new; | 2917 | struct compat_siginfo new; |
@@ -2995,7 +2995,7 @@ int __copy_siginfo_to_user32(struct compat_siginfo __user *to, | |||
2995 | return 0; | 2995 | return 0; |
2996 | } | 2996 | } |
2997 | 2997 | ||
2998 | int copy_siginfo_from_user32(struct siginfo *to, | 2998 | int copy_siginfo_from_user32(struct kernel_siginfo *to, |
2999 | const struct compat_siginfo __user *ufrom) | 2999 | const struct compat_siginfo __user *ufrom) |
3000 | { | 3000 | { |
3001 | struct compat_siginfo from; | 3001 | struct compat_siginfo from; |
@@ -3085,7 +3085,7 @@ int copy_siginfo_from_user32(struct siginfo *to, | |||
3085 | * @info: if non-null, the signal's siginfo is returned here | 3085 | * @info: if non-null, the signal's siginfo is returned here |
3086 | * @ts: upper bound on process time suspension | 3086 | * @ts: upper bound on process time suspension |
3087 | */ | 3087 | */ |
3088 | static int do_sigtimedwait(const sigset_t *which, siginfo_t *info, | 3088 | static int do_sigtimedwait(const sigset_t *which, kernel_siginfo_t *info, |
3089 | const struct timespec *ts) | 3089 | const struct timespec *ts) |
3090 | { | 3090 | { |
3091 | ktime_t *to = NULL, timeout = KTIME_MAX; | 3091 | ktime_t *to = NULL, timeout = KTIME_MAX; |
@@ -3149,7 +3149,7 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese, | |||
3149 | { | 3149 | { |
3150 | sigset_t these; | 3150 | sigset_t these; |
3151 | struct timespec ts; | 3151 | struct timespec ts; |
3152 | siginfo_t info; | 3152 | kernel_siginfo_t info; |
3153 | int ret; | 3153 | int ret; |
3154 | 3154 | ||
3155 | /* XXX: Don't preclude handling different sized sigset_t's. */ | 3155 | /* XXX: Don't preclude handling different sized sigset_t's. */ |
@@ -3181,7 +3181,7 @@ COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese, | |||
3181 | { | 3181 | { |
3182 | sigset_t s; | 3182 | sigset_t s; |
3183 | struct timespec t; | 3183 | struct timespec t; |
3184 | siginfo_t info; | 3184 | kernel_siginfo_t info; |
3185 | long ret; | 3185 | long ret; |
3186 | 3186 | ||
3187 | if (sigsetsize != sizeof(sigset_t)) | 3187 | if (sigsetsize != sizeof(sigset_t)) |
@@ -3213,7 +3213,7 @@ COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese, | |||
3213 | */ | 3213 | */ |
3214 | SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) | 3214 | SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) |
3215 | { | 3215 | { |
3216 | struct siginfo info; | 3216 | struct kernel_siginfo info; |
3217 | 3217 | ||
3218 | clear_siginfo(&info); | 3218 | clear_siginfo(&info); |
3219 | info.si_signo = sig; | 3219 | info.si_signo = sig; |
@@ -3226,7 +3226,7 @@ SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) | |||
3226 | } | 3226 | } |
3227 | 3227 | ||
3228 | static int | 3228 | static int |
3229 | do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info) | 3229 | do_send_specific(pid_t tgid, pid_t pid, int sig, struct kernel_siginfo *info) |
3230 | { | 3230 | { |
3231 | struct task_struct *p; | 3231 | struct task_struct *p; |
3232 | int error = -ESRCH; | 3232 | int error = -ESRCH; |
@@ -3257,7 +3257,7 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info) | |||
3257 | 3257 | ||
3258 | static int do_tkill(pid_t tgid, pid_t pid, int sig) | 3258 | static int do_tkill(pid_t tgid, pid_t pid, int sig) |
3259 | { | 3259 | { |
3260 | struct siginfo info; | 3260 | struct kernel_siginfo info; |
3261 | 3261 | ||
3262 | clear_siginfo(&info); | 3262 | clear_siginfo(&info); |
3263 | info.si_signo = sig; | 3263 | info.si_signo = sig; |
@@ -3304,7 +3304,7 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig) | |||
3304 | return do_tkill(0, pid, sig); | 3304 | return do_tkill(0, pid, sig); |
3305 | } | 3305 | } |
3306 | 3306 | ||
3307 | static int do_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t *info) | 3307 | static int do_rt_sigqueueinfo(pid_t pid, int sig, kernel_siginfo_t *info) |
3308 | { | 3308 | { |
3309 | /* Not even root can pretend to send signals from the kernel. | 3309 | /* Not even root can pretend to send signals from the kernel. |
3310 | * Nor can they impersonate a kill()/tgkill(), which adds source info. | 3310 | * Nor can they impersonate a kill()/tgkill(), which adds source info. |
@@ -3329,7 +3329,7 @@ static int do_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t *info) | |||
3329 | SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig, | 3329 | SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig, |
3330 | siginfo_t __user *, uinfo) | 3330 | siginfo_t __user *, uinfo) |
3331 | { | 3331 | { |
3332 | siginfo_t info; | 3332 | kernel_siginfo_t info; |
3333 | int ret = copy_siginfo_from_user(&info, uinfo); | 3333 | int ret = copy_siginfo_from_user(&info, uinfo); |
3334 | if (unlikely(ret)) | 3334 | if (unlikely(ret)) |
3335 | return ret; | 3335 | return ret; |
@@ -3342,7 +3342,7 @@ COMPAT_SYSCALL_DEFINE3(rt_sigqueueinfo, | |||
3342 | int, sig, | 3342 | int, sig, |
3343 | struct compat_siginfo __user *, uinfo) | 3343 | struct compat_siginfo __user *, uinfo) |
3344 | { | 3344 | { |
3345 | siginfo_t info; | 3345 | kernel_siginfo_t info; |
3346 | int ret = copy_siginfo_from_user32(&info, uinfo); | 3346 | int ret = copy_siginfo_from_user32(&info, uinfo); |
3347 | if (unlikely(ret)) | 3347 | if (unlikely(ret)) |
3348 | return ret; | 3348 | return ret; |
@@ -3350,7 +3350,7 @@ COMPAT_SYSCALL_DEFINE3(rt_sigqueueinfo, | |||
3350 | } | 3350 | } |
3351 | #endif | 3351 | #endif |
3352 | 3352 | ||
3353 | static int do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info) | 3353 | static int do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, kernel_siginfo_t *info) |
3354 | { | 3354 | { |
3355 | /* This is only valid for single tasks */ | 3355 | /* This is only valid for single tasks */ |
3356 | if (pid <= 0 || tgid <= 0) | 3356 | if (pid <= 0 || tgid <= 0) |
@@ -3372,7 +3372,7 @@ static int do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info) | |||
3372 | SYSCALL_DEFINE4(rt_tgsigqueueinfo, pid_t, tgid, pid_t, pid, int, sig, | 3372 | SYSCALL_DEFINE4(rt_tgsigqueueinfo, pid_t, tgid, pid_t, pid, int, sig, |
3373 | siginfo_t __user *, uinfo) | 3373 | siginfo_t __user *, uinfo) |
3374 | { | 3374 | { |
3375 | siginfo_t info; | 3375 | kernel_siginfo_t info; |
3376 | int ret = copy_siginfo_from_user(&info, uinfo); | 3376 | int ret = copy_siginfo_from_user(&info, uinfo); |
3377 | if (unlikely(ret)) | 3377 | if (unlikely(ret)) |
3378 | return ret; | 3378 | return ret; |
@@ -3386,7 +3386,7 @@ COMPAT_SYSCALL_DEFINE4(rt_tgsigqueueinfo, | |||
3386 | int, sig, | 3386 | int, sig, |
3387 | struct compat_siginfo __user *, uinfo) | 3387 | struct compat_siginfo __user *, uinfo) |
3388 | { | 3388 | { |
3389 | siginfo_t info; | 3389 | kernel_siginfo_t info; |
3390 | int ret = copy_siginfo_from_user32(&info, uinfo); | 3390 | int ret = copy_siginfo_from_user32(&info, uinfo); |
3391 | if (unlikely(ret)) | 3391 | if (unlikely(ret)) |
3392 | return ret; | 3392 | return ret; |
@@ -3968,10 +3968,57 @@ __weak const char *arch_vma_name(struct vm_area_struct *vma) | |||
3968 | return NULL; | 3968 | return NULL; |
3969 | } | 3969 | } |
3970 | 3970 | ||
3971 | void __init signals_init(void) | 3971 | static inline void siginfo_buildtime_checks(void) |
3972 | { | 3972 | { |
3973 | BUILD_BUG_ON(sizeof(struct siginfo) != SI_MAX_SIZE); | 3973 | BUILD_BUG_ON(sizeof(struct siginfo) != SI_MAX_SIZE); |
3974 | 3974 | ||
3975 | /* Verify the offsets in the two siginfos match */ | ||
3976 | #define CHECK_OFFSET(field) \ | ||
3977 | BUILD_BUG_ON(offsetof(siginfo_t, field) != offsetof(kernel_siginfo_t, field)) | ||
3978 | |||
3979 | /* kill */ | ||
3980 | CHECK_OFFSET(si_pid); | ||
3981 | CHECK_OFFSET(si_uid); | ||
3982 | |||
3983 | /* timer */ | ||
3984 | CHECK_OFFSET(si_tid); | ||
3985 | CHECK_OFFSET(si_overrun); | ||
3986 | CHECK_OFFSET(si_value); | ||
3987 | |||
3988 | /* rt */ | ||
3989 | CHECK_OFFSET(si_pid); | ||
3990 | CHECK_OFFSET(si_uid); | ||
3991 | CHECK_OFFSET(si_value); | ||
3992 | |||
3993 | /* sigchld */ | ||
3994 | CHECK_OFFSET(si_pid); | ||
3995 | CHECK_OFFSET(si_uid); | ||
3996 | CHECK_OFFSET(si_status); | ||
3997 | CHECK_OFFSET(si_utime); | ||
3998 | CHECK_OFFSET(si_stime); | ||
3999 | |||
4000 | /* sigfault */ | ||
4001 | CHECK_OFFSET(si_addr); | ||
4002 | CHECK_OFFSET(si_addr_lsb); | ||
4003 | CHECK_OFFSET(si_lower); | ||
4004 | CHECK_OFFSET(si_upper); | ||
4005 | CHECK_OFFSET(si_pkey); | ||
4006 | |||
4007 | /* sigpoll */ | ||
4008 | CHECK_OFFSET(si_band); | ||
4009 | CHECK_OFFSET(si_fd); | ||
4010 | |||
4011 | /* sigsys */ | ||
4012 | CHECK_OFFSET(si_call_addr); | ||
4013 | CHECK_OFFSET(si_syscall); | ||
4014 | CHECK_OFFSET(si_arch); | ||
4015 | #undef CHECK_OFFSET | ||
4016 | } | ||
4017 | |||
4018 | void __init signals_init(void) | ||
4019 | { | ||
4020 | siginfo_buildtime_checks(); | ||
4021 | |||
3975 | sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC); | 4022 | sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC); |
3976 | } | 4023 | } |
3977 | 4024 | ||