[CRIU] [PATCH] tty: Make sure no /dev/tty inheritance exist

Cyrill Gorcunov gorcunov at openvz.org
Fri Apr 28 06:18:38 PDT 2017


Currently we support restoring opened /dev/tty reference
if only control terminal belongs to the same process,
ie no inheritance is allowed.

Thus we should refuse to dump in such scenario
otherwise restore will fail.

Reported-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
---
 criu/tty.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/criu/tty.c b/criu/tty.c
index ade559ce0ce1..1d65c86f78ac 100644
--- a/criu/tty.c
+++ b/criu/tty.c
@@ -114,6 +114,7 @@ struct tty_dump_info {
 	u32				id;
 	pid_t				sid;
 	pid_t				pgrp;
+	pid_t				pid_real;
 	int				fd;
 	int				mnt_id;
 	struct tty_driver		*driver;
@@ -1752,6 +1753,7 @@ static int dump_tty_info(int lfd, u32 id, const struct fd_parms *p, struct tty_d
 	dinfo->id		= id;
 	dinfo->sid		= pti->sid;
 	dinfo->pgrp		= pti->pgrp;
+	dinfo->pid_real		= p->pid;
 	dinfo->fd		= p->fd;
 	dinfo->mnt_id		= p->mnt_id;
 	dinfo->driver		= driver;
@@ -2111,8 +2113,45 @@ static int tty_dump_queued_data(void)
 	return ret;
 }
 
+static int tty_verify_ctty(void)
+{
+	struct tty_dump_info *d, *p;
+
+	list_for_each_entry(d, &all_ttys, list) {
+		struct tty_dump_info *n = NULL;
+
+		if (d->driver->type != TTY_TYPE__CTTY)
+			continue;
+
+		list_for_each_entry(p, &all_ttys, list) {
+			if (!is_pty(p->driver)	||
+			    p->sid != d->sid	||
+			    p->pgrp != d->sid)
+				continue;
+			n = p;
+			break;
+		}
+
+		if (!n) {
+			pr_err("ctty inheritance detected sid/pgrp %d, "
+			       "no PTY peer with sid/pgrp needed\n",
+			       d->sid);
+			return -ENOENT;
+		} else if (n->pid_real != d->pid_real) {
+			pr_err("ctty inheritance detected sid/pgrp %d "
+			       "(ctty pid_real %d pty pid_real %d)\n",
+			       d->sid, d->pid_real, n->pid_real);
+			return -ENOENT;
+		}
+	}
+
+	return 0;
+}
+
 int tty_post_actions(void)
 {
+	if (tty_verify_ctty())
+		return -1;
 	if (tty_verify_active_pairs(NULL))
 		return -1;
 	else if (tty_dump_queued_data())
-- 
2.7.4



More information about the CRIU mailing list