From 26d9043bf4dd4bd7447b4caeeb5918e6827ace0a Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Sat, 3 Jun 2017 08:45:29 -0600 Subject: [PATCH] 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. --- src/ttyname.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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; -- 2.40.0