mn10300: prevent double syscall restarts
set ->orig_d0 to -1, same as what sigreturn does Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -432,6 +432,12 @@ give_sigsegv:
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void stepback(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
regs->pc -= 2;
|
||||||
|
regs->orig_d0 = -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* handle the actual delivery of a signal to userspace
|
* handle the actual delivery of a signal to userspace
|
||||||
*/
|
*/
|
||||||
@@ -459,7 +465,7 @@ static int handle_signal(int sig,
|
|||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->d0 = regs->orig_d0;
|
regs->d0 = regs->orig_d0;
|
||||||
regs->pc -= 2;
|
stepback(regs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -527,12 +533,12 @@ static void do_signal(struct pt_regs *regs)
|
|||||||
case -ERESTARTSYS:
|
case -ERESTARTSYS:
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->d0 = regs->orig_d0;
|
regs->d0 = regs->orig_d0;
|
||||||
regs->pc -= 2;
|
stepback(regs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
regs->d0 = __NR_restart_syscall;
|
regs->d0 = __NR_restart_syscall;
|
||||||
regs->pc -= 2;
|
stepback(regs);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user