2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 09:57:41 +00:00

Treat timestamp files from before we booted as old. Idea from and

Apple patch.
This commit is contained in:
Todd C. Miller 2009-12-10 16:59:27 +00:00
parent 8b48ab71e4
commit 600ce3dfa6
7 changed files with 274 additions and 23 deletions

View File

@ -104,16 +104,17 @@ SHELL = /bin/sh
PROGS = @PROGS@ PROGS = @PROGS@
SRCS = aix.c alias.c alloc.c audit.c bsm_audit.c check.c closefrom.c \ SRCS = aix.c alias.c alloc.c audit.c boottime.c bsm_audit.c check.c \
def_data.c defaults.c env.c error.c fileops.c find_path.c fnmatch.c \ closefrom.c def_data.c defaults.c env.c error.c fileops.c find_path.c \
getcwd.c getprogname.c getspwuid.c gettime.c glob.c goodpath.c gram.c \ fnmatch.c getcwd.c getprogname.c getspwuid.c gettime.c glob.c \
gram.y interfaces.c isblank.c lbuf.c ldap.c list.c logging.c match.c \ goodpath.c gram.c gram.y interfaces.c isblank.c lbuf.c ldap.c list.c \
mkstemp.c memrchr.c nanosleep.c parse.c pwutil.c pty.c script.c \ logging.c match.c mkstemp.c memrchr.c nanosleep.c parse.c pwutil.c \
set_perms.c sigaction.c snprintf.c strcasecmp.c strerror.c strlcat.c \ pty.c script.c set_perms.c sigaction.c snprintf.c strcasecmp.c \
strlcpy.c strsignal.c sudo.c sudo_noexec.c sudo_edit.c sudo_nss.c \ strerror.c strlcat.c strlcpy.c strsignal.c sudo.c sudo_noexec.c \
term.c testsudoers.c tgetpass.c toke.c toke.l tsgetgrpw.c utimes.c \ sudo_edit.c sudo_nss.c term.c testsudoers.c tgetpass.c toke.c toke.l \
vasgroups.c visudo.c zero_bytes.c redblack.c selinux.c sesh.c \ tsgetgrpw.c utimes.c vasgroups.c visudo.c zero_bytes.c redblack.c \
sudoreplay.c getdate.c getdate.y getline.c timestr.c $(AUTH_SRCS) selinux.c sesh.c sudoreplay.c getdate.c getdate.y getline.c \
timestr.c $(AUTH_SRCS)
AUTH_SRCS = auth/afs.c auth/aix_auth.c auth/bsdauth.c auth/dce.c auth/fwtk.c \ AUTH_SRCS = auth/afs.c auth/aix_auth.c auth/bsdauth.c auth/dce.c auth/fwtk.c \
auth/kerb4.c auth/kerb5.c auth/pam.c auth/passwd.c auth/rfc1938.c \ auth/kerb4.c auth/kerb5.c auth/pam.c auth/passwd.c auth/rfc1938.c \
@ -132,7 +133,7 @@ COMMON_OBJS = alias.o alloc.o defaults.o error.o getline.o gram.o \
list.o match.o pwutil.o timestr.o toke.o redblack.o \ list.o match.o pwutil.o timestr.o toke.o redblack.o \
term.o zero_bytes.o @NONUNIX_GROUPS_IMPL@ term.o zero_bytes.o @NONUNIX_GROUPS_IMPL@
SUDO_OBJS = $(AUTH_OBJS) @SUDO_OBJS@ audit.o check.o \ SUDO_OBJS = $(AUTH_OBJS) @SUDO_OBJS@ audit.o boottime.o check.o \
env.o getspwuid.o gettime.o goodpath.o fileops.o find_path.o \ env.o getspwuid.o gettime.o goodpath.o fileops.o find_path.o \
interfaces.o lbuf.o logging.o parse.o set_perms.o sudo.o \ interfaces.o lbuf.o logging.o parse.o set_perms.o sudo.o \
sudo_edit.o sudo_nss.o tgetpass.o sudo_edit.o sudo_nss.o tgetpass.o
@ -250,6 +251,8 @@ alloc.o: $(srcdir)/alloc.c $(SUDODEP)
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/alloc.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/alloc.c
audit.o: $(srcdir)/audit.c $(SUDODEP) audit.o: $(srcdir)/audit.c $(SUDODEP)
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/audit.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/audit.c
boottime.o: $(srcdir)/boottime.c config.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/boottime.c
bsm_audit.o: $(srcdir)/bsm_audit.c $(SUDODEP) bsm_audit.h bsm_audit.o: $(srcdir)/bsm_audit.c $(SUDODEP) bsm_audit.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/bsm_audit.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/bsm_audit.c
check.o: $(srcdir)/check.c $(SUDODEP) check.o: $(srcdir)/check.c $(SUDODEP)

