diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2014-06-27 03:21:10 +0100 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2014-06-27 14:35:07 +0100 |
commit | d2aea038297e0c64ca66e6844cbb37377365885e (patch) | |
tree | 13e11f5b4a91e0dc5316bb7c6fb7203c313be84b /crypto/asn1/a_utctm.c | |
parent | 3b3b69ab25fbaba80a843dedec5ae9733fefca43 (diff) | |
download | openssl-d2aea038297e0c64ca66e6844cbb37377365885e.tar.gz |
Memory leak and NULL dereference fixes.
PR#3403
Diffstat (limited to 'crypto/asn1/a_utctm.c')
-rw-r--r-- | crypto/asn1/a_utctm.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c index 2da5f255c6..468123cc6f 100644 --- a/crypto/asn1/a_utctm.c +++ b/crypto/asn1/a_utctm.c @@ -240,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)) @@ -266,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); @@ -281,6 +286,10 @@ 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; } |