[CRIU] [RFC PATCH] util: shutdown log in cr_system_userns if error fd is negative

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Fri Apr 22 03:20:55 PDT 2016


Otherwise error in case of exec error won't be printed
The problem is that when err fd is negative, it's replaced by log fd.
Then err is moved to STDERR (that means, that log_fd is _closed_).
But log facility still consider log fd as valid and tries to use it to print
error message in case of exec failure.
Which is equal to writing to /dev/null, basically.
This patch shutdown log, if err fd was negative, thus forcing criu to output
exec error to STDERR (which was replaced by log fs, btw).

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
 criu/util.c |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/criu/util.c b/criu/util.c
index 4f88309..dae6031 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -609,6 +609,8 @@ int cr_system_userns(int in, int out, int err, char *cmd,
 		pr_perror("fork() failed");
 		goto out;
 	} else if (pid == 0) {
+		bool stop_log_fd = false;
+
 		if (userns_pid > 0) {
 			if (switch_ns(userns_pid, &user_ns_desc, NULL))
 				goto out_chld;
@@ -620,8 +622,10 @@ int cr_system_userns(int in, int out, int err, char *cmd,
 
 		if (out < 0)
 			out = log_get_fd();
-		if (err < 0)
+		if (err < 0) {
 			err = log_get_fd();
+			stop_log_fd = true;
+		}
 
 		/*
 		 * out, err, in should be a separate fds,
@@ -637,6 +641,9 @@ 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 {



More information about the CRIU mailing list