mirror of
https://github.com/sudo-project/sudo.git
synced 2025-08-30 05:48:18 +00:00
Fix formatting of ttydev on systems with signed 32-bit dev_t
If dev_t is 32-bit and signed, formatting as an unsigned long long may result in a bogus value due to sign extension.
This commit is contained in:
parent
f3aa3f1f28
commit
46274e725e
@ -1293,6 +1293,9 @@
|
|||||||
/* Define to 1 if you want sudo to set $HOME in shell mode. */
|
/* Define to 1 if you want sudo to set $HOME in shell mode. */
|
||||||
#undef SHELL_SETS_HOME
|
#undef SHELL_SETS_HOME
|
||||||
|
|
||||||
|
/* The size of 'dev_t', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_DEV_T
|
||||||
|
|
||||||
/* The size of 'id_t', as computed by sizeof. */
|
/* The size of 'id_t', as computed by sizeof. */
|
||||||
#undef SIZEOF_ID_T
|
#undef SIZEOF_ID_T
|
||||||
|
|
||||||
|
35
configure
vendored
35
configure
vendored
@ -21003,6 +21003,41 @@ printf "%s\n" "$ac_cv_sizeof_long_long" >&6; }
|
|||||||
printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h
|
printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h
|
||||||
|
|
||||||
|
|
||||||
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
|
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
|
# This bug is HP SR number 8606223364.
|
||||||
|
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of dev_t" >&5
|
||||||
|
printf %s "checking size of dev_t... " >&6; }
|
||||||
|
if test ${ac_cv_sizeof_dev_t+y}
|
||||||
|
then :
|
||||||
|
printf %s "(cached) " >&6
|
||||||
|
else case e in #(
|
||||||
|
e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (dev_t))" "ac_cv_sizeof_dev_t" "$ac_includes_default"
|
||||||
|
then :
|
||||||
|
|
||||||
|
else case e in #(
|
||||||
|
e) if test "$ac_cv_type_dev_t" = yes; then
|
||||||
|
{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
|
||||||
|
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
|
||||||
|
as_fn_error 77 "cannot compute sizeof (dev_t)
|
||||||
|
See 'config.log' for more details" "$LINENO" 5; }
|
||||||
|
else
|
||||||
|
ac_cv_sizeof_dev_t=0
|
||||||
|
fi ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_dev_t" >&5
|
||||||
|
printf "%s\n" "$ac_cv_sizeof_dev_t" >&6; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printf "%s\n" "#define SIZEOF_DEV_T $ac_cv_sizeof_dev_t" >>confdefs.h
|
||||||
|
|
||||||
|
|
||||||
# The cast to long int works around a bug in the HP C Compiler
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
|
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
|
@ -2507,6 +2507,7 @@ SUDO_SOCK_SA_LEN
|
|||||||
SUDO_SOCK_SIN_LEN
|
SUDO_SOCK_SIN_LEN
|
||||||
AC_CHECK_SIZEOF([long])
|
AC_CHECK_SIZEOF([long])
|
||||||
AC_CHECK_SIZEOF([long long])
|
AC_CHECK_SIZEOF([long long])
|
||||||
|
AC_CHECK_SIZEOF([dev_t])
|
||||||
AC_CHECK_SIZEOF([id_t])
|
AC_CHECK_SIZEOF([id_t])
|
||||||
AC_CHECK_SIZEOF([time_t])
|
AC_CHECK_SIZEOF([time_t])
|
||||||
AC_CHECK_SIZEOF([uid_t])
|
AC_CHECK_SIZEOF([uid_t])
|
||||||
|
@ -67,10 +67,10 @@ int
|
|||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char *tty_libc = NULL, *tty_sudo = NULL;
|
char *tty_libc = NULL, *tty_sudo = NULL;
|
||||||
int ch, errors = 0, ntests = 1;
|
|
||||||
char pathbuf[PATH_MAX];
|
char pathbuf[PATH_MAX];
|
||||||
bool verbose = false;
|
bool verbose = false;
|
||||||
dev_t ttydev;
|
dev_t ttydev = -1;
|
||||||
|
int ch, errors = 0, ntests = 1;
|
||||||
|
|
||||||
initprogname(argc > 0 ? argv[0] : "check_ttyname");
|
initprogname(argc > 0 ? argv[0] : "check_ttyname");
|
||||||
|
|
||||||
@ -87,9 +87,35 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
/* Lookup tty name using kernel info if possible. */
|
/* Lookup tty name using kernel info if possible. */
|
||||||
ttydev = get_process_ttyname(pathbuf, sizeof(pathbuf));
|
ttydev = get_process_ttyname(pathbuf, sizeof(pathbuf));
|
||||||
if (ttydev != (dev_t)-1)
|
if (ttydev != (dev_t)-1) {
|
||||||
|
char numbuf[STRLEN_MAX_UNSIGNED(unsigned long long) + 1];
|
||||||
|
unsigned long long ullval;
|
||||||
|
const char *errstr;
|
||||||
|
dev_t newdev;
|
||||||
|
|
||||||
|
/* For comparison below. */
|
||||||
tty_sudo = pathbuf;
|
tty_sudo = pathbuf;
|
||||||
|
|
||||||
|
/* Check that we can format a dev_t as a string and parse it. */
|
||||||
|
ntests++;
|
||||||
|
#if SIZEOF_DEV_T == SIZEOF_LONG
|
||||||
|
ullval = (unsigned long)ttydev;
|
||||||
|
#else
|
||||||
|
ullval = (unsigned long long)ttydev;
|
||||||
|
#endif
|
||||||
|
(void)snprintf(numbuf, sizeof(numbuf), "%llu", ullval);
|
||||||
|
newdev = sudo_strtonum(numbuf, LLONG_MIN, LLONG_MAX, &errstr);
|
||||||
|
if (errstr != NULL) {
|
||||||
|
printf("%s: FAIL unable to parse device number %s: %s",
|
||||||
|
getprogname(), numbuf, errstr);
|
||||||
|
errors++;
|
||||||
|
} else if (ttydev != newdev) {
|
||||||
|
printf("%s: FAIL device mismatch for %s, %s != %llu",
|
||||||
|
getprogname(), pathbuf, numbuf, ullval);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(HAVE_KINFO_PROC2_NETBSD) || \
|
#if defined(HAVE_KINFO_PROC2_NETBSD) || \
|
||||||
defined(HAVE_KINFO_PROC_OPENBSD) || \
|
defined(HAVE_KINFO_PROC_OPENBSD) || \
|
||||||
defined(HAVE_KINFO_PROC_FREEBSD) || \
|
defined(HAVE_KINFO_PROC_FREEBSD) || \
|
||||||
|
@ -620,7 +620,12 @@ get_user_info(struct user_details *ud)
|
|||||||
|
|
||||||
ttydev = get_process_ttyname(path, sizeof(path));
|
ttydev = get_process_ttyname(path, sizeof(path));
|
||||||
if (ttydev != (dev_t)-1) {
|
if (ttydev != (dev_t)-1) {
|
||||||
if (asprintf(&info[++i], "ttydev=%llu", (unsigned long long)ttydev) == -1)
|
#if SIZEOF_DEV_T == SIZEOF_LONG
|
||||||
|
n = asprintf(&info[++i], "ttydev=%lu", (unsigned long)ttydev);
|
||||||
|
#else
|
||||||
|
n = asprintf(&info[++i], "ttydev=%llu", (unsigned long long)ttydev);
|
||||||
|
#endif
|
||||||
|
if (n == -1)
|
||||||
goto oom;
|
goto oom;
|
||||||
info[++i] = sudo_new_key_val("tty", path);
|
info[++i] = sudo_new_key_val("tty", path);
|
||||||
if (info[i] == NULL)
|
if (info[i] == NULL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user