Reorganise parameters for OPENSSL_gmtime_diff.
authorDr. Stephen Henson <steve@openssl.org>
Wed, 21 Nov 2012 14:13:20 +0000 (14:13 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 21 Nov 2012 14:13:20 +0000 (14:13 +0000)
Make ASN1_UTCTIME_cmp_time_t more robust by using the new time functions.

crypto/asn1/a_time.c
crypto/asn1/a_utctm.c
crypto/o_time.c
crypto/o_time.h

index 546d615..e0d3d42 100644 (file)
@@ -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);
        }       
index 87a4b27..d0d7be6 100644 (file)
@@ -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;
        }
 
index 49bff49..b78f5ca 100644 (file)
@@ -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;
index 671099a..fcf8c23 100644 (file)
@@ -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