From 46a6cec6998b84d85240dfb99af235c8a0854a31 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Wed, 21 Nov 2012 14:13:20 +0000 Subject: [PATCH] Reorganise parameters for OPENSSL_gmtime_diff. Make ASN1_UTCTIME_cmp_time_t more robust by using the new time functions. --- crypto/asn1/a_time.c | 2 +- crypto/asn1/a_utctm.c | 53 ++++++++++++++++--------------------------- crypto/o_time.c | 7 +++--- crypto/o_time.h | 3 ++- 4 files changed, 27 insertions(+), 38 deletions(-) diff --git a/crypto/asn1/a_time.c b/crypto/asn1/a_time.c index 546d615c7d..e0d3d42d67 100644 --- a/crypto/asn1/a_time.c +++ b/crypto/asn1/a_time.c @@ -225,5 +225,5 @@ int ASN1_TIME_diff(int *pday, int *psec, return 0; if (!asn1_time_to_tm(&tm_to, to)) return 0; - return OPENSSL_gmtime_diff(&tm_from, &tm_to, pday, psec); + return OPENSSL_gmtime_diff(pday, psec, &tm_from, &tm_to); } diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c index 87a4b27567..d0d7be62a3 100644 --- a/crypto/asn1/a_utctm.c +++ b/crypto/asn1/a_utctm.c @@ -287,39 +287,26 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) { - struct tm *tm; - struct tm data; - int offset; - int year; - -#define g2(p) (((p)[0]-'0')*10+(p)[1]-'0') - - if (s->data[12] == 'Z') - offset=0; - else - { - offset = g2(s->data+13)*60+g2(s->data+15); - if (s->data[12] == '-') - offset = -offset; - } - - t -= offset*60; /* FIXME: may overflow in extreme cases */ - - tm = OPENSSL_gmtime(&t, &data); - -#define return_cmp(a,b) if ((a)<(b)) return -1; else if ((a)>(b)) return 1 - year = g2(s->data); - if (year < 50) - year += 100; - return_cmp(year, tm->tm_year); - return_cmp(g2(s->data+2) - 1, tm->tm_mon); - return_cmp(g2(s->data+4), tm->tm_mday); - return_cmp(g2(s->data+6), tm->tm_hour); - return_cmp(g2(s->data+8), tm->tm_min); - return_cmp(g2(s->data+10), tm->tm_sec); -#undef g2 -#undef return_cmp - + struct tm stm, ttm; + int day, sec; + + if (!asn1_utctime_to_tm(&stm, s)) + return -2; + + if (!OPENSSL_gmtime(&t, &ttm)) + return -2; + + if (!OPENSSL_gmtime_diff(&day, &sec, &stm, &ttm)) + return -2; + + if (day > 0) + return 1; + if (day < 0) + return -1; + if (sec > 0) + return 1; + if (sec < 0) + return -1; return 0; } diff --git a/crypto/o_time.c b/crypto/o_time.c index 49bff49f2b..b78f5ca630 100644 --- a/crypto/o_time.c +++ b/crypto/o_time.c @@ -234,7 +234,7 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) static long date_to_julian(int y, int m, int d); static void julian_to_date(long jd, int *y, int *m, int *d); -static int julian_adj(struct tm *tm, int off_day, long offset_sec, +static int julian_adj(const struct tm *tm, int off_day, long offset_sec, long *pday, int *psec); int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) @@ -267,7 +267,8 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) } -int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec) +int OPENSSL_gmtime_diff(int *pday, int *psec, + const struct tm *from, const struct tm *to) { int from_sec, to_sec, diff_sec; long from_jd, to_jd, diff_day; @@ -300,7 +301,7 @@ int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec) /* Convert tm structure and offset into julian day and seconds */ -static int julian_adj(struct tm *tm, int off_day, long offset_sec, +static int julian_adj(const struct tm *tm, int off_day, long offset_sec, long *pday, int *psec) { int offset_hms, offset_day; diff --git a/crypto/o_time.h b/crypto/o_time.h index 671099a32d..fcf8c230e1 100644 --- a/crypto/o_time.h +++ b/crypto/o_time.h @@ -63,6 +63,7 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); -int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec); +int OPENSSL_gmtime_diff(int *pday, int *psec, + const struct tm *from, const struct tm *to); #endif -- 2.25.1