From: Todd C. Miller Date: Sat, 3 Jun 2017 14:45:29 +0000 (-0600) Subject: Avoid sign extension when assigning the value of tty_nr in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=26d9043bf4dd4bd7447b4caeeb5918e6827ace0a;p=sudo Avoid sign extension when assigning the value of tty_nr in /proc/self/stat on Linux. It is an unsigned int value that is printed as a signed int but dev_t is unsigned long long. We need to cast to unsigned int before assigning to a dev_t. --- diff --git a/src/ttyname.c b/src/ttyname.c index 8c6fdc88d..f3a427c17 100644 --- a/src/ttyname.c +++ b/src/ttyname.c @@ -496,12 +496,19 @@ get_process_ttyname(char *name, size_t namelen) if (*ep == ' ') { *ep = '\0'; if (++field == 7) { - dev_t tdev = strtonum(cp, INT_MIN, INT_MAX, &errstr); + int tty_nr = strtonum(cp, INT_MIN, INT_MAX, &errstr); if (errstr) { sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, "%s: tty device %s: %s", path, cp, errstr); } - if (tdev > 0) { + if (tty_nr != 0) { + /* + * Avoid sign extension when assigning tdev. + * tty_nr in /proc/self/stat is printed as a + * signed int but the actual device number is an + * unsigned int and dev_t is unsigned long long. + */ + dev_t tdev = (unsigned int)tty_nr; errno = serrno; ret = sudo_ttyname_dev(tdev, name, namelen); goto done;