forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-09-20 a36159eec6ca17402b0e146b86efaf76568dc353
kernel/arch/nios2/kernel/signal.c
....@@ -36,10 +36,10 @@
3636
3737 static inline int rt_restore_ucontext(struct pt_regs *regs,
3838 struct switch_stack *sw,
39
- struct ucontext *uc, int *pr2)
39
+ struct ucontext __user *uc, int *pr2)
4040 {
4141 int temp;
42
- unsigned long *gregs = uc->uc_mcontext.gregs;
42
+ unsigned long __user *gregs = uc->uc_mcontext.gregs;
4343 int err;
4444
4545 /* Always make any pending restarted system calls return -EINTR */
....@@ -102,11 +102,12 @@
102102 {
103103 struct pt_regs *regs = (struct pt_regs *)(sw + 1);
104104 /* Verify, can we follow the stack back */
105
- struct rt_sigframe *frame = (struct rt_sigframe *) regs->sp;
105
+ struct rt_sigframe __user *frame;
106106 sigset_t set;
107107 int rval;
108108
109
- if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
109
+ frame = (struct rt_sigframe __user *) regs->sp;
110
+ if (!access_ok(frame, sizeof(*frame)))
110111 goto badframe;
111112
112113 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
....@@ -120,14 +121,14 @@
120121 return rval;
121122
122123 badframe:
123
- force_sig(SIGSEGV, current);
124
+ force_sig(SIGSEGV);
124125 return 0;
125126 }
126127
127
-static inline int rt_setup_ucontext(struct ucontext *uc, struct pt_regs *regs)
128
+static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
128129 {
129130 struct switch_stack *sw = (struct switch_stack *)regs - 1;
130
- unsigned long *gregs = uc->uc_mcontext.gregs;
131
+ unsigned long __user *gregs = uc->uc_mcontext.gregs;
131132 int err = 0;
132133
133134 err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
....@@ -162,8 +163,9 @@
162163 return err;
163164 }
164165
165
-static inline void *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
166
- size_t frame_size)
166
+static inline void __user *get_sigframe(struct ksignal *ksig,
167
+ struct pt_regs *regs,
168
+ size_t frame_size)
167169 {
168170 unsigned long usp;
169171
....@@ -174,13 +176,13 @@
174176 usp = sigsp(usp, ksig);
175177
176178 /* Verify, is it 32 or 64 bit aligned */
177
- return (void *)((usp - frame_size) & -8UL);
179
+ return (void __user *)((usp - frame_size) & -8UL);
178180 }
179181
180182 static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
181183 struct pt_regs *regs)
182184 {
183
- struct rt_sigframe *frame;
185
+ struct rt_sigframe __user *frame;
184186 int err = 0;
185187
186188 frame = get_sigframe(ksig, regs, sizeof(*frame));
....@@ -211,7 +213,7 @@
211213 return 0;
212214
213215 give_sigsegv:
214
- force_sigsegv(ksig->sig, current);
216
+ force_sigsegv(ksig->sig);
215217 return -EFAULT;
216218 }
217219
....@@ -240,7 +242,7 @@
240242 /*
241243 * If we were from a system call, check for system call restarting...
242244 */
243
- if (regs->orig_r2 >= 0) {
245
+ if (regs->orig_r2 >= 0 && regs->r1) {
244246 continue_addr = regs->ea;
245247 restart_addr = continue_addr - 4;
246248 retval = regs->r2;
....@@ -252,6 +254,7 @@
252254 switch (retval) {
253255 case ERESTART_RESTARTBLOCK:
254256 restart = -2;
257
+ fallthrough;
255258 case ERESTARTNOHAND:
256259 case ERESTARTSYS:
257260 case ERESTARTNOINTR:
....@@ -261,6 +264,7 @@
261264 regs->ea = restart_addr;
262265 break;
263266 }
267
+ regs->orig_r2 = -1;
264268 }
265269
266270 if (get_signal(&ksig)) {
....@@ -305,7 +309,8 @@
305309 if (!user_mode(regs))
306310 return 0;
307311
308
- if (test_thread_flag(TIF_SIGPENDING)) {
312
+ if (test_thread_flag(TIF_SIGPENDING) ||
313
+ test_thread_flag(TIF_NOTIFY_SIGNAL)) {
309314 int restart = do_signal(regs);
310315
311316 if (unlikely(restart)) {
....@@ -316,7 +321,7 @@
316321 */
317322 return restart;
318323 }
319
- } else if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME))
324
+ } else if (test_thread_flag(TIF_NOTIFY_RESUME))
320325 tracehook_notify_resume(regs);
321326
322327 return 0;