summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2016-06-27 06:10:04 +0000
committerespie <espie@openbsd.org>2016-06-27 06:10:04 +0000
commitbe02291ee05e867c05ef70cdf2c227b759dc8364 (patch)
tree18c12bd9efdd3157ce641af27a61aaedb6f4ba2c
parentdovutimens: call vrele(9) before returning EINVAL (diff)
downloadwireguard-openbsd-be02291ee05e867c05ef70cdf2c227b759dc8364.tar.xz
wireguard-openbsd-be02291ee05e867c05ef70cdf2c227b759dc8364.zip
make the fallback code more accurate (in particular, it should return names
based on the actual device, not any kind of inode equality which won't hold for duplicates of the dev tree in a chroot) no bump as it doesn't change any API. okay and improvements guenther@
-rw-r--r--lib/libc/gen/ttyname.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/libc/gen/ttyname.c b/lib/libc/gen/ttyname.c
index 9e8580c52a8..456fe798087 100644
--- a/lib/libc/gen/ttyname.c
+++ b/lib/libc/gen/ttyname.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ttyname.c,v 1.16 2015/10/12 19:53:58 naddy Exp $ */
+/* $OpenBSD: ttyname.c,v 1.17 2016/06/27 06:10:04 espie Exp $ */
/*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
@@ -120,7 +120,7 @@ oldttyname(struct stat *sb, char *buf, size_t len)
return (errno);
while ((dirp = readdir(dp))) {
- if (dirp->d_fileno != sb->st_ino)
+ if (dirp->d_type != DT_CHR && dirp->d_type != DT_UNKNOWN)
continue;
if (dirp->d_namlen > len - sizeof(_PATH_DEV)) {
(void)closedir(dp);
@@ -128,8 +128,8 @@ oldttyname(struct stat *sb, char *buf, size_t len)
}
memcpy(buf + sizeof(_PATH_DEV) - 1, dirp->d_name,
dirp->d_namlen + 1);
- if (stat(buf, &dsb) || sb->st_dev != dsb.st_dev ||
- sb->st_ino != dsb.st_ino)
+ if (lstat(buf, &dsb) || !S_ISCHR(dsb.st_mode) ||
+ sb->st_rdev != dsb.st_rdev)
continue;
(void)closedir(dp);
return (0);