diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2015-03-28 22:41:03 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2015-03-28 22:41:03 +0100 |
commit | ca8aba2b19708c34dcdd34ecc59c028ba576282f (patch) | |
tree | c008e586362e60c6b93c2b33e6d52bd4543bc7de /lib/x509/x509_ext.c | |
parent | 19daa301a2704324afb5899cd126d67f1f8b4ca5 (diff) | |
download | gnutls-ca8aba2b19708c34dcdd34ecc59c028ba576282f.tar.gz |
Better fix for the double free in dist point parsing
Diffstat (limited to 'lib/x509/x509_ext.c')
-rw-r--r-- | lib/x509/x509_ext.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/x509/x509_ext.c b/lib/x509/x509_ext.c index 989ab25b4b..db0e0a10fc 100644 --- a/lib/x509/x509_ext.c +++ b/lib/x509/x509_ext.c @@ -2286,7 +2286,7 @@ int gnutls_x509_ext_import_crl_dist_points(const gnutls_datum_t * ext, int len, ret; uint8_t reasons[2]; unsigned i, type, rflags, j; - gnutls_datum_t san; + gnutls_datum_t san = {NULL, 0}; result = asn1_create_element (_gnutls_get_pkix(), "PKIX1.CRLDistributionPoints", &c2); @@ -2309,9 +2309,6 @@ int gnutls_x509_ext_import_crl_dist_points(const gnutls_datum_t * ext, i = 0; do { - san.data = NULL; - san.size = 0; - snprintf(name, sizeof(name), "?%u.reasons", (unsigned)i + 1); len = sizeof(reasons); @@ -2336,6 +2333,9 @@ int gnutls_x509_ext_import_crl_dist_points(const gnutls_datum_t * ext, j = 0; do { + san.data = NULL; + san.size = 0; + ret = _gnutls_parse_general_name2(c2, name, j, &san, &type, 0); @@ -2350,6 +2350,7 @@ int gnutls_x509_ext_import_crl_dist_points(const gnutls_datum_t * ext, ret = crl_dist_points_set(cdp, type, &san, rflags); if (ret < 0) break; + san.data = NULL; /* it is now in cdp */ j++; } while (ret >= 0); @@ -2359,6 +2360,7 @@ int gnutls_x509_ext_import_crl_dist_points(const gnutls_datum_t * ext, if (ret < 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) { gnutls_assert(); + gnutls_free(san.data); goto cleanup; } |