home | help | back | first | fref | pref | prev | next | nref | lref | last | post |
Date: Tue, 16 May 2017 12:08:26 -0400 From: Greg Hudson <ghudson@mit.edu> Message-Id: <201705161608.v4GG8QGS013082@drugstore.mit.edu> To: cvs-krb5@mit.edu Reply-To: krbdev@mit.edu MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: cvs-krb5-bounces@mit.edu https://github.com/krb5/krb5/commit/58e9155060cd93b1a7557e37fbc9b077b76465c2 commit 58e9155060cd93b1a7557e37fbc9b077b76465c2 Author: Greg Hudson <ghudson@mit.edu> Date: Sat Apr 22 09:49:12 2017 -0400 Add timestamp helper functions Add k5-int.h helper functions to manipulate krb5_timestamp values, avoiding undefined behavior and treating negative timestamp values as times between 2038 and 2106. Add a doxygen comment for krb5_timestamp indicating how third-party code should use it safely. ticket: 8352 src/include/k5-int.h | 31 +++++++++++++++++++++++++++++++ src/include/krb5/krb5.hin | 9 +++++++++ 2 files changed, 40 insertions(+), 0 deletions(-) diff --git a/src/include/k5-int.h b/src/include/k5-int.h index 360e088..ff93a3b 100644 --- a/src/include/k5-int.h +++ b/src/include/k5-int.h @@ -2353,6 +2353,37 @@ k5memdup0(const void *in, size_t len, krb5_error_code *code) return ptr; } +/* Convert a krb5_timestamp to a time_t value, treating the negative range of + * krb5_timestamp as times between 2038 and 2106 (if time_t is 64-bit). */ +static inline time_t +ts2tt(krb5_timestamp timestamp) +{ + return (time_t)(uint32_t)timestamp; +} + +/* Return the delta between two timestamps (a - b) as a signed 32-bit value, + * without relying on undefined behavior. */ +static inline krb5_deltat +ts_delta(krb5_timestamp a, krb5_timestamp b) +{ + return (krb5_deltat)((uint32_t)a - (uint32_t)b); +} + +/* Increment a timestamp by a signed 32-bit interval, without relying on + * undefined behavior. */ +static inline krb5_timestamp +ts_incr(krb5_timestamp ts, krb5_deltat delta) +{ + return (krb5_timestamp)((uint32_t)ts + (uint32_t)delta); +} + +/* Return true if a comes after b. */ +static inline krb5_boolean +ts_after(krb5_timestamp a, krb5_timestamp b) +{ + return (uint32_t)a > (uint32_t)b; +} + krb5_error_code KRB5_CALLCONV krb5_get_credentials_for_user(krb5_context context, krb5_flags options, krb5_ccache ccache, diff --git a/src/include/krb5/krb5.hin b/src/include/krb5/krb5.hin index 762900e..c86e782 100644 --- a/src/include/krb5/krb5.hin +++ b/src/include/krb5/krb5.hin @@ -181,7 +181,16 @@ typedef krb5_int32 krb5_cryptotype; typedef krb5_int32 krb5_preauthtype; /* This may change, later on */ typedef krb5_int32 krb5_flags; + +/** + * Represents a timestamp in seconds since the POSIX epoch. This legacy type + * is used frequently in the ABI, but cannot represent timestamps after 2038 as + * a positive number. Code which uses this type should cast values of it to + * uint32_t so that negative values are treated as timestamps between 2038 and + * 2106 on platforms with 64-bit time_t. + */ typedef krb5_int32 krb5_timestamp; + typedef krb5_int32 krb5_deltat; /** _______________________________________________ cvs-krb5 mailing list cvs-krb5@mit.edu https://mailman.mit.edu/mailman/listinfo/cvs-krb5
home | help | back | first | fref | pref | prev | next | nref | lref | last | post |