verify that ttyname refers to the same file as the fd
authorSzabolcs Nagy <nsz@port70.net>
Sat, 20 Aug 2016 19:04:31 +0000 (21:04 +0200)
committerRich Felker <dalias@aerifal.cx>
Tue, 30 Aug 2016 19:59:50 +0000 (15:59 -0400)
linux containers use separate mount namespace so the /proc
symlink might not point to the right device if the fd was
opened in the parent namespace, in this case return ENOENT.

src/unistd/ttyname_r.c

index 8bac7b2f3ab10cb0929341ca1425af65c8d409bf..a38ba4f2b3ed628778d00f2b24c0faac4f88a5c2 100644 (file)
@@ -1,10 +1,12 @@
 #include <unistd.h>
 #include <errno.h>
+#include <sys/stat.h>
 
 void __procfdname(char *, unsigned);
 
 int ttyname_r(int fd, char *name, size_t size)
 {
+       struct stat st1, st2;
        char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2];
        ssize_t l;
 
@@ -15,8 +17,13 @@ int ttyname_r(int fd, char *name, size_t size)
 
        if (l < 0) return errno;
        else if (l == size) return ERANGE;
-       else {
-               name[l] = 0;
-               return 0;
-       }
+
+       name[l] = 0;
+
+       if (stat(name, &st1) || fstat(fd, &st2))
+               return errno;
+       if (st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino)
+               return ENOENT;
+
+       return 0;
 }