mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 10:47:28 +02:00
fix for memory leak due to missed WOLFSSL_GENERAL_NAME capability changes
This commit is contained in:
92
src/x509.c
92
src/x509.c
@ -587,6 +587,76 @@ err:
|
|||||||
#endif /* OPENSSL_ALL || WOLFSSL_WPAS_SMALL */
|
#endif /* OPENSSL_ALL || WOLFSSL_WPAS_SMALL */
|
||||||
|
|
||||||
#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
|
#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
|
||||||
|
static int DNS_to_GENERAL_NAME(WOLFSSL_GENERAL_NAME* gn, DNS_entry* dns)
|
||||||
|
{
|
||||||
|
gn->type = dns->type;
|
||||||
|
switch (gn->type) {
|
||||||
|
case WOLFSSL_GEN_OTHERNAME:
|
||||||
|
if (!wolfssl_dns_entry_othername_to_gn(dns, gn)) {
|
||||||
|
WOLFSSL_MSG("OTHERNAME set failed");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WOLFSSL_GEN_EMAIL:
|
||||||
|
case WOLFSSL_GEN_DNS:
|
||||||
|
case WOLFSSL_GEN_URI:
|
||||||
|
case WOLFSSL_GEN_IPADD:
|
||||||
|
case WOLFSSL_GEN_IA5:
|
||||||
|
gn->d.ia5->length = dns->len;
|
||||||
|
if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
|
||||||
|
gn->d.ia5->length) != WOLFSSL_SUCCESS) {
|
||||||
|
WOLFSSL_MSG("ASN1_STRING_set failed");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case WOLFSSL_GEN_DIRNAME:
|
||||||
|
/* wolfSSL_GENERAL_NAME_new() mallocs this by default */
|
||||||
|
wolfSSL_ASN1_STRING_free(gn->d.ia5);
|
||||||
|
gn->d.ia5 = NULL;
|
||||||
|
|
||||||
|
gn->d.dirn = wolfSSL_X509_NAME_new();;
|
||||||
|
/* @TODO extract dir name info from DNS_entry */
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_RID_ALT_NAME
|
||||||
|
case WOLFSSL_GEN_RID:
|
||||||
|
/* wolfSSL_GENERAL_NAME_new() mallocs this by default */
|
||||||
|
wolfSSL_ASN1_STRING_free(gn->d.ia5);
|
||||||
|
gn->d.ia5 = NULL;
|
||||||
|
|
||||||
|
gn->d.registeredID = wolfSSL_ASN1_OBJECT_new();
|
||||||
|
if (gn->d.registeredID == NULL) {
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
gn->d.registeredID->obj = XMALLOC(dns->len,
|
||||||
|
gn->d.registeredID->heap, DYNAMIC_TYPE_ASN1);
|
||||||
|
if (gn->d.registeredID->obj == NULL) {
|
||||||
|
/* registeredID gets free'd up by caller after failure */
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
gn->d.registeredID->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
|
||||||
|
XMEMCPY((byte*)gn->d.registeredID->obj, dns->ridString, dns->len);
|
||||||
|
gn->d.registeredID->objSz = dns->len;
|
||||||
|
gn->d.registeredID->grp = oidCertExtType;
|
||||||
|
gn->d.registeredID->nid = WC_NID_registeredAddress;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case WOLFSSL_GEN_X400:
|
||||||
|
/* Unsupported: fall through */
|
||||||
|
case WOLFSSL_GEN_EDIPARTY:
|
||||||
|
/* Unsupported: fall through */
|
||||||
|
default:
|
||||||
|
WOLFSSL_MSG("Unsupported type conversion");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
return WOLFSSL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int wolfssl_x509_alt_names_to_gn(WOLFSSL_X509* x509,
|
static int wolfssl_x509_alt_names_to_gn(WOLFSSL_X509* x509,
|
||||||
WOLFSSL_X509_EXTENSION* ext)
|
WOLFSSL_X509_EXTENSION* ext)
|
||||||
{
|
{
|
||||||
@ -624,24 +694,10 @@ static int wolfssl_x509_alt_names_to_gn(WOLFSSL_X509* x509,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
gn->type = dns->type;
|
if (DNS_to_GENERAL_NAME(gn, dns) != WOLFSSL_SUCCESS) {
|
||||||
if (gn->type == WOLFSSL_GEN_OTHERNAME) {
|
wolfSSL_GENERAL_NAME_free(gn);
|
||||||
if (!wolfssl_dns_entry_othername_to_gn(dns, gn)) {
|
wolfSSL_sk_pop_free(sk, NULL);
|
||||||
WOLFSSL_MSG("OTHERNAME set failed");
|
goto err;
|
||||||
wolfSSL_GENERAL_NAME_free(gn);
|
|
||||||
wolfSSL_sk_pop_free(sk, NULL);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
gn->d.ia5->length = dns->len;
|
|
||||||
if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
|
|
||||||
gn->d.ia5->length) != WOLFSSL_SUCCESS) {
|
|
||||||
WOLFSSL_MSG("ASN1_STRING_set failed");
|
|
||||||
wolfSSL_GENERAL_NAME_free(gn);
|
|
||||||
wolfSSL_sk_pop_free(sk, NULL);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) <= 0) {
|
if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) <= 0) {
|
||||||
|
@ -77998,6 +77998,7 @@ static int test_X509_REQ(void)
|
|||||||
#ifdef HAVE_ECC
|
#ifdef HAVE_ECC
|
||||||
const unsigned char* ecPriv = (const unsigned char*)ecc_clikey_der_256;
|
const unsigned char* ecPriv = (const unsigned char*)ecc_clikey_der_256;
|
||||||
const unsigned char* ecPub = (unsigned char*)ecc_clikeypub_der_256;
|
const unsigned char* ecPub = (unsigned char*)ecc_clikeypub_der_256;
|
||||||
|
BIO* bio = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ExpectNotNull(name = X509_NAME_new());
|
ExpectNotNull(name = X509_NAME_new());
|
||||||
@ -78089,6 +78090,10 @@ static int test_X509_REQ(void)
|
|||||||
/* Signature is random and may be shorter or longer. */
|
/* Signature is random and may be shorter or longer. */
|
||||||
ExpectIntGE((len = i2d_X509_REQ(req, &der)), 245);
|
ExpectIntGE((len = i2d_X509_REQ(req, &der)), 245);
|
||||||
ExpectIntLE(len, 253);
|
ExpectIntLE(len, 253);
|
||||||
|
ExpectNotNull(bio = BIO_new_fp(stderr, BIO_NOCLOSE));
|
||||||
|
ExpectIntEQ(X509_REQ_print(bio, req), WOLFSSL_SUCCESS);
|
||||||
|
ExpectIntEQ(X509_REQ_print(bio, NULL), WOLFSSL_FAILURE);
|
||||||
|
BIO_free(bio);
|
||||||
XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
|
XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
|
||||||
X509_REQ_free(req);
|
X509_REQ_free(req);
|
||||||
EVP_PKEY_free(pub);
|
EVP_PKEY_free(pub);
|
||||||
|
@ -567,7 +567,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
|
|||||||
#define X509_sign wolfSSL_X509_sign
|
#define X509_sign wolfSSL_X509_sign
|
||||||
#define X509_sign_ctx wolfSSL_X509_sign_ctx
|
#define X509_sign_ctx wolfSSL_X509_sign_ctx
|
||||||
#define X509_print wolfSSL_X509_print
|
#define X509_print wolfSSL_X509_print
|
||||||
#define X509_REQ_print wolfSSL_X509_print
|
#define X509_REQ_print wolfSSL_X509_REQ_print
|
||||||
#define X509_print_ex wolfSSL_X509_print_ex
|
#define X509_print_ex wolfSSL_X509_print_ex
|
||||||
#define X509_print_fp wolfSSL_X509_print_fp
|
#define X509_print_fp wolfSSL_X509_print_fp
|
||||||
#define X509_CRL_print wolfSSL_X509_CRL_print
|
#define X509_CRL_print wolfSSL_X509_CRL_print
|
||||||
|
@ -912,6 +912,7 @@ extern const WOLFSSL_ObjectInfo wolfssl_object_info[];
|
|||||||
#define WC_NID_postalCode ASN_POSTAL_CODE /* postalCode */
|
#define WC_NID_postalCode ASN_POSTAL_CODE /* postalCode */
|
||||||
#define WC_NID_favouriteDrink 462
|
#define WC_NID_favouriteDrink 462
|
||||||
#define WC_NID_userId 458
|
#define WC_NID_userId 458
|
||||||
|
#define WC_NID_registeredAddress 870
|
||||||
#define WC_NID_emailAddress 0x30 /* emailAddress */
|
#define WC_NID_emailAddress 0x30 /* emailAddress */
|
||||||
#define WC_NID_id_on_dnsSRV 82 /* 1.3.6.1.5.5.7.8.7 */
|
#define WC_NID_id_on_dnsSRV 82 /* 1.3.6.1.5.5.7.8.7 */
|
||||||
#define WC_NID_ms_upn 265 /* 1.3.6.1.4.1.311.20.2.3 */
|
#define WC_NID_ms_upn 265 /* 1.3.6.1.4.1.311.20.2.3 */
|
||||||
|
Reference in New Issue
Block a user