Commit 81277f21 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov

parasite: Embed vma_area into control block

No need to track in a weird way. It's small structure.

Moreover, the rest of parasite code doesn't count for
space allocated _after_ the main control block. We simply
had happened to not hit any problems before.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 995ef5ec
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
/* parasite control block */ /* parasite control block */
struct parasite_ctl { struct parasite_ctl {
pid_t pid; /* process pid where we live in */ pid_t pid; /* process pid where we live in */
struct vma_area *vma_area; /* our space we host */ struct vma_area vma_area; /* our space we host */
unsigned long parasite_ip; /* service routine start ip */ unsigned long parasite_ip; /* service routine start ip */
unsigned long addr_cmd; /* addr for command */ unsigned long addr_cmd; /* addr for command */
unsigned long addr_args; /* address for arguments */ unsigned long addr_args; /* address for arguments */
......
...@@ -505,8 +505,8 @@ int parasite_cure_seized(struct parasite_ctl *ctl, struct list_head *vma_area_li ...@@ -505,8 +505,8 @@ int parasite_cure_seized(struct parasite_ctl *ctl, struct list_head *vma_area_li
regs.ip = vma_area->vma.start; regs.ip = vma_area->vma.start;
ret = munmap_seized(ctl->pid, &regs, ret = munmap_seized(ctl->pid, &regs,
(void *)ctl->vma_area->vma.start, (void *)ctl->vma_area.vma.start,
(size_t)vma_entry_len(&ctl->vma_area->vma)); (size_t)vma_entry_len(&ctl->vma_area.vma));
if (ret) if (ret)
pr_err("munmap_seized failed (pid: %d)\n", ctl->pid); pr_err("munmap_seized failed (pid: %d)\n", ctl->pid);
...@@ -527,15 +527,14 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_are ...@@ -527,15 +527,14 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_are
struct vma_area *vma_area; struct vma_area *vma_area;
void *mmaped; void *mmaped;
ctl = xzalloc(sizeof(*ctl) + sizeof(*vma_area)); ctl = xzalloc(sizeof(*ctl));
if (!ctl) { if (!ctl) {
pr_err("Parasite control block allocation failed (pid: %d)\n", pid); pr_err("Parasite control block allocation failed (pid: %d)\n", pid);
goto err; goto err;
} }
/* Setup control block */ /* Setup control block */
ctl->pid = pid; ctl->pid = pid;
ctl->vma_area = (struct vma_area *)(char *)&ctl[sizeof(*ctl)];
if (ptrace(PTRACE_GETREGS, pid, NULL, &regs)) if (ptrace(PTRACE_GETREGS, pid, NULL, &regs))
pr_err_jmp(err_free); pr_err_jmp(err_free);
...@@ -552,14 +551,14 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_are ...@@ -552,14 +551,14 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_are
/* /*
* Prepare for in-process syscall. * Prepare for in-process syscall.
*/ */
ctl->vma_area->vma.prot = PROT_READ | PROT_WRITE | PROT_EXEC; ctl->vma_area.vma.prot = PROT_READ | PROT_WRITE | PROT_EXEC;
ctl->vma_area->vma.flags = MAP_PRIVATE | MAP_ANONYMOUS; ctl->vma_area.vma.flags = MAP_PRIVATE | MAP_ANONYMOUS;
regs.ip = vma_area->vma.start; regs.ip = vma_area->vma.start;
mmaped = mmap_seized(pid, &regs, NULL, (size_t)parasite_size, mmaped = mmap_seized(pid, &regs, NULL, (size_t)parasite_size,
(int)ctl->vma_area->vma.prot, (int)ctl->vma_area.vma.prot,
(int)ctl->vma_area->vma.flags, (int)ctl->vma_area.vma.flags,
(int)-1, (off_t)0); (int)-1, (off_t)0);
if (!mmaped || (long)mmaped < 0) { if (!mmaped || (long)mmaped < 0) {
...@@ -571,8 +570,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_are ...@@ -571,8 +570,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_are
ctl->addr_cmd = PARASITE_CMD_ADDR((unsigned long)mmaped); ctl->addr_cmd = PARASITE_CMD_ADDR((unsigned long)mmaped);
ctl->addr_args = PARASITE_ARGS_ADDR((unsigned long)mmaped); ctl->addr_args = PARASITE_ARGS_ADDR((unsigned long)mmaped);
ctl->vma_area->vma.start= (u64)mmaped; ctl->vma_area.vma.start = (u64)mmaped;
ctl->vma_area->vma.end = (u64)(mmaped + parasite_size); ctl->vma_area.vma.end = (u64)(mmaped + parasite_size);
if (ptrace_poke_area(pid, parasite_blob, mmaped, parasite_size)) { if (ptrace_poke_area(pid, parasite_blob, mmaped, parasite_size)) {
pr_err("Can't inject parasite blob (pid: %d)\n", pid); pr_err("Can't inject parasite blob (pid: %d)\n", pid);
......
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