135
boottime.c Normal file
View File

@ -0,0 +1,135 @@
/*
* Copyright (c) 2009 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <config.h>
#include <sys/param.h>
#include <sys/types.h>
#include <stdio.h>
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
# include <stdlib.h>
# endif
#endif /* STDC_HEADERS */
#ifdef HAVE_STRING_H
# include <string.h>
#else
# ifdef HAVE_STRINGS_H
# include <strings.h>
# endif
#endif /* HAVE_STRING_H */
#include <limits.h>
#ifdef HAVE_SYSCTL
# include <sys/sysctl.h>
#endif
#include "compat.h"
#include "missing.h"
#if defined(__linux__)
time_t
get_boottime()
{
time_t boottime = 0;
char *line = NULL;
size_t linesize = 0;
ssize_t len;
FILE * fp;
/* read btime from /proc/stat */
fp = fopen("/proc/stat", "r");
if (fp != NULL) {
while ((len = getline(&line, &linesize, fp)) != -1) {
if (strncmp(line, "btime ", 6) == 0) {
boottime = atoi(line + 6);
break;
}
}
fclose(fp);
free(line);
}
return(boottime);
}
#elif defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
time_t
get_boottime()
{
struct timeval tv;
time_t boottime = 0;
size_t size;
int mib[2];
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(tv);
if (sysctl(mib, 2, &tv, &size, NULL, 0) != -1)
boottime = tv.tv_sec;
return(boottime);
}
#elif defined(HAVE_GETUTXID)
#include <utmpx.h>
time_t
get_boottime()
{
time_t boottime = 0;
struct utmpx *ut, key;
zero_bytes(&key, sizeof(key));
key.ut_type = BOOT_TIME;
if ((ut = getutxid(&key)) != NULL) {
boottime = ut->ut_tv.tv_sec;
endutxent();
}
return(boottime);
}
#elif defined(HAVE_GETUTID)
#include <utmp.h>
time_t
get_boottime()
{
time_t boottime = 0;
struct utmp *ut, key;
zero_bytes(&key, sizeof(key));
key.ut_type = BOOT_TIME;
if ((ut = getutid(&key)) != NULL) {
boottime = ut->ut_time;
endutent();
}
return(boottime);
}
#else
time_t
get_boottime()
{
return(0);
}
#endif

View File

