|
@@ -326,6 +326,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
|
|
struct sigcontext context;
|
|
struct sigcontext context;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ /* Always make any pending restarted system calls return -EINTR */
|
|
|
|
+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
|
|
|
+
|
|
/* get previous context */
|
|
/* get previous context */
|
|
if (copy_from_user(&context, usc, sizeof(context)))
|
|
if (copy_from_user(&context, usc, sizeof(context)))
|
|
goto badframe;
|
|
goto badframe;
|
|
@@ -411,6 +414,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
|
|
unsigned long usp;
|
|
unsigned long usp;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ /* Always make any pending restarted system calls return -EINTR */
|
|
|
|
+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
|
|
|
+
|
|
err = __get_user(temp, &uc->uc_mcontext.version);
|
|
err = __get_user(temp, &uc->uc_mcontext.version);
|
|
if (temp != MCONTEXT_VERSION)
|
|
if (temp != MCONTEXT_VERSION)
|
|
goto badframe;
|
|
goto badframe;
|
|
@@ -937,6 +943,15 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
|
|
regs->d0 = -EINTR;
|
|
regs->d0 = -EINTR;
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case -ERESTART_RESTARTBLOCK:
|
|
|
|
+ if (!has_handler) {
|
|
|
|
+ regs->d0 = __NR_restart_syscall;
|
|
|
|
+ regs->pc -= 2;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ regs->d0 = -EINTR;
|
|
|
|
+ break;
|
|
|
|
+
|
|
case -ERESTARTSYS:
|
|
case -ERESTARTSYS:
|
|
if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
|
|
if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
|
|
regs->d0 = -EINTR;
|
|
regs->d0 = -EINTR;
|