see https://github.com/checkpoint-restore/criu/issues/1696 and https://github.com/checkpoint-restore/criu/pull/1706
162 lines
3.4 KiB
Diff
162 lines
3.4 KiB
Diff
From fe1f84eb98092b1aff60ae2be11e351b165f3f43 Mon Sep 17 00:00:00 2001
|
|
From: bb-cat <ningyu9@huawei.com>
|
|
Date: Wed, 2 Mar 2022 13:35:53 +0800
|
|
Subject: [PATCH 04/16] util: move fork_and_ptrace_attach helper from cr-check
|
|
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
|
|
|
---
|
|
criu/cr-check.c | 55 -------------------------------
|
|
criu/include/util.h | 1 +
|
|
criu/util.c | 57 +++++++++++++++++++++++++++++++++
|
|
3 files changed, 58 insertions(+), 55 deletions(-)
|
|
|
|
diff --git a/criu/cr-check.c b/criu/cr-check.c
|
|
index 3575fb3..d41ef8f 100644
|
|
--- a/criu/cr-check.c
|
|
+++ b/criu/cr-check.c
|
|
@@ -537,61 +537,6 @@ static int check_sigqueuinfo(void)
|
|
return 0;
|
|
}
|
|
|
|
-static pid_t fork_and_ptrace_attach(int (*child_setup)(void))
|
|
-{
|
|
- pid_t pid;
|
|
- int sk_pair[2], sk;
|
|
- char c = 0;
|
|
-
|
|
- if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair)) {
|
|
- pr_perror("socketpair");
|
|
- return -1;
|
|
- }
|
|
-
|
|
- pid = fork();
|
|
- if (pid < 0) {
|
|
- pr_perror("fork");
|
|
- return -1;
|
|
- } else 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];
|
|
- close(sk_pair[1]);
|
|
-
|
|
- if (read(sk, &c, 1) != 1) {
|
|
- close(sk);
|
|
- kill(pid, SIGKILL);
|
|
- pr_perror("read");
|
|
- return -1;
|
|
- }
|
|
-
|
|
- close(sk);
|
|
-
|
|
- if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
|
|
- pr_perror("Unable to ptrace the child");
|
|
- kill(pid, SIGKILL);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- waitpid(pid, NULL, 0);
|
|
-
|
|
- return pid;
|
|
-}
|
|
-
|
|
static int check_ptrace_peeksiginfo(void)
|
|
{
|
|
struct ptrace_peeksiginfo_args arg;
|
|
diff --git a/criu/include/util.h b/criu/include/util.h
|
|
index a2dac22..1c0b3c7 100644
|
|
--- a/criu/include/util.h
|
|
+++ b/criu/include/util.h
|
|
@@ -166,6 +166,7 @@ extern int is_anon_link_type(char *link, char *type);
|
|
|
|
extern int cr_system(int in, int out, int err, char *cmd, char *const argv[], unsigned flags);
|
|
extern int cr_system_userns(int in, int out, int err, char *cmd, char *const argv[], unsigned flags, int userns_pid);
|
|
+extern pid_t fork_and_ptrace_attach(int (*child_setup)(void));
|
|
extern int cr_daemon(int nochdir, int noclose, int close_fd);
|
|
extern int status_ready(void);
|
|
extern int is_root_user(void);
|
|
diff --git a/criu/util.c b/criu/util.c
|
|
index 06124c2..e682161 100644
|
|
--- a/criu/util.c
|
|
+++ b/criu/util.c
|
|
@@ -654,6 +654,63 @@ out:
|
|
return ret;
|
|
}
|
|
|
|
+pid_t fork_and_ptrace_attach(int (*child_setup)(void))
|
|
+{
|
|
+ pid_t pid;
|
|
+ int sk_pair[2], sk;
|
|
+ char c = 0;
|
|
+
|
|
+ if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair)) {
|
|
+ pr_perror("socketpair");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ pid = fork();
|
|
+ if (pid < 0) {
|
|
+ pr_perror("fork");
|
|
+ return -1;
|
|
+ } else 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];
|
|
+ close(sk_pair[1]);
|
|
+
|
|
+ if (read(sk, &c, 1) != 1) {
|
|
+ close(sk);
|
|
+ kill(pid, SIGKILL);
|
|
+ waitpid(pid, NULL, 0);
|
|
+ pr_perror("read");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ close(sk);
|
|
+
|
|
+ if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
|
|
+ pr_perror("Unable to ptrace the child");
|
|
+ kill(pid, SIGKILL);
|
|
+ waitpid(pid, NULL, 0);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ waitpid(pid, NULL, 0);
|
|
+
|
|
+ return pid;
|
|
+}
|
|
+
|
|
int status_ready(void)
|
|
{
|
|
char c = 0;
|
|
--
|
|
2.30.0
|
|
|