Commit aa72d887 authored by Andrei Vagin's avatar Andrei Vagin

compel: check whether a parasite socket is prepared each time

Currently we prepare a parasite socket only once and
save it in a static variable.

It's bad idea to use a static variable in a library.

In addition, it doesn't work if we have processes in
different network namespaces. In this case, we have to have
a separate socket for each namespace.

v2: fix compilation on Alpine
    convert *p_sock into sock

travis-ci: success for compel: check whether a parasite socket is prepared each time (rev2)
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 51458d45
...@@ -96,7 +96,7 @@ typedef int (*open_proc_fn)(int pid, int mode, const char *fmt, ...) ...@@ -96,7 +96,7 @@ typedef int (*open_proc_fn)(int pid, int mode, const char *fmt, ...)
__attribute__ ((__format__ (__printf__, 3, 4))); __attribute__ ((__format__ (__printf__, 3, 4)));
struct infect_ctx { struct infect_ctx {
int *p_sock; int sock;
/* /*
* Regs manipulation context. * Regs manipulation context.
......
...@@ -320,20 +320,27 @@ static int gen_parasite_saddr(struct sockaddr_un *saddr, int key) ...@@ -320,20 +320,27 @@ static int gen_parasite_saddr(struct sockaddr_un *saddr, int key)
static int prepare_tsock(struct parasite_ctl *ctl, pid_t pid, static int prepare_tsock(struct parasite_ctl *ctl, pid_t pid,
struct parasite_init_args *args) struct parasite_init_args *args)
{ {
static int ssock = -1; int ssock = -1;
socklen_t sk_len;
struct sockaddr_un addr;
pr_info("Putting tsock into pid %d\n", pid); pr_info("Putting tsock into pid %d\n", pid);
args->h_addr_len = gen_parasite_saddr(&args->h_addr, getpid()); args->h_addr_len = gen_parasite_saddr(&args->h_addr, getpid());
if (ssock == -1) { ssock = ctl->ictx.sock;
ssock = *ctl->ictx.p_sock; sk_len = sizeof(addr);
if (ssock == -1) { if (ssock == -1) {
pr_err("No socket in ictx\n"); pr_err("No socket in ictx\n");
goto err; goto err;
} }
*ctl->ictx.p_sock = -1; if (getsockname(ssock, (struct sockaddr *) &addr, &sk_len) < 0) {
pr_perror("Unable to get name for a socket");
return -1;
}
if (sk_len == sizeof(addr.sun_family)) {
if (bind(ssock, (struct sockaddr *)&args->h_addr, args->h_addr_len) < 0) { if (bind(ssock, (struct sockaddr *)&args->h_addr, args->h_addr_len) < 0) {
pr_perror("Can't bind socket"); pr_perror("Can't bind socket");
goto err; goto err;
......
...@@ -581,7 +581,7 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, ...@@ -581,7 +581,7 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
ictx->open_proc = do_open_proc; ictx->open_proc = do_open_proc;
ictx->child_handler = sigchld_handler; ictx->child_handler = sigchld_handler;
ictx->p_sock = &dmpi(item)->netns->net.seqsk; ictx->sock = dmpi(item)->netns->net.seqsk;
ictx->save_regs = save_task_regs; ictx->save_regs = save_task_regs;
ictx->make_sigframe = make_sigframe; ictx->make_sigframe = make_sigframe;
ictx->regs_arg = item->core[0]; ictx->regs_arg = item->core[0];
......
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