mime_hdr_new: free mhdr, tmpname, tmpval on error path
[oweals/openssl.git] / crypto / asn1 / a_utctm.c
index 87a4b2756743702d306111fa223ae453f54d44b1..468123cc6f888918b13a7eede584d1c476e18179 100644 (file)
@@ -59,7 +59,6 @@
 #include <stdio.h>
 #include <time.h>
 #include "cryptlib.h"
-#include "o_time.h"
 #include <openssl/asn1.h>
 #include "asn1_locl.h"
 
@@ -241,24 +240,29 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
        struct tm *ts;
        struct tm data;
        size_t len = 20;
+       int free_s = 0;
 
        if (s == NULL)
+               {
+               free_s = 1;
                s=M_ASN1_UTCTIME_new();
+               }
        if (s == NULL)
-               return(NULL);
+               goto err;
+
 
        ts=OPENSSL_gmtime(&t, &data);
        if (ts == NULL)
-               return(NULL);
+               goto err;
 
        if (offset_day || offset_sec)
                { 
                if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
-                       return NULL;
+                       goto err;
                }
 
        if((ts->tm_year < 50) || (ts->tm_year >= 150))
-               return NULL;
+               goto err;
 
        p=(char *)s->data;
        if ((p == NULL) || ((size_t)s->length < len))
@@ -267,7 +271,7 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
                if (p == NULL)
                        {
                        ASN1err(ASN1_F_ASN1_UTCTIME_ADJ,ERR_R_MALLOC_FAILURE);
-                       return(NULL);
+                       goto err;
                        }
                if (s->data != NULL)
                        OPENSSL_free(s->data);
@@ -282,44 +286,35 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
        ebcdic2ascii(s->data, s->data, s->length);
 #endif
        return(s);
+       err:
+       if (free_s && s)
+               M_ASN1_UTCTIME_free(s);
+       return NULL;
        }
 
 
 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;
        }