krb5 commit: Fix more time manipulations for y2038

Greg Hudson <[email protected]>
Newsgroups gmane.comp.encryption.kerberos.cvs
Message-ID <[email protected]>
https://github.com/krb5/krb5/commit/a60db180211a383bd382afe729e9309acb8dcf53
commit a60db180211a383bd382afe729e9309acb8dcf53
Author: Greg Hudson <[email protected]>
Date:   Wed May 17 14:52:09 2017 -0400

    Fix more time manipulations for y2038
    
    Use timestamp helper functions to ensure that more operations are safe
    after y2038, and display the current timestamp as unsigned in
    krb5int_trace().
    
    ticket: 8352

 src/kadmin/server/misc.c   |    2 +-
 src/kdc/dispatch.c         |    2 +-
 src/lib/krb5/os/c_ustime.c |    8 ++++----
 src/lib/krb5/os/trace.c    |    2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/kadmin/server/misc.c b/src/kadmin/server/misc.c
index 27a6376..a75b65a 100644
--- a/src/kadmin/server/misc.c
+++ b/src/kadmin/server/misc.c
@@ -184,7 +184,7 @@ check_min_life(void *server_handle, krb5_principal principal,
             (void) kadm5_free_principal_ent(handle->lhandle, &princ);
             return (ret == KADM5_UNK_POLICY) ? 0 : ret;
         }
-        if((now - princ.last_pwd_change) < pol.pw_min_life &&
+        if(ts_delta(now, princ.last_pwd_change) < pol.pw_min_life &&
            !(princ.attributes & KRB5_KDB_REQUIRES_PWCHANGE)) {
             if (msg_ret != NULL) {
                 time_t until;
diff --git a/src/kdc/dispatch.c b/src/kdc/dispatch.c
index 3a169eb..16a35d2 100644
--- a/src/kdc/dispatch.c
+++ b/src/kdc/dispatch.c
@@ -104,7 +104,7 @@ reseed_random(krb5_context kdc_err_context)
         if (last_os_random == 0)
             last_os_random = now;
         /* Grab random data from OS every hour*/
-        if (now-last_os_random >= 60 * 60) {
+        if (ts_delta(now, last_os_random) >= 60 * 60) {
             krb5_c_random_os_entropy(kdc_err_context, 0, NULL);
             last_os_random = now;
         }
diff --git a/src/lib/krb5/os/c_ustime.c b/src/lib/krb5/os/c_ustime.c
index 871d721..68fb381 100644
--- a/src/lib/krb5/os/c_ustime.c
+++ b/src/lib/krb5/os/c_ustime.c
@@ -102,17 +102,17 @@ krb5_crypto_us_timeofday(krb5_int32 *seconds, krb5_int32 *microseconds)
        putting now.sec in the past.  But don't just use '<' because we
        need to properly handle the case where the administrator intentionally
        adjusted time backwards. */
-    if ((now.sec == last_time.sec-1) ||
-        ((now.sec == last_time.sec) && (now.usec <= last_time.usec))) {
+    if (now.sec == ts_incr(last_time.sec, -1) ||
+        (now.sec == last_time.sec && !ts_after(last_time.usec, now.usec))) {
         /* Correct 'now' to be exactly one microsecond later than 'last_time'.
            Note that _because_ we perform this hack, 'now' may be _earlier_
            than 'last_time', even though the system time is monotonically
            increasing. */
 
         now.sec = last_time.sec;
-        now.usec = ++last_time.usec;
+        now.usec = ts_incr(last_time.usec, 1);
         if (now.usec >= 1000000) {
-            ++now.sec;
+            now.sec = ts_incr(now.sec, 1);
             now.usec = 0;
         }
     }
diff --git a/src/lib/krb5/os/trace.c b/src/lib/krb5/os/trace.c
index 1f9be80..bbd1f86 100644
--- a/src/lib/krb5/os/trace.c
+++ b/src/lib/krb5/os/trace.c
@@ -350,7 +350,7 @@ krb5int_trace(krb5_context context, const char *fmt, ...)
         goto cleanup;
     if (krb5_crypto_us_timeofday(&sec, &usec) != 0)
         goto cleanup;
-    if (asprintf(&msg, "[%d] %d.%d: %s\n", (int) getpid(), (int) sec,
+    if (asprintf(&msg, "[%d] %u.%d: %s\n", (int) getpid(), (unsigned int) sec,
                  (int) usec, str) < 0)
         goto cleanup;
     info.message = msg;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.