aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2012-11-21 14:13:20 +0000
committerDr. Stephen Henson <steve@openssl.org>2012-11-21 14:13:20 +0000
commit46a6cec6998b84d85240dfb99af235c8a0854a31 (patch)
tree8742de19d95907899dff2402aec9605a94686f72 /crypto
parent472af806ce859b6b00249550027c2c9fa149453b (diff)
downloadopenssl-46a6cec6998b84d85240dfb99af235c8a0854a31.tar.gz
Reorganise parameters for OPENSSL_gmtime_diff.
Make ASN1_UTCTIME_cmp_time_t more robust by using the new time functions.
Diffstat (limited to 'crypto')
-rw-r--r--crypto/asn1/a_time.c2
-rw-r--r--crypto/asn1/a_utctm.c53
-rw-r--r--crypto/o_time.c7
-rw-r--r--crypto/o_time.h3
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