Commit 80efa564 authored by Pavel Emelyanov's avatar Pavel Emelyanov

parasite: Reshuffle tsock creation

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 8ad653c7
...@@ -434,11 +434,11 @@ static int restore_child_handler() ...@@ -434,11 +434,11 @@ static int restore_child_handler()
return 0; return 0;
} }
static int ssock = -1;
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;
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());
...@@ -469,23 +469,31 @@ static int prepare_tsock(struct parasite_ctl *ctl, pid_t pid, ...@@ -469,23 +469,31 @@ static int prepare_tsock(struct parasite_ctl *ctl, pid_t pid,
} }
} }
/*
* Set to -1 to prevent any accidental misuse. The
* only valid user of it is accept_tsock().
*/
ctl->tsock = -ssock;
return 0; return 0;
err: err:
close_safe(&ssock); close_safe(&ssock);
return -1; return -1;
} }
static int accept_tsock() static int accept_tsock(struct parasite_ctl *ctl)
{ {
int sock; int sock;
int ask = -ctl->tsock; /* this '-' is explained above */
sock = accept(ssock, NULL, 0); sock = accept(ask, NULL, 0);
if (sock < 0) { if (sock < 0) {
pr_perror("Can't accept connection to the transport socket"); pr_perror("Can't accept connection to the transport socket");
close_safe(&ssock); close(ask);
return -1;
} }
return sock; ctl->tsock = sock;
return 0;
} }
static int parasite_init_daemon(struct parasite_ctl *ctl) static int parasite_init_daemon(struct parasite_ctl *ctl)
...@@ -513,8 +521,7 @@ static int parasite_init_daemon(struct parasite_ctl *ctl) ...@@ -513,8 +521,7 @@ static int parasite_init_daemon(struct parasite_ctl *ctl)
if (parasite_run(pid, PTRACE_CONT, ctl->parasite_ip, ctl->rstack, &regs, &ctl->orig)) if (parasite_run(pid, PTRACE_CONT, ctl->parasite_ip, ctl->rstack, &regs, &ctl->orig))
goto err; goto err;
ctl->tsock = accept_tsock(); if (accept_tsock(ctl) < 0)
if (ctl->tsock < 0)
goto err; goto err;
if (parasite_send_fd(ctl, log_get_fd())) if (parasite_send_fd(ctl, log_get_fd()))
......
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