Commit fb54345e authored by Pavel Emelyanov's avatar Pavel Emelyanov

parasite: Don't keep code_orig on parasite_ctl

We need this only once -- while calling the mmap from remote
context -- so it's enough to have on-stack variable.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Acked-by: 's avatarAndrew Vagin <avagin@parallels.com>
Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent a90172df
...@@ -46,7 +46,6 @@ struct parasite_ctl { ...@@ -46,7 +46,6 @@ struct parasite_ctl {
unsigned long parasite_ip; /* service routine start ip */ unsigned long parasite_ip; /* service routine start ip */
unsigned long syscall_ip; /* entry point of infection */ unsigned long syscall_ip; /* entry point of infection */
u8 code_orig[BUILTIN_SYSCALL_SIZE];
unsigned int *addr_cmd; /* addr for command */ unsigned int *addr_cmd; /* addr for command */
void *addr_args; /* address for arguments */ void *addr_args; /* address for arguments */
......
...@@ -208,14 +208,15 @@ int __parasite_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *reg ...@@ -208,14 +208,15 @@ int __parasite_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *reg
{ {
pid_t pid = ctl->pid.real; pid_t pid = ctl->pid.real;
int err; int err;
u8 code_orig[BUILTIN_SYSCALL_SIZE];
/* /*
* Inject syscall instruction and remember original code, * Inject syscall instruction and remember original code,
* we will need it to restore original program content. * we will need it to restore original program content.
*/ */
memcpy(ctl->code_orig, code_syscall, sizeof(ctl->code_orig)); memcpy(code_orig, code_syscall, sizeof(code_orig));
if (ptrace_swap_area(pid, (void *)ctl->syscall_ip, if (ptrace_swap_area(pid, (void *)ctl->syscall_ip,
(void *)ctl->code_orig, sizeof(ctl->code_orig))) { (void *)code_orig, sizeof(code_orig))) {
pr_err("Can't inject syscall blob (pid: %d)\n", pid); pr_err("Can't inject syscall blob (pid: %d)\n", pid);
return -1; return -1;
} }
...@@ -224,8 +225,8 @@ int __parasite_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *reg ...@@ -224,8 +225,8 @@ int __parasite_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *reg
if (!err) if (!err)
err = parasite_trap(ctl, pid, regs, &ctl->orig); err = parasite_trap(ctl, pid, regs, &ctl->orig);
if (ptrace_poke_area(pid, (void *)ctl->code_orig, if (ptrace_poke_area(pid, (void *)code_orig,
(void *)ctl->syscall_ip, sizeof(ctl->code_orig))) { (void *)ctl->syscall_ip, sizeof(code_orig))) {
pr_err("Can't restore syscall blob (pid: %d)\n", ctl->pid.real); pr_err("Can't restore syscall blob (pid: %d)\n", ctl->pid.real);
err = -1; err = -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment