[CRIU] [PATCH 2/2] tty: Set fsuid/fsgid when opening master peer

Cyrill Gorcunov gorcunov at openvz.org
Fri Aug 5 10:55:41 PDT 2016


https://github.com/xemul/criu/issues/198

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 criu/tty.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/criu/tty.c b/criu/tty.c
index ec09f30d9d8d..5f6a05674003 100644
--- a/criu/tty.c
+++ b/criu/tty.c
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <limits.h>
 #include <fcntl.h>
+#include <sys/fsuid.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/mman.h>
@@ -555,12 +556,24 @@ static char *path_from_reg(struct file_desc *d)
 
 static int pty_open_ptmx_index(struct file_desc *d, int index, int flags)
 {
+	CredsEntry *ce = current->core[0]->thread_core->creds;
 	int fds[32], i, ret = -1, cur_idx;
+	int old_fsuid, old_fsgid;
 
 	memset(fds, 0xff, sizeof(fds));
 
 	mutex_lock(tty_mutex);
 
+	/*
+	 * The kernel creates slave peers with
+	 * fsuid/fsgid taken from mount options
+	 * or current task, so we have to setup
+	 * destination uids here and restore them
+	 * back upon open.
+	 */
+	old_fsuid = setfsuid(ce->fsuid);
+	old_fsgid = setfsgid(ce->fsgid);
+
 	for (i = 0; i < ARRAY_SIZE(fds); i++) {
 		fds[i] = open_tty_reg(d, flags);
 		if (fds[i] < 0) {
@@ -600,8 +613,13 @@ static int pty_open_ptmx_index(struct file_desc *d, int index, int flags)
 			close(fds[i]);
 	}
 
-	mutex_unlock(tty_mutex);
+	setfsuid(old_fsuid);
+	setfsgid(old_fsgid);
+
+	if (setfsuid(-1) != old_fsuid || setfsgid(-1) != old_fsgid)
+		pr_warn("Failed to restore old fsuid/fsgid!\n");
 
+	mutex_unlock(tty_mutex);
 	return ret;
 }
 
-- 
2.7.4



More information about the CRIU mailing list