fixed ASN.1 to time_t conversion on 32-bit system for dates after Jan 19 03:14:07...
authorAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 27 Mar 2009 08:54:10 +0000 (08:54 -0000)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 27 Mar 2009 08:54:10 +0000 (08:54 -0000)
src/libstrongswan/asn1/asn1.c
src/pluto/asn1.c

index dacf12c..6dd90b7 100644 (file)
@@ -264,13 +264,15 @@ u_int asn1_length(chunk_t *blob)
        return len;
 }
 
+#define TIME_MAX       0x7fffffff
+
 /**
  * Converts ASN.1 UTCTIME or GENERALIZEDTIME into calender time
  */
 time_t asn1_to_time(const chunk_t *utctime, asn1_t type)
 {
        struct tm t;
-       time_t tz_offset;
+       time_t tc, tz_offset;
        u_char *eot = NULL;
        
        if ((eot = memchr(utctime->ptr, 'Z', utctime->len)) != NULL)
@@ -296,12 +298,13 @@ time_t asn1_to_time(const chunk_t *utctime, asn1_t type)
                return 0; /* error in time format */
        }
        
+       /* parse ASN.1 time string */
        {
-       const char* format = (type == ASN1_UTCTIME)? "%2d%2d%2d%2d%2d":
-                       "%4d%2d%2d%2d%2d";
+               const char* format = (type == ASN1_UTCTIME)? "%2d%2d%2d%2d%2d":
+                                                                                                        "%4d%2d%2d%2d%2d";
        
-       sscanf(utctime->ptr, format, &t.tm_year, &t.tm_mon, &t.tm_mday,
-                  &t.tm_hour, &t.tm_min);
+               sscanf(utctime->ptr, format, &t.tm_year, &t.tm_mon, &t.tm_mday,
+                                                                        &t.tm_hour, &t.tm_min);
        }
        
        /* is there a seconds field? */
@@ -334,9 +337,11 @@ time_t asn1_to_time(const chunk_t *utctime, asn1_t type)
        /* set daylight saving time to off */
        t.tm_isdst = 0;
        
-       /* compensate timezone */
-       
-       return mktime(&t) - timezone - tz_offset;
+       /* convert to time_t */
+       tc = mktime(&t);
+
+       /* if no conversion overflow occurred, compensate timezone */
+       return (tc == -1) ? TIME_MAX : tc - timezone - tz_offset;
 }
 
 /**
index 5303b68..f7519d2 100644 (file)
@@ -348,6 +348,8 @@ is_printablestring(chunk_t str)
     return TRUE;
 }
 
+#define TIME_MAX       0x7fffffff
+
 /*
  *  Converts ASN.1 UTCTIME or GENERALIZEDTIME into calender time
  */
@@ -355,7 +357,7 @@ time_t
 asn1totime(const chunk_t *utctime, asn1_t type)
 {
     struct tm t;
-    time_t tz_offset;
+    time_t tc, tz_offset;
     u_char *eot = NULL;
 
     if ((eot = memchr(utctime->ptr, 'Z', utctime->len)) != NULL)
@@ -381,6 +383,7 @@ asn1totime(const chunk_t *utctime, asn1_t type)
        return 0; /* error in time format */
     }
 
+    /* parse ASN.1 time string */
     {
        const char* format = (type == ASN1_UTCTIME)? "%2d%2d%2d%2d%2d":
                                                     "%4d%2d%2d%2d%2d";
@@ -419,9 +422,11 @@ asn1totime(const chunk_t *utctime, asn1_t type)
     /* set daylight saving time to off */
     t.tm_isdst = 0;
 
-    /* compensate timezone */
+    /* convert to time_t */
+    tc = mktime(&t);
 
-    return mktime(&t) - timezone - tz_offset;
+    /* if no conversion overflow occurred, compensate timezone */
+    return (tc == -1) ? TIME_MAX : tc - timezone - tz_offset;
 }
 
 /*