mirror of
https://github.com/sudo-project/sudo.git
synced 2025-08-22 09:57:41 +00:00
sudo_ttyname_dev: On Linux try to use /proc/self/fd/{0,1,2} if possible.
If one of std{in,out,err} matches the specified device, try to resolve it to a path by using /proc/self/fd/{0,1,2}. This avoids searching all of /dev and works in a chroot where /proc is mounted but /dev/pts is not. GitHub issue #421.
This commit is contained in:
parent
7e8f006888
commit
b7efb8ab5b
@ -253,11 +253,39 @@ char *
|
|||||||
sudo_ttyname_dev_v1(dev_t rdev, char *buf, size_t buflen)
|
sudo_ttyname_dev_v1(dev_t rdev, char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
const char *devsearch, *devsearch_end;
|
const char *devsearch, *devsearch_end;
|
||||||
char path[PATH_MAX], *ret;
|
char path[PATH_MAX], *ret = NULL;
|
||||||
const char *cp, *ep;
|
const char *cp, *ep;
|
||||||
size_t len;
|
size_t len;
|
||||||
debug_decl(sudo_ttyname_dev, SUDO_DEBUG_UTIL);
|
debug_decl(sudo_ttyname_dev, SUDO_DEBUG_UTIL);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
/*
|
||||||
|
* First check std{in,out,err} and use /proc/self/fd/{0,1,2} if possible.
|
||||||
|
*/
|
||||||
|
for (int fd = STDIN_FILENO; fd <= STDERR_FILENO; fd++) {
|
||||||
|
char fdpath[] = "/proc/self/fd/N";
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
if (fstat(fd, &sb) == -1 || !S_ISCHR(sb.st_mode))
|
||||||
|
continue;
|
||||||
|
if (rdev != sb.st_rdev)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fdpath[sizeof("/proc/self/fd/N") - 2] = '0' + fd;
|
||||||
|
len = readlink(fdpath, buf, buflen);
|
||||||
|
if (len != (size_t)-1) {
|
||||||
|
if (len == buflen) {
|
||||||
|
errno = ERANGE; /* buf too small */
|
||||||
|
} else {
|
||||||
|
/* readlink(2) does not NUL-terminate. */
|
||||||
|
buf[len] = '\0';
|
||||||
|
ret = buf;
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First, check /dev/console.
|
* First, check /dev/console.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user