.. | .. |
---|
47 | 47 | |
---|
48 | 48 | #include <asm/setup.h> |
---|
49 | 49 | #include <linux/uaccess.h> |
---|
50 | | -#include <asm/pgtable.h> |
---|
51 | 50 | #include <asm/traps.h> |
---|
52 | 51 | #include <asm/ucontext.h> |
---|
53 | 52 | #include <asm/cacheflush.h> |
---|
.. | .. |
---|
62 | 61 | #define FMT4SIZE 0 |
---|
63 | 62 | #else |
---|
64 | 63 | #define FORMAT 0 |
---|
65 | | -#define FMT4SIZE sizeof(((struct frame *)0)->un.fmt4) |
---|
| 64 | +#define FMT4SIZE sizeof_field(struct frame, un.fmt4) |
---|
66 | 65 | #endif |
---|
67 | 66 | |
---|
68 | 67 | static const int frame_size_change[16] = { |
---|
69 | | - [1] = -1, /* sizeof(((struct frame *)0)->un.fmt1), */ |
---|
70 | | - [2] = sizeof(((struct frame *)0)->un.fmt2), |
---|
71 | | - [3] = sizeof(((struct frame *)0)->un.fmt3), |
---|
| 68 | + [1] = -1, /* sizeof_field(struct frame, un.fmt1), */ |
---|
| 69 | + [2] = sizeof_field(struct frame, un.fmt2), |
---|
| 70 | + [3] = sizeof_field(struct frame, un.fmt3), |
---|
72 | 71 | [4] = FMT4SIZE, |
---|
73 | | - [5] = -1, /* sizeof(((struct frame *)0)->un.fmt5), */ |
---|
74 | | - [6] = -1, /* sizeof(((struct frame *)0)->un.fmt6), */ |
---|
75 | | - [7] = sizeof(((struct frame *)0)->un.fmt7), |
---|
76 | | - [8] = -1, /* sizeof(((struct frame *)0)->un.fmt8), */ |
---|
77 | | - [9] = sizeof(((struct frame *)0)->un.fmt9), |
---|
78 | | - [10] = sizeof(((struct frame *)0)->un.fmta), |
---|
79 | | - [11] = sizeof(((struct frame *)0)->un.fmtb), |
---|
80 | | - [12] = -1, /* sizeof(((struct frame *)0)->un.fmtc), */ |
---|
81 | | - [13] = -1, /* sizeof(((struct frame *)0)->un.fmtd), */ |
---|
82 | | - [14] = -1, /* sizeof(((struct frame *)0)->un.fmte), */ |
---|
83 | | - [15] = -1, /* sizeof(((struct frame *)0)->un.fmtf), */ |
---|
| 72 | + [5] = -1, /* sizeof_field(struct frame, un.fmt5), */ |
---|
| 73 | + [6] = -1, /* sizeof_field(struct frame, un.fmt6), */ |
---|
| 74 | + [7] = sizeof_field(struct frame, un.fmt7), |
---|
| 75 | + [8] = -1, /* sizeof_field(struct frame, un.fmt8), */ |
---|
| 76 | + [9] = sizeof_field(struct frame, un.fmt9), |
---|
| 77 | + [10] = sizeof_field(struct frame, un.fmta), |
---|
| 78 | + [11] = sizeof_field(struct frame, un.fmtb), |
---|
| 79 | + [12] = -1, /* sizeof_field(struct frame, un.fmtc), */ |
---|
| 80 | + [13] = -1, /* sizeof_field(struct frame, un.fmtd), */ |
---|
| 81 | + [14] = -1, /* sizeof_field(struct frame, un.fmte), */ |
---|
| 82 | + [15] = -1, /* sizeof_field(struct frame, un.fmtf), */ |
---|
84 | 83 | }; |
---|
85 | 84 | |
---|
86 | 85 | static inline int frame_extra_sizes(int f) |
---|
.. | .. |
---|
651 | 650 | regs->vector = formatvec & 0xfff; |
---|
652 | 651 | } else { |
---|
653 | 652 | struct switch_stack *sw = (struct switch_stack *)regs - 1; |
---|
654 | | - unsigned long buf[fsize / 2]; /* yes, twice as much */ |
---|
| 653 | + /* yes, twice as much as max(sizeof(frame.un.fmt<x>)) */ |
---|
| 654 | + unsigned long buf[sizeof_field(struct frame, un) / 2]; |
---|
655 | 655 | |
---|
656 | 656 | /* that'll make sure that expansion won't crap over data */ |
---|
657 | 657 | if (copy_from_user(buf + fsize / 4, fp, fsize)) |
---|
.. | .. |
---|
787 | 787 | struct sigframe __user *frame = (struct sigframe __user *)(usp - 4); |
---|
788 | 788 | sigset_t set; |
---|
789 | 789 | |
---|
790 | | - if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
---|
| 790 | + if (!access_ok(frame, sizeof(*frame))) |
---|
791 | 791 | goto badframe; |
---|
792 | 792 | if (__get_user(set.sig[0], &frame->sc.sc_mask) || |
---|
793 | 793 | (_NSIG_WORDS > 1 && |
---|
.. | .. |
---|
802 | 802 | return regs->d0; |
---|
803 | 803 | |
---|
804 | 804 | badframe: |
---|
805 | | - force_sig(SIGSEGV, current); |
---|
| 805 | + force_sig(SIGSEGV); |
---|
806 | 806 | return 0; |
---|
807 | 807 | } |
---|
808 | 808 | |
---|
.. | .. |
---|
812 | 812 | struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4); |
---|
813 | 813 | sigset_t set; |
---|
814 | 814 | |
---|
815 | | - if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
---|
| 815 | + if (!access_ok(frame, sizeof(*frame))) |
---|
816 | 816 | goto badframe; |
---|
817 | 817 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) |
---|
818 | 818 | goto badframe; |
---|
.. | .. |
---|
824 | 824 | return regs->d0; |
---|
825 | 825 | |
---|
826 | 826 | badframe: |
---|
827 | | - force_sig(SIGSEGV, current); |
---|
| 827 | + force_sig(SIGSEGV); |
---|
828 | 828 | return 0; |
---|
829 | 829 | } |
---|
830 | 830 | |
---|
.. | .. |
---|
928 | 928 | err |= __put_user(0x70004e40 + (__NR_sigreturn << 16), |
---|
929 | 929 | (long __user *)(frame->retcode)); |
---|
930 | 930 | #else |
---|
931 | | - err |= __put_user((void *) ret_from_user_signal, &frame->pretcode); |
---|
| 931 | + err |= __put_user((long) ret_from_user_signal, |
---|
| 932 | + (long __user *) &frame->pretcode); |
---|
932 | 933 | #endif |
---|
933 | 934 | |
---|
934 | 935 | if (err) |
---|
.. | .. |
---|
1007 | 1008 | err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4)); |
---|
1008 | 1009 | #endif |
---|
1009 | 1010 | #else |
---|
1010 | | - err |= __put_user((void *) ret_from_user_rt_signal, &frame->pretcode); |
---|
| 1011 | + err |= __put_user((long) ret_from_user_rt_signal, |
---|
| 1012 | + (long __user *) &frame->pretcode); |
---|
1011 | 1013 | #endif /* CONFIG_MMU */ |
---|
1012 | 1014 | |
---|
1013 | 1015 | if (err) |
---|
.. | .. |
---|
1063 | 1065 | regs->d0 = -EINTR; |
---|
1064 | 1066 | break; |
---|
1065 | 1067 | } |
---|
1066 | | - /* fallthrough */ |
---|
| 1068 | + fallthrough; |
---|
1067 | 1069 | case -ERESTARTNOINTR: |
---|
1068 | 1070 | do_restart: |
---|
1069 | 1071 | regs->d0 = regs->orig_d0; |
---|
.. | .. |
---|
1127 | 1129 | |
---|
1128 | 1130 | void do_notify_resume(struct pt_regs *regs) |
---|
1129 | 1131 | { |
---|
1130 | | - if (test_thread_flag(TIF_SIGPENDING)) |
---|
| 1132 | + if (test_thread_flag(TIF_NOTIFY_SIGNAL) || |
---|
| 1133 | + test_thread_flag(TIF_SIGPENDING)) |
---|
1131 | 1134 | do_signal(regs); |
---|
1132 | 1135 | |
---|
1133 | | - if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) |
---|
| 1136 | + if (test_thread_flag(TIF_NOTIFY_RESUME)) |
---|
1134 | 1137 | tracehook_notify_resume(regs); |
---|
1135 | 1138 | } |
---|