]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Fix more time manipulations for y2038
authorGreg Hudson <ghudson@mit.edu>
Wed, 17 May 2017 18:52:09 +0000 (14:52 -0400)
committerGreg Hudson <ghudson@mit.edu>
Thu, 18 May 2017 16:03:37 +0000 (12:03 -0400)
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
src/kdc/dispatch.c
src/lib/krb5/os/c_ustime.c
src/lib/krb5/os/trace.c

index 27a6376af6b17b00a1cc9859985da872857cbe61..a75b65a26911defdea55c9b501698ad2e69059c1 100644 (file)
@@ -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;
index 3a169ebc7f40ef5d4b4653f7dbeabbcbcfc1282e..16a35d2be575c904c8a6ef593e3b7633d62ee091 100644 (file)
@@ -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;
         }
index 871d72183007f45089a5d17688995071870506ac..68fb381f4a85c440061ade182f84f9a19aab4d60 100644 (file)
@@ -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;
         }
     }
index 1f9be80f3df047875e80cf45bc515f74093c190b..bbd1f8622cbd9ce320f565c1490a2db6bbe1eba5 100644 (file)
@@ -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;