From: Todd C. Miller Date: Tue, 8 Jun 2010 22:38:23 +0000 (-0400) Subject: Replace timerfoo macros with timevalfoo since the timer macros are known X-Git-Tag: SUDO_1_8_0~515 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79f178923ec99693c94d349532e26f4e93effc75;p=sudo Replace timerfoo macros with timevalfoo since the timer macros are known to be busted on some systems. --- diff --git a/compat/nanosleep.c b/compat/nanosleep.c index 9c33d11d6..16114395b 100644 --- a/compat/nanosleep.c +++ b/compat/nanosleep.c @@ -41,14 +41,14 @@ nanosleep(const struct timespec *ts, struct timespec *rts) timeout.tv_usec = ts->tv_nsec / 1000; if (rts != NULL) { gettimeofday(&endtime, NULL); - timeradd(&endtime, &timeout, &endtime); + timevaladd(&endtime, &timeout); } rval = select(0, NULL, NULL, NULL, &timeout); if (rts != NULL && rval == -1 && errno == EINTR) { gettimeofday(&now, NULL); - timersub(&endtime, &now, &timeout); - rts->tv_sec = timeout.tv_sec; - rts->tv_nsec = timeout.tv_usec * 1000; + timevalsub(&endtime, &now); + rts->tv_sec = endtime.tv_sec; + rts->tv_nsec = endtime.tv_usec * 1000; } return(rval); } diff --git a/config.h.in b/config.h.in index c4c639f8d..d03d9fde8 100644 --- a/config.h.in +++ b/config.h.in @@ -541,10 +541,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_TERMIO_H -/* Define to 1 if you have a timersub macro or function that takes two - arguments (not three) */ -#undef HAVE_TIMERSUB2 - /* Define to 1 if you have struct timespec in sys/time.h */ #undef HAVE_TIMESPEC diff --git a/configure b/configure index 1f7a600b7..65f69c29c 100755 --- a/configure +++ b/configure @@ -15393,35 +15393,6 @@ fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for two-parameter timersub" >&5 -$as_echo_n "checking for two-parameter timersub... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ -struct timeval ts1, ts2; -ts1.tv_sec = 1; ts1.tv_usec = 0; ts2.tv_sec = 0; ts2.tv_usec = 0; -#ifndef timersub -#error missing timersub -#endif -timersub(&ts1, &ts2); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - $as_echo "#define HAVE_TIMERSUB2 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20407,6 +20378,5 @@ fi - diff --git a/configure.in b/configure.in index 6cc787dc6..057387dfe 100644 --- a/configure.in +++ b/configure.in @@ -1980,15 +1980,6 @@ if test X"$ac_cv_type_struct_timespec" != X"no"; then AC_CHECK_MEMBER([struct stat.st_mtim], [AC_DEFINE(HAVE_ST_MTIM)] [AC_CHECK_MEMBER([struct stat.st_mtim.st__tim], AC_DEFINE(HAVE_ST__TIM))], [AC_CHECK_MEMBER([struct stat.st_mtimespec], AC_DEFINE([HAVE_ST_MTIMESPEC]))]) - AC_MSG_CHECKING([for two-parameter timersub]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include -#include ]], [[struct timeval ts1, ts2; -ts1.tv_sec = 1; ts1.tv_usec = 0; ts2.tv_sec = 0; ts2.tv_usec = 0; -#ifndef timersub -#error missing timersub -#endif -timersub(&ts1, &ts2);]])], [AC_DEFINE(HAVE_TIMERSUB2) - AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)]) fi dnl dnl Check for the dirfd function/macro. If not found, look for dd_fd in DIR. @@ -2831,7 +2822,6 @@ AH_TEMPLATE(HAVE_ST_MTIM, [Define to 1 if your struct stat has an st_mtim member AH_TEMPLATE(HAVE_ST_MTIMESPEC, [Define to 1 if your struct stat has an st_mtimespec member]) AH_TEMPLATE(HAVE_TERMIOS_H, [Define to 1 if you have the header file and the `tcgetattr' function.]) AH_TEMPLATE(HAVE_TIMESPEC, [Define to 1 if you have struct timespec in sys/time.h]) -AH_TEMPLATE(HAVE_TIMERSUB2, [Define to 1 if you have a timersub macro or function that takes two arguments (not three)]) AH_TEMPLATE(HAVE___PROGNAME, [Define to 1 if your crt0.o defines the __progname symbol for you.]) AH_TEMPLATE(HOST_IN_LOG, [Define to 1 if you want the hostname to be entered into the log file.]) AH_TEMPLATE(IGNORE_DOT_PATH, [Define to 1 if you want to ignore '.' and empty PATH elements]) diff --git a/include/compat.h b/include/compat.h index 520b41474..04f618b9f 100644 --- a/include/compat.h +++ b/include/compat.h @@ -252,40 +252,40 @@ void setprogname(const char *); #endif /* HAVE___PROGNAME */ #endif /* !HAVE_GETPROGNAME */ -#ifndef timerclear -# define timerclear(ts) (ts)->tv_sec = (ts)->tv_nsec = 0 +#ifndef timevalclear +# define timevalclear(tv) ((tv)->tv_sec = (tv)->tv_usec = 0) #endif -#ifndef timerisset -# define timerisset(ts) ((ts)->tv_sec || (ts)->tv_nsec) +#ifndef timevalisset +# define timevalisset(tv) ((tv)->tv_sec || (tv)->tv_usec) #endif -#ifndef timeradd -# define timeradd(tv1, tv2, total) \ +#ifndef timevalcmp +# define timevalcmp(tv1, tv2, op) \ + (((tv1)->tv_sec == (tv2)->tv_sec) ? \ + ((tv1)->tv_usec op (tv2)->tv_usec) : \ + ((tv1)->tv_sec op (tv2)->tv_sec)) +#endif +#ifndef timevaladd +# define timevaladd(tv1, tv2) \ do { \ - (total)->tv_sec = (tv1)->tv_sec + (tv2)->tv_sec; \ - (total)->tv_usec = (tv1)->tv_usec + (tv2)->tv_usec; \ - if ((total)->tv_usec >= 1000000) { \ - (total)->tv_sec++; \ - (total)->tv_usec -= 1000000; \ + (tv1)->tv_sec += (tv2)->tv_sec; \ + (tv1)->tv_usec += (tv2)->tv_usec; \ + if ((tv1)->tv_usec >= 1000000) { \ + (tv1)->tv_sec++; \ + (tv1)->tv_usec -= 1000000; \ } \ } while (0) #endif -#ifndef timersub -# define timersub(minuend, subrahend, difference) \ +#ifndef timevalsub +# define timevalsub(tv1, tv2) \ do { \ - (difference)->tv_sec = (minuend)->tv_sec - (subrahend)->tv_sec; \ - (difference)->tv_usec = (minuend)->tv_usec - (subrahend)->tv_usec; \ - if ((difference)->tv_usec < 0) { \ - (difference)->tv_sec--; \ - (difference)->tv_usec += 1000000; \ + (tv1)->tv_sec -= (tv2)->tv_sec; \ + (tv1)->tv_usec -= (tv2)->tv_usec; \ + if ((tv1)->tv_usec < 0) { \ + (tv1)->tv_sec--; \ + (tv1)->tv_usec += 1000000; \ } \ } while (0) #endif -#ifndef timercmp -#define timercmp(tv1, tv2, cmp) \ - (((tv1)->tv_sec == (tv2)->tv_sec) ? \ - ((tv1)->tv_usec cmp (tv2)->tv_usec) : \ - ((tv1)->tv_sec cmp (tv2)->tv_sec)) -#endif #ifndef WCOREDUMP # define WCOREDUMP(x) ((x) & 0x80) diff --git a/plugins/sudoers/check.c b/plugins/sudoers/check.c index 45e8cd9d4..77d9355eb 100644 --- a/plugins/sudoers/check.c +++ b/plugins/sudoers/check.c @@ -612,7 +612,7 @@ timestamp_status(char *timestampdir, char *timestampfile, char *user, int flags) else (void) rmdir(timestampdir); status = TS_MISSING; - } else if (get_boottime(&boottime) && timercmp(&mtime, &boottime, <)) { + } else if (get_boottime(&boottime) && timevalcmp(&mtime, &boottime, <)) { status = TS_OLD; } else { status = TS_CURRENT; @@ -655,7 +655,7 @@ remove_timestamp(int remove) remove = FALSE; } } else { - timerclear(&tv); + timevalclear(&tv); if (touch(-1, path, &tv) == -1) error(1, "can't reset %s to Epoch", path); } diff --git a/plugins/sudoers/iolog.c b/plugins/sudoers/iolog.c index 90199f8db..86bb78131 100644 --- a/plugins/sudoers/iolog.c +++ b/plugins/sudoers/iolog.c @@ -335,7 +335,7 @@ sudoers_io_version(int verbose) static int sudoers_io_log(const char *buf, unsigned int len, int idx) { - struct timeval now, tv; + struct timeval now, delay; gettimeofday(&now, NULL); @@ -345,15 +345,17 @@ sudoers_io_log(const char *buf, unsigned int len, int idx) else #endif fwrite(buf, 1, len, io_fds[idx].f); - timersub(&now, &last_time, &tv); + delay.tv_sec = now.tv_sec; + delay.tv_usec = now.tv_usec; + timevalsub(&delay, &last_time); #ifdef HAVE_ZLIB if (def_compress_io) gzprintf(io_fds[IOFD_TIMING].g, "%d %f %d\n", idx, - tv.tv_sec + ((double)tv.tv_usec / 1000000), len); + delay.tv_sec + ((double)delay.tv_usec / 1000000), len); else #endif fprintf(io_fds[IOFD_TIMING].f, "%d %f %d\n", idx, - tv.tv_sec + ((double)tv.tv_usec / 1000000), len); + delay.tv_sec + ((double)delay.tv_usec / 1000000), len); last_time.tv_sec = now.tv_sec; last_time.tv_usec = now.tv_usec; diff --git a/plugins/sudoers/visudo.c b/plugins/sudoers/visudo.c index 62d91981f..bf9c94f2d 100644 --- a/plugins/sudoers/visudo.c +++ b/plugins/sudoers/visudo.c @@ -365,19 +365,13 @@ edit_sudoers(struct sudoersfile *sp, char *editor, char *args, int lineno) /* Set modified bit if use changed the file. */ modified = TRUE; mtim_get(&sb, &tv); - if (orig_size == sb.st_size && - orig_mtim.tv_sec == tv.tv_sec && - orig_mtim.tv_usec == tv.tv_usec) { + if (orig_size == sb.st_size && timevalcmp(&orig_mtim, &tv, ==)) { /* * If mtime and size match but the user spent no measurable * time in the editor we can't tell if the file was changed. */ -#ifdef HAVE_TIMERSUB2 - timersub(&tv1, &tv2); -#else - timersub(&tv1, &tv2, &tv2); -#endif - if (timerisset(&tv2)) + timevalsub(&tv1, &tv2); + if (timevalisset(&tv2)) modified = FALSE; } diff --git a/src/sudo_edit.c b/src/sudo_edit.c index 602d86651..a7062722b 100644 --- a/src/sudo_edit.c +++ b/src/sudo_edit.c @@ -277,17 +277,13 @@ sudo_edit(struct command_details *command_details, char *argv[], char *envp[]) continue; } mtim_get(&sb, &tv); - if (tf[i].osize == sb.st_size && timercmp(&tf[i].omtim, &tv, ==)) { + if (tf[i].osize == sb.st_size && timevalcmp(&tf[i].omtim, &tv, ==)) { /* * If mtime and size match but the user spent no measurable * time in the editor we can't tell if the file was changed. */ -#ifdef HAVE_TIMERSUB2 - timersub(&tv1, &tv2); -#else - timersub(&tv1, &tv2, &tv2); -#endif - if (timerisset(&tv2)) { + timevalsub(&tv1, &tv2); + if (timevalisset(&tv2)) { warningx("%s unchanged", tf[i].ofile); unlink(tf[i].tfile); close(tfd);