forked from wolfSSL/wolfssl
OBJ_obj2nid memory leak
This commit is contained in:
committed by
Go Hosohara
parent
2669b80943
commit
7d2a03f8c9
35
src/ssl.c
35
src/ssl.c
@@ -15499,14 +15499,14 @@ void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
|
||||
return;
|
||||
}
|
||||
|
||||
if (obj->dynamic == 1) {
|
||||
if (obj->obj != NULL) {
|
||||
WOLFSSL_MSG("Freeing ASN1 OBJECT data");
|
||||
XFREE(obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
|
||||
}
|
||||
if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
|
||||
WOLFSSL_MSG("Freeing ASN1 data");
|
||||
XFREE(obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
|
||||
}
|
||||
|
||||
XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
|
||||
if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
|
||||
WOLFSSL_MSG("Freeing ASN1 OBJECT");
|
||||
XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28473,7 +28473,8 @@ int wolfSSL_i2d_RSAPublicKey(WOLFSSL_RSA *rsa, const unsigned char **pp)
|
||||
}
|
||||
if ((ret = wc_RsaKeyToPublicDer((RsaKey *)rsa->internal, der, derLen)) < 0){
|
||||
WOLFSSL_MSG("RsaKeyToPublicDer failed");
|
||||
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
if(der != NULL)
|
||||
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
return ret;
|
||||
}
|
||||
if((pp != NULL) && (ret >= 0))
|
||||
@@ -30180,10 +30181,13 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
|
||||
WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
|
||||
return NULL;
|
||||
}
|
||||
obj->dynamic = WOLFSSL_ASN1_DYNAMIC;
|
||||
} else {
|
||||
obj->dynamic = 0;
|
||||
}
|
||||
obj->type = id;
|
||||
obj->grp = type;
|
||||
obj->dynamic = 1;
|
||||
|
||||
XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
|
||||
|
||||
objBuf[0] = ASN_OBJECT_ID; objSz++;
|
||||
@@ -30191,11 +30195,14 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
|
||||
XMEMCPY(objBuf + objSz, oid, oidSz);
|
||||
objSz += oidSz;
|
||||
obj->objSz = objSz;
|
||||
|
||||
obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
|
||||
if (obj->obj == NULL) {
|
||||
wolfSSL_ASN1_OBJECT_free(obj);
|
||||
return NULL;
|
||||
if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) ||
|
||||
(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) == 0) && (obj->obj == NULL))) {
|
||||
obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
|
||||
if (obj->obj == NULL) {
|
||||
wolfSSL_ASN1_OBJECT_free(obj);
|
||||
return NULL;
|
||||
}
|
||||
obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
|
||||
}
|
||||
XMEMCPY(obj->obj, objBuf, obj->objSz);
|
||||
|
||||
|
17
tests/api.c
17
tests/api.c
@@ -14989,7 +14989,7 @@ static void test_wc_PKCS7_EncodeSignedData_ex(void)
|
||||
int certSz, keySz;
|
||||
|
||||
fp = XFOPEN("./certs/client-ecc-cert.der", "rb");
|
||||
AssertTrue(fp != BADFILE);
|
||||
AssertTrue(fp != XBADFILE);
|
||||
certSz = XFREAD(cert, 1, sizeof_cliecc_cert_der_256, fp);
|
||||
XFCLOSE(fp);
|
||||
|
||||
@@ -18552,29 +18552,28 @@ static void test_wolfSSL_OBJ(void)
|
||||
|
||||
for (i = 0; f[i] != NULL; i++)
|
||||
{
|
||||
printf("file=%s\n", f[i]);
|
||||
AssertTrue((fp = XFOPEN(f[i], "r")) != XBADFILE);
|
||||
AssertNotNull(x509 = d2i_X509_fp(fp, NULL));
|
||||
XFCLOSE(fp);
|
||||
AssertNotNull(x509Name = X509_get_issuer_name(x509));
|
||||
AssertIntNE((numNames = X509_NAME_entry_count(x509Name)), 0);
|
||||
AssertTrue((bio = BIO_new(BIO_s_mem())) != NULL);
|
||||
for (j = 0; j < numNames; j++)
|
||||
{
|
||||
AssertNotNull(x509NameEntry = X509_NAME_get_entry(x509Name, j));
|
||||
AssertNotNull(x509NameEntry = X509_NAME_get_entry(x509Name, j));
|
||||
AssertNotNull(asn1Name = X509_NAME_ENTRY_get_object(x509NameEntry));
|
||||
AssertTrue((nid = OBJ_obj2nid(asn1Name)) > 0);
|
||||
printf("nid=%d\n", nid);
|
||||
//ASN1_OBJECT_free(asn1Name);
|
||||
}
|
||||
BIO_free(bio);
|
||||
X509_free(x509);
|
||||
XFCLOSE(fp);
|
||||
ASN1_OBJECT_free(asn1Name);
|
||||
}
|
||||
|
||||
for (i = 0; p12_f[i] != NULL; i++)
|
||||
{
|
||||
AssertTrue((fp = XFOPEN(p12_f[i], "r")) != XBADFILE);
|
||||
AssertNotNull(p12 = d2i_PKCS12_fp(fp, NULL));
|
||||
XFCLOSE(fp);
|
||||
AssertTrue((boolRet = PKCS12_parse(p12, "wolfSSL test", &pkey, &x509, NULL)) > 0);
|
||||
AssertNotNull((x509Name = X509_get_issuer_name(x509)) != NULL);
|
||||
AssertIntNE((numNames = X509_NAME_entry_count(x509Name)), 0);
|
||||
@@ -18585,12 +18584,10 @@ static void test_wolfSSL_OBJ(void)
|
||||
AssertNotNull(x509NameEntry = X509_NAME_get_entry(x509Name, j));
|
||||
AssertNotNull(asn1Name = X509_NAME_ENTRY_get_object(x509NameEntry));
|
||||
AssertTrue((nid = OBJ_obj2nid(asn1Name)) > 0);
|
||||
printf("nid=%d\n", nid);
|
||||
//ASN1_OBJECT_free(asn1Name);
|
||||
}
|
||||
BIO_free(bio);
|
||||
X509_free(x509);
|
||||
XFCLOSE(fp);
|
||||
ASN1_OBJECT_free(asn1Name);
|
||||
}
|
||||
|
||||
printf(resultFmt, passed);
|
||||
@@ -19262,7 +19259,7 @@ static void test_wolfSSL_RSA_DER(void)
|
||||
AssertIntEQ(i2d_RSAPublicKey(rsa, &buff), pub[i].sz);
|
||||
AssertNotNull(buff);
|
||||
AssertIntEQ(0, memcmp((void *)buff, (void *)pub[i].der, pub[i].sz));
|
||||
free((void *)buff);
|
||||
XFREE((void *)buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
RSA_free(rsa);
|
||||
}
|
||||
|
||||
|
@@ -220,6 +220,8 @@ struct WOLFSSL_ASN1_OBJECT {
|
||||
int nid;
|
||||
unsigned int objSz;
|
||||
unsigned char dynamic; /* if 1 then obj was dynamiclly created, 0 otherwise */
|
||||
#define WOLFSSL_ASN1_DYNAMIC 0x1
|
||||
#define WOLFSSL_ASN1_DYNAMIC_DATA 0x2
|
||||
struct d { /* derefrenced */
|
||||
WOLFSSL_ASN1_STRING ia5_internal;
|
||||
WOLFSSL_ASN1_STRING* ia5; /* points to ia5_internal */
|
||||
|
Reference in New Issue
Block a user