From: Todd C. Miller Date: Tue, 21 Jul 2015 21:20:49 +0000 (-0600) Subject: Fix errno value from get_process_ttyname() when no tty is present. X-Git-Tag: SUDO_1_8_14p3^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=83d8cbf811ba8f113dd1c19f01fd84993c016b28;p=sudo Fix errno value from get_process_ttyname() when no tty is present. --- diff --git a/src/ttyname.c b/src/ttyname.c index dffb6720d..780d66f8b 100644 --- a/src/ttyname.c +++ b/src/ttyname.c @@ -382,8 +382,8 @@ get_process_ttyname(char *name, size_t namelen) { struct sudo_kinfo_proc *ki_proc = NULL; size_t size = sizeof(*ki_proc); + int mib[6], rc, serrno = errno; char *rval = NULL; - int mib[6], rc; debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) /* @@ -407,8 +407,10 @@ get_process_ttyname(char *name, size_t namelen) ki_proc = kp; rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0); } while (rc == -1 && errno == ENOMEM); + errno = ENOENT; if (rc != -1) { if ((dev_t)ki_proc->sudo_kp_tdev != (dev_t)-1) { + errno = serrno; rval = sudo_ttyname_dev(ki_proc->sudo_kp_tdev, name, namelen); if (rval == NULL) { sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, @@ -435,7 +437,7 @@ get_process_ttyname(char *name, size_t namelen) char path[PATH_MAX], *rval = NULL; struct psinfo psinfo; ssize_t nread; - int fd; + int fd, serrno = errno; debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) /* Try to determine the tty from pr_ttydev in /proc/pid/psinfo. */ @@ -449,11 +451,16 @@ get_process_ttyname(char *name, size_t namelen) if ((psinfo.pr_ttydev & DEVNO64) && sizeof(dev_t) == 4) rdev = makedev(major64(psinfo.pr_ttydev), minor64(psinfo.pr_ttydev)); #endif - if (rdev != (dev_t)-1) + if (rdev != (dev_t)-1) { + errno = serrno; rval = sudo_ttyname_dev(rdev, name, namelen); + got done; + } } } + errno = ENOENT; +done: if (rval == NULL) sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, "unable to resolve tty via %s", path); @@ -471,6 +478,7 @@ get_process_ttyname(char *name, size_t namelen) char path[PATH_MAX], *line = NULL; char *rval = NULL; size_t linesize = 0; + int serrno = errno; ssize_t len; FILE *fp; debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) @@ -495,8 +503,11 @@ get_process_ttyname(char *name, size_t namelen) sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, "%s: tty device %s: %s", path, cp, errstr); } - if (tdev > 0) + if (tdev > 0) { + errno = serrno; rval = sudo_ttyname_dev(tdev, name, namelen); + goto done; + } break; } cp = ep + 1; @@ -505,7 +516,9 @@ get_process_ttyname(char *name, size_t namelen) } free(line); } + errno = ENOENT; +done: if (rval == NULL) sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, "unable to resolve tty via %s", path); @@ -522,7 +535,7 @@ get_process_ttyname(char *name, size_t namelen) { struct pst_status pstat; char *rval = NULL; - int rc; + int rc, serrno = errno; debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) /* @@ -532,10 +545,15 @@ get_process_ttyname(char *name, size_t namelen) rc = pstat_getproc(&pstat, sizeof(pstat), (size_t)0, (int)getpid()); if (rc != -1 || errno == EOVERFLOW) { if (pstat.pst_term.psd_major != -1 && pstat.pst_term.psd_minor != -1) { + errno = serrno; rval = sudo_ttyname_dev(makedev(pstat.pst_term.psd_major, pstat.pst_term.psd_minor), name, namelen); + goto done; } } + errno = ENOENT; + +done: if (rval == NULL) sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, "unable to resolve tty via pstat");