Skip to content

Commit 878cf3a

Browse files
authored
Merge pull request wolfSSL#8155 from JacobBarthelmeh/x509_req
fix for memory leak due to missed WOLFSSL_GENERAL_NAME capability cha…
2 parents c5f1acf + ce935fd commit 878cf3a

4 files changed

Lines changed: 81 additions & 19 deletions

File tree

src/x509.c

Lines changed: 74 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,76 @@ static int wolfssl_dns_entry_othername_to_gn(DNS_entry* dns,
587587
#endif /* OPENSSL_ALL || WOLFSSL_WPAS_SMALL */
588588

589589
#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
590+
static int DNS_to_GENERAL_NAME(WOLFSSL_GENERAL_NAME* gn, DNS_entry* dns)
591+
{
592+
gn->type = dns->type;
593+
switch (gn->type) {
594+
case WOLFSSL_GEN_OTHERNAME:
595+
if (!wolfssl_dns_entry_othername_to_gn(dns, gn)) {
596+
WOLFSSL_MSG("OTHERNAME set failed");
597+
return WOLFSSL_FAILURE;
598+
}
599+
break;
600+
601+
case WOLFSSL_GEN_EMAIL:
602+
case WOLFSSL_GEN_DNS:
603+
case WOLFSSL_GEN_URI:
604+
case WOLFSSL_GEN_IPADD:
605+
case WOLFSSL_GEN_IA5:
606+
gn->d.ia5->length = dns->len;
607+
if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
608+
gn->d.ia5->length) != WOLFSSL_SUCCESS) {
609+
WOLFSSL_MSG("ASN1_STRING_set failed");
610+
return WOLFSSL_FAILURE;
611+
}
612+
break;
613+
614+
615+
case WOLFSSL_GEN_DIRNAME:
616+
/* wolfSSL_GENERAL_NAME_new() mallocs this by default */
617+
wolfSSL_ASN1_STRING_free(gn->d.ia5);
618+
gn->d.ia5 = NULL;
619+
620+
gn->d.dirn = wolfSSL_X509_NAME_new();;
621+
/* @TODO extract dir name info from DNS_entry */
622+
break;
623+
624+
#ifdef WOLFSSL_RID_ALT_NAME
625+
case WOLFSSL_GEN_RID:
626+
/* wolfSSL_GENERAL_NAME_new() mallocs this by default */
627+
wolfSSL_ASN1_STRING_free(gn->d.ia5);
628+
gn->d.ia5 = NULL;
629+
630+
gn->d.registeredID = wolfSSL_ASN1_OBJECT_new();
631+
if (gn->d.registeredID == NULL) {
632+
return WOLFSSL_FAILURE;
633+
}
634+
gn->d.registeredID->obj = (const unsigned char*)XMALLOC(dns->len,
635+
gn->d.registeredID->heap, DYNAMIC_TYPE_ASN1);
636+
if (gn->d.registeredID->obj == NULL) {
637+
/* registeredID gets free'd up by caller after failure */
638+
return WOLFSSL_FAILURE;
639+
}
640+
gn->d.registeredID->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
641+
XMEMCPY((byte*)gn->d.registeredID->obj, dns->ridString, dns->len);
642+
gn->d.registeredID->objSz = dns->len;
643+
gn->d.registeredID->grp = oidCertExtType;
644+
gn->d.registeredID->nid = WC_NID_registeredAddress;
645+
break;
646+
#endif
647+
648+
case WOLFSSL_GEN_X400:
649+
/* Unsupported: fall through */
650+
case WOLFSSL_GEN_EDIPARTY:
651+
/* Unsupported: fall through */
652+
default:
653+
WOLFSSL_MSG("Unsupported type conversion");
654+
return WOLFSSL_FAILURE;
655+
}
656+
return WOLFSSL_SUCCESS;
657+
}
658+
659+
590660
static int wolfssl_x509_alt_names_to_gn(WOLFSSL_X509* x509,
591661
WOLFSSL_X509_EXTENSION* ext)
592662
{
@@ -624,24 +694,10 @@ static int wolfssl_x509_alt_names_to_gn(WOLFSSL_X509* x509,
624694
goto err;
625695
}
626696

627-
gn->type = dns->type;
628-
if (gn->type == WOLFSSL_GEN_OTHERNAME) {
629-
if (!wolfssl_dns_entry_othername_to_gn(dns, gn)) {
630-
WOLFSSL_MSG("OTHERNAME set failed");
631-
wolfSSL_GENERAL_NAME_free(gn);
632-
wolfSSL_sk_pop_free(sk, NULL);
633-
goto err;
634-
}
635-
}
636-
else {
637-
gn->d.ia5->length = dns->len;
638-
if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
639-
gn->d.ia5->length) != WOLFSSL_SUCCESS) {
640-
WOLFSSL_MSG("ASN1_STRING_set failed");
641-
wolfSSL_GENERAL_NAME_free(gn);
642-
wolfSSL_sk_pop_free(sk, NULL);
643-
goto err;
644-
}
697+
if (DNS_to_GENERAL_NAME(gn, dns) != WOLFSSL_SUCCESS) {
698+
wolfSSL_GENERAL_NAME_free(gn);
699+
wolfSSL_sk_pop_free(sk, NULL);
700+
goto err;
645701
}
646702

