[CRIU] [PATCH v2] util: disable log service in cr_system_userns if error fd was -1

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Fri Apr 22 09:44:24 PDT 2016


In case of error fd was negative, log_fd is _moved_ as STDERR for the child.
After move, log_fd is closed, and thus log service is broken and any error
prints will disappear.
This patch disables log service, thus redirecting error output to STDERR
(which is log fd in this case).

Calling of log fini is:
1) to early: reopen_fd_as_nocheck will fail
2) to much: close_safe will print error message, because log fd was already
closed

v2:
log_disable helper introduced

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
 criu/include/log.h |    1 +
 criu/log.c         |    5 +++++
 criu/util.c        |   17 ++++++++++++++---
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/criu/include/log.h b/criu/include/log.h
index fe53a7c..7ecc3fe 100644
--- a/criu/include/log.h
+++ b/criu/include/log.h
@@ -6,6 +6,7 @@
 #include "criu-log.h"
 
 extern int log_init(const char *output);
+extern void log_disable(void);
 extern void log_fini(void);
 extern int log_init_by_pid(void);
 extern void log_closedir(void);
diff --git a/criu/log.c b/criu/log.c
index 6c5d807..1992e3a 100644
--- a/criu/log.c
+++ b/criu/log.c
@@ -134,6 +134,11 @@ int log_init_by_pid(void)
 	return log_init(path);
 }
 
+void log_disable(void)
+{
+	disable_service_fd(LOG_FD_OFF);
+}
+
 void log_fini(void)
 {
 	close_service_fd(LOG_FD_OFF);
diff --git a/criu/util.c b/criu/util.c
index dae6031..216efb6 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -451,6 +451,17 @@ int criu_get_image_dir(void)
 	return get_service_fd(IMG_FD_OFF);
 }
 
+int disable_service_fd(enum sfd_type type)
+{
+	int fd;
+
+	fd = get_service_fd(type);
+	if (fd < 0)
+		return 0;
+
+	clear_bit(type, sfd_map);
+	return 0;
+}
 int close_service_fd(enum sfd_type type)
 {
 	int fd;
@@ -641,9 +652,6 @@ int cr_system_userns(int in, int out, int err, char *cmd,
 		    move_img_fd(&err, STDIN_FILENO))
 			goto out_chld;
 
-		if (stop_log_fd)
-			log_fini();
-
 		if (in < 0) {
 			close(STDIN_FILENO);
 		} else {
@@ -660,6 +668,9 @@ int cr_system_userns(int in, int out, int err, char *cmd,
 		if (reopen_fd_as_nocheck(STDERR_FILENO, err))
 			goto out_chld;
 
+		if (stop_log_fd)
+			log_disable();
+
 		execvp(cmd, argv);
 
 		pr_perror("exec failed");



More information about the CRIU mailing list