mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-02 07:15:31 +00:00
util: allow to run criu under strace
fork_and_ptrace_attach has to fork a child with CLONE_UNTRACED, so that strace doesn't trace it. Signed-off-by: Andrei Vagin <avagin@gmail.com>
This commit is contained in:
50
criu/util.c
50
criu/util.c
@@ -661,40 +661,54 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct child_args {
|
||||||
|
int *sk_pair;
|
||||||
|
int (*child_setup)(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
static int child_func(void *_args)
|
||||||
|
{
|
||||||
|
struct child_args *args = _args;
|
||||||
|
int sk, *sk_pair = args->sk_pair;
|
||||||
|
char c = 0;
|
||||||
|
|
||||||
|
sk = sk_pair[1];
|
||||||
|
close(sk_pair[0]);
|
||||||
|
|
||||||
|
if (args->child_setup && args->child_setup() != 0)
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
if (write(sk, &c, 1) != 1) {
|
||||||
|
pr_perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
sleep(1000);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
pid_t fork_and_ptrace_attach(int (*child_setup)(void))
|
pid_t fork_and_ptrace_attach(int (*child_setup)(void))
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int sk_pair[2], sk;
|
int sk_pair[2], sk;
|
||||||
char c = 0;
|
char c = 0;
|
||||||
|
struct child_args cargs = {
|
||||||
|
.sk_pair = sk_pair,
|
||||||
|
.child_setup = child_setup,
|
||||||
|
};
|
||||||
|
|
||||||
if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair)) {
|
if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair)) {
|
||||||
pr_perror("socketpair");
|
pr_perror("socketpair");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pid = fork();
|
pid = clone_noasan(child_func, CLONE_UNTRACED | SIGCHLD, &cargs);
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
pr_perror("fork");
|
pr_perror("fork");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pid == 0) {
|
|
||||||
sk = sk_pair[1];
|
|
||||||
close(sk_pair[0]);
|
|
||||||
|
|
||||||
if (child_setup && child_setup() != 0)
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
if (write(sk, &c, 1) != 1) {
|
|
||||||
pr_perror("write");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
sleep(1000);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
sk = sk_pair[0];
|
sk = sk_pair[0];
|
||||||
close(sk_pair[1]);
|
close(sk_pair[1]);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user