diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-01-21 09:52:09 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-01-21 09:52:09 +0100 |
commit | 558bd61dd76c064be9aff0be8ef5c7240bd81747 (patch) | |
tree | 3d5879e9e954b81e5e77c971b57f91cd367759d3 /lib/x509 | |
parent | b399c12ca778ce35764c794918eca4c7bbed6ed2 (diff) | |
download | gnutls-558bd61dd76c064be9aff0be8ef5c7240bd81747.tar.gz |
Corrected bug in _gnutls_parse_aia()
Diffstat (limited to 'lib/x509')
-rw-r--r-- | lib/x509/x509.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/lib/x509/x509.c b/lib/x509/x509.c index 5fd2476cc0..c8514f35bd 100644 --- a/lib/x509/x509.c +++ b/lib/x509/x509.c @@ -3344,19 +3344,21 @@ _gnutls_parse_aia (ASN1_TYPE src, if (oid == NULL) oid = GNUTLS_OID_AD_OCSP; { - char *tmpoid[20]; + char tmpoid[20]; snprintf (nptr, sizeof (nptr), "?%u.accessMethod", seq); len = sizeof (tmpoid); result = asn1_read_value (src, nptr, tmpoid, &len); + if (result == ASN1_VALUE_NOT_FOUND || result == ASN1_ELEMENT_NOT_FOUND) - return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; + return gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE); + if (result != ASN1_SUCCESS) { gnutls_assert (); return _gnutls_asn2err (result); } if ((unsigned)len != strlen (oid) + 1 || memcmp (tmpoid, oid, len) != 0) - return GNUTLS_E_UNKNOWN_ALGORITHM; + return gnutls_assert_val(GNUTLS_E_UNKNOWN_ALGORITHM); } /* fall through */ @@ -3366,26 +3368,26 @@ _gnutls_parse_aia (ASN1_TYPE src, break; default: - gnutls_assert (); - return GNUTLS_E_INVALID_REQUEST; + return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST); } len = 0; result = asn1_read_value (src, nptr, NULL, &len); if (result == ASN1_VALUE_NOT_FOUND || result == ASN1_ELEMENT_NOT_FOUND) - return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; + return gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE); + if (result != ASN1_MEM_ERROR) { gnutls_assert (); return _gnutls_asn2err (result); } + d.size = len; + d.data = gnutls_malloc (d.size); if (d.data == NULL) - { - gnutls_assert (); - return GNUTLS_E_MEMORY_ERROR; - } + return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + result = asn1_read_value (src, nptr, d.data, &len); if (result != ASN1_SUCCESS) { @@ -3402,7 +3404,7 @@ _gnutls_parse_aia (ASN1_TYPE src, else gnutls_free (d.data); - return GNUTLS_E_SUCCESS; + return 0; } /** @@ -3524,6 +3526,7 @@ gnutls_x509_crt_get_authority_info_access (gnutls_x509_crt_t crt, } ret = _gnutls_parse_aia (c2, seq, what, data); + asn1_delete_structure (&c2); if (ret < 0) gnutls_assert (); |