[CRIU] [PATCH 5/8] parasite: restore registers after each parasite command
Pavel Emelyanov
xemul at parallels.com
Mon Jul 15 13:03:42 EDT 2013
On 07/11/2013 01:46 PM, Andrey Vagin wrote:
> Currenly we can restore blocking signals with help ptrace,
> so if registers are restored after command, a process state
> will not be corrupted if criu crashes.
If criu crashes the sigreturn rescue code will restore the regs. No?
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> parasite-syscall.c | 19 +++++++------------
> 1 file changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/parasite-syscall.c b/parasite-syscall.c
> index 2b9877c..07b45bc 100644
> --- a/parasite-syscall.c
> +++ b/parasite-syscall.c
> @@ -84,7 +84,7 @@ int __parasite_execute_trap(struct parasite_ctl *ctl, pid_t pid,
>
> if (ptrace(PTRACE_SETREGS, pid, NULL, regs)) {
> pr_perror("Can't set registers (pid: %d)", pid);
> - goto err;
> + goto err_sigmask;
> }
>
> /*
> @@ -130,7 +130,13 @@ int __parasite_execute_trap(struct parasite_ctl *ctl, pid_t pid,
> * parasite code. So we're done.
> */
> ret = 0;
> +
> err:
> + if (ptrace(PTRACE_SETREGS, pid, NULL, regs_orig)) {
> + pr_perror("Can't restore registers (pid: %d)", pid);
> + ret = -1;
> + }
> +err_sigmask:
> if (ptrace(PTRACE_SETSIGMASK, pid, sizeof(k_rtsigset_t), &sigmask)) {
> pr_perror("Can't block signals");
> ret = -1;
> @@ -164,12 +170,6 @@ static int parasite_execute_trap_by_pid(unsigned int cmd,
> if (ret)
> pr_err("Parasite exited with %d\n", ret);
>
> - if (ctl->pid.real != pid)
> - if (ptrace(PTRACE_SETREGS, pid, NULL, regs_orig)) {
> - pr_perror("Can't restore registers (pid: %d)", pid);
> - return -1;
> - }
> -
> return ret;
> }
>
> @@ -864,11 +864,6 @@ int parasite_cure_remote(struct parasite_ctl *ctl)
> ret = -1;
> }
>
> - if (ptrace(PTRACE_SETREGS, ctl->pid.real, NULL, &ctl->regs_orig)) {
> - pr_err("Can't restore registers (pid: %d)\n", ctl->pid.real);
> - ret = -1;
> - }
> -
> return ret;
> }
>
>
More information about the CRIU
mailing list