]> granicus.if.org Git - sudo/commitdiff
Completely ignore time stamp file if it is set to the epoch,
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 21 Feb 2013 15:05:25 +0000 (10:05 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 21 Feb 2013 15:05:25 +0000 (10:05 -0500)
regardless of what gettimeofday() returns.

--HG--
branch : 1.7

check.c

diff --git a/check.c b/check.c
index daf9d41a40a9844233ddc52e93afd0325c5ab118..a34336383da9047f827c13e19272d1a89026d9a0 100644 (file)
--- a/check.c
+++ b/check.c
@@ -628,31 +628,34 @@ timestamp_status(timestampdir, timestampfile, user, flags)
      */
     if (status == TS_OLD && !ISSET(flags, TS_REMOVE)) {
        mtim_get(&sb, &mtime);
-       /* Negative timeouts only expire manually (sudo -k). */
-       if (def_timestamp_timeout < 0 && mtime.tv_sec != 0)
-           status = TS_CURRENT;
-       else {
-           now = time(NULL);
-           if (def_timestamp_timeout &&
-               now - mtime.tv_sec < 60 * def_timestamp_timeout) {
-               /*
-                * Check for bogus time on the stampfile.  The clock may
-                * have been set back or someone could be trying to spoof us.
-                */
-               if (mtime.tv_sec > now + 60 * def_timestamp_timeout * 2) {
-                   time_t tv_sec = (time_t)mtime.tv_sec;
-                   log_error(0,
-                       "timestamp too far in the future: %20.20s",
-                       4 + ctime(&tv_sec));
-                   if (timestampfile)
-                       (void) unlink(timestampfile);
-                   else
-                       (void) rmdir(timestampdir);
-                   status = TS_MISSING;
-               } else if (get_boottime(&boottime) && timevalcmp(&mtime, &boottime, <)) {
-                   status = TS_OLD;
-               } else {
-                   status = TS_CURRENT;
+       if (timevalisset(&mtime)) {
+           /* Negative timeouts only expire manually (sudo -k). */
+           if (def_timestamp_timeout < 0) {
+               status = TS_CURRENT;
+           } else {
+               now = time(NULL);
+               if (def_timestamp_timeout &&
+                   now - mtime.tv_sec < 60 * def_timestamp_timeout) {
+                   /*
+                    * Check for bogus time on the stampfile.  The clock may
+                    * have been set back or user could be trying to spoof us.
+                    */
+                   if (mtime.tv_sec > now + 60 * def_timestamp_timeout * 2) {
+                       time_t tv_sec = (time_t)mtime.tv_sec;
+                       log_error(0,
+                           "timestamp too far in the future: %20.20s",
+                           4 + ctime(&tv_sec));
+                       if (timestampfile)
+                           (void) unlink(timestampfile);
+                       else
+                           (void) rmdir(timestampdir);
+                       status = TS_MISSING;
+                   } else if (get_boottime(&boottime) &&
+                       timevalcmp(&mtime, &boottime, <)) {
+                       status = TS_OLD;
+                   } else {
+                       status = TS_CURRENT;
+                   }
                }
            }
        }