screen-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[screen-devel] [PATCH] handle pty device from different namespace


From: Christian Brauner
Subject: [screen-devel] [PATCH] handle pty device from different namespace
Date: Wed, 22 Mar 2017 18:16:52 +0100

Various programs that deal with namespaces will use pty devices that exist in
another namespace. One obvious candiate are containers. So far ttyname() was
incorrectly handling this case because the pts device stems from the host and
thus cannot be found amongst the current namespace's /dev/pts/<n> entries.
Serge Hallyn and I recently upstreamed patches to glibc that allow ttyname{_r}()
to correctly handle this case. At a minimum, ttyname{_r}() will set errno to
ENODEV in case it finds that the /dev/pts/<n> device that the symlink points to
exists in another namespace. This commit will allow screen to handle this case
and behave correctly in a container.

Signed-off-by: Christian Brauner <address@hidden>
---
 src/screen.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/screen.c b/src/screen.c
index e47b76e..6d06cf1 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -646,18 +646,26 @@ int main(int argc, char **argv)
 
 #define SET_TTYNAME(fatal) do \
   { \
+    int saved_errno = 0; \
+    errno = 0; \
     if (!(attach_tty = ttyname(0))) \
       { \
-       if (fatal) \
+       /* stdin is a tty but it exists in another namespace. */ \
+       if (fatal && errno == ENODEV) \
+         attach_tty = ""; \
+       else if (fatal) \
          Panic(0, "Must be connected to a terminal."); \
        else \
          attach_tty = ""; \
       } \
     else \
       { \
+       saved_errno = errno; \
        if (stat(attach_tty, &st)) \
          Panic(errno, "Cannot access '%s'", attach_tty); \
-       if (CheckTtyname(attach_tty)) \
+       /* Only call CheckTtyname() if the device does not exist in another \
+        * namespace. */ \
+       if (saved_errno != ENODEV && CheckTtyname(attach_tty)) \
          Panic(0, "Bad tty '%s'", attach_tty); \
       } \
     if (strlen(attach_tty) >= MAXPATHLEN) \
-- 
2.11.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]