@ -410,7 +410,7 @@ timestamp_status(timestampdir, timestampfile, user, flags)
int flags; int flags;
{ {
struct stat sb; struct stat sb;
time_t now; time_t boottime, now;
char *dirparent = def_timestampdir; char *dirparent = def_timestampdir;
int status = TS_ERROR; /* assume the worst */ int status = TS_ERROR; /* assume the worst */
@ -552,6 +552,7 @@ timestamp_status(timestampdir, timestampfile, user, flags)
else { else {
/* XXX - should use timespec here */ /* XXX - should use timespec here */
now = time(NULL); now = time(NULL);
boottime = get_boottime();
if (def_timestamp_timeout && if (def_timestamp_timeout &&
now - sb.st_mtime < 60 * def_timestamp_timeout) { now - sb.st_mtime < 60 * def_timestamp_timeout) {
/* /*
@ -567,8 +568,11 @@ timestamp_status(timestampdir, timestampfile, user, flags)
else else
(void) rmdir(timestampdir); (void) rmdir(timestampdir);
status = TS_MISSING; status = TS_MISSING;
} else } else if (sb.st_mtime < boottime) {
status = TS_OLD;
} else {
status = TS_CURRENT; status = TS_CURRENT;
}
} }
} }
} }

View File

@ -184,6 +184,12 @@
/* Define to 1 if you have the `getuserattr' function. */ /* Define to 1 if you have the `getuserattr' function. */
#undef HAVE_GETUSERATTR #undef HAVE_GETUSERATTR
/* Define to 1 if you have the `getutid' function. */
#undef HAVE_GETUTID
/* Define to 1 if you have the `getutxid' function. */
#undef HAVE_GETUTXID
/* Define to 1 if you have the `glob' function. */ /* Define to 1 if you have the `glob' function. */
#undef HAVE_GLOB #undef HAVE_GLOB
@ -471,6 +477,9 @@
/* Define to 1 if you have the `sysconf' function. */ /* Define to 1 if you have the `sysconf' function. */
#undef HAVE_SYSCONF #undef HAVE_SYSCONF
/* Define to 1 if you have the `sysctl' function. */
#undef HAVE_SYSCTL
/* Define to 1 if you have the <sys/bsdtypes.h> header file. */ /* Define to 1 if you have the <sys/bsdtypes.h> header file. */
#undef HAVE_SYS_BSDTYPES_H #undef HAVE_SYS_BSDTYPES_H

115
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for sudo 1.7.3. # Generated by GNU Autoconf 2.61 for sudo 1.7.3b1.
# #
# Report bugs to <http://www.sudo.ws/bugs/>. # Report bugs to <http://www.sudo.ws/bugs/>.
# #
@ -724,8 +724,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package. # Identity of this package.
PACKAGE_NAME='sudo' PACKAGE_NAME='sudo'
PACKAGE_TARNAME='sudo' PACKAGE_TARNAME='sudo'
PACKAGE_VERSION='1.7.3' PACKAGE_VERSION='1.7.3b1'
PACKAGE_STRING='sudo 1.7.3' PACKAGE_STRING='sudo 1.7.3b1'
PACKAGE_BUGREPORT='http://www.sudo.ws/bugs/' PACKAGE_BUGREPORT='http://www.sudo.ws/bugs/'
# Factoring default headers for most tests. # Factoring default headers for most tests.
@ -1418,7 +1418,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures sudo 1.7.3 to adapt to many kinds of systems. \`configure' configures sudo 1.7.3b1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1483,7 +1483,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of sudo 1.7.3:";; short | recursive ) echo "Configuration of sudo 1.7.3b1:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1688,7 +1688,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
sudo configure 1.7.3 sudo configure 1.7.3b1
generated by GNU Autoconf 2.61 generated by GNU Autoconf 2.61
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@ -1702,7 +1702,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by sudo $as_me 1.7.3, which was It was created by sudo $as_me 1.7.3b1, which was
generated by GNU Autoconf 2.61. Invocation command line was generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@ $ $0 $@
@ -16332,6 +16332,103 @@ done
for ac_func in sysctl getutid getutxid
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $ac_func innocuous_$ac_func
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $ac_func
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char $ac_func ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined __stub_$ac_func || defined __stub___$ac_func
choke me
#endif
int
main ()
{
return $ac_func ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext &&
$as_test_x conftest$ac_exeext; then
eval "$as_ac_var=yes"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_var=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
fi
ac_res=`eval echo '${'$as_ac_var'}'`
{ echo "$as_me:$LINENO: result: $ac_res" >&5
echo "${ECHO_T}$ac_res" >&6; }
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
break
fi
done
for ac_func in openpty for ac_func in openpty
do do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
@ -26480,7 +26577,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by sudo $as_me 1.7.3, which was This file was extended by sudo $as_me 1.7.3b1, which was
generated by GNU Autoconf 2.61. Invocation command line was generated by GNU Autoconf 2.61. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -26529,7 +26626,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\ ac_cs_version="\\
sudo config.status 1.7.3 sudo config.status 1.7.3b1
configured by $0, generated by GNU Autoconf 2.61, configured by $0, generated by GNU Autoconf 2.61,
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

View File

@ -4,7 +4,7 @@ dnl $Sudo$
dnl dnl
dnl Copyright (c) 1994-1996,1998-2009 Todd C. Miller <Todd.Miller@courtesan.com> dnl Copyright (c) 1994-1996,1998-2009 Todd C. Miller <Todd.Miller@courtesan.com>
dnl dnl
AC_INIT([sudo], [1.7.3], [http://www.sudo.ws/bugs/], [sudo]) AC_INIT([sudo], [1.7.3b1], [http://www.sudo.ws/bugs/], [sudo])
AC_CONFIG_HEADER(config.h pathnames.h) AC_CONFIG_HEADER(config.h pathnames.h)
dnl dnl
dnl This won't work before AC_INIT dnl This won't work before AC_INIT
@ -1854,6 +1854,8 @@ AC_CHECK_FUNCS(getline, [], [
AC_CHECK_FUNCS(fgetln) AC_CHECK_FUNCS(fgetln)
]) ])
AC_CHECK_FUNCS(sysctl getutid getutxid, [break])
AC_CHECK_FUNCS(openpty, [AC_CHECK_HEADERS(util.h pty.h, [break])], [ AC_CHECK_FUNCS(openpty, [AC_CHECK_HEADERS(util.h pty.h, [break])], [
AC_CHECK_LIB(util, openpty, [ AC_CHECK_LIB(util, openpty, [
AC_CHECK_HEADERS(util.h pty.h, [break]) AC_CHECK_HEADERS(util.h pty.h, [break])

1
sudo.h
View File

@ -278,6 +278,7 @@ int term_noecho __P((int));
int term_raw __P((int, int, int)); int term_raw __P((int, int, int));
int term_restore __P((int, int)); int term_restore __P((int, int));
char *get_timestr __P((time_t, int)); char *get_timestr __P((time_t, int));
time_t get_boottime __P((void));
YY_DECL; YY_DECL;
/* Only provide extern declarations outside of sudo.c. */ /* Only provide extern declarations outside of sudo.c. */