647703
if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) <= 0) {

tests/api.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77998,6 +77998,7 @@ static int test_X509_REQ(void)
7799877998
#ifdef HAVE_ECC
7799977999
const unsigned char* ecPriv = (const unsigned char*)ecc_clikey_der_256;
7800078000
const unsigned char* ecPub = (unsigned char*)ecc_clikeypub_der_256;
78001+
BIO* bio = NULL;
7800178002
#endif
7800278003

7800378004
ExpectNotNull(name = X509_NAME_new());
@@ -78089,6 +78090,10 @@ static int test_X509_REQ(void)
7808978090
/* Signature is random and may be shorter or longer. */
7809078091
ExpectIntGE((len = i2d_X509_REQ(req, &der)), 245);
7809178092
ExpectIntLE(len, 253);
78093+
ExpectNotNull(bio = BIO_new_fp(stderr, BIO_NOCLOSE));
78094+
ExpectIntEQ(X509_REQ_print(bio, req), WOLFSSL_SUCCESS);
78095+
ExpectIntEQ(X509_REQ_print(bio, NULL), WOLFSSL_FAILURE);
78096+
BIO_free(bio);
7809278097
XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
7809378098
X509_REQ_free(req);
7809478099
EVP_PKEY_free(pub);

wolfssl/openssl/ssl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
567567
#define X509_sign wolfSSL_X509_sign
568568
#define X509_sign_ctx wolfSSL_X509_sign_ctx
569569
#define X509_print wolfSSL_X509_print
570-
#define X509_REQ_print wolfSSL_X509_print
570+
#define X509_REQ_print wolfSSL_X509_REQ_print
571571
#define X509_print_ex wolfSSL_X509_print_ex
572572
#define X509_print_fp wolfSSL_X509_print_fp
573573
#define X509_CRL_print wolfSSL_X509_CRL_print

wolfssl/wolfcrypt/asn.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,7 @@ extern const WOLFSSL_ObjectInfo wolfssl_object_info[];
912912
#define WC_NID_postalCode ASN_POSTAL_CODE /* postalCode */
913913
#define WC_NID_favouriteDrink 462
914914
#define WC_NID_userId 458
915+
#define WC_NID_registeredAddress 870
915916
#define WC_NID_emailAddress 0x30 /* emailAddress */
916917
#define WC_NID_id_on_dnsSRV 82 /* 1.3.6.1.5.5.7.8.7 */
917918
#define WC_NID_ms_upn 265 /* 1.3.6.1.4.1.311.20.2.3 */

0 commit comments

Comments
 (0)