OBJ_obj2nid memory leak

This commit is contained in:
Takashi Kojo
2018-07-21 10:08:17 +09:00
committed by Go Hosohara
parent 2669b80943
commit 7d2a03f8c9
3 changed files with 30 additions and 24 deletions

View File

@@ -15499,14 +15499,14 @@ void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
return; return;
} }
if (obj->dynamic == 1) { if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
if (obj->obj != NULL) { WOLFSSL_MSG("Freeing ASN1 data");
WOLFSSL_MSG("Freeing ASN1 OBJECT data"); XFREE(obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
XFREE(obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
}
} }
if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
XFREE(obj, NULL, DYNAMIC_TYPE_ASN1); 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){ if ((ret = wc_RsaKeyToPublicDer((RsaKey *)rsa->internal, der, derLen)) < 0){
WOLFSSL_MSG("RsaKeyToPublicDer failed"); WOLFSSL_MSG("RsaKeyToPublicDer failed");
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); if(der != NULL)
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return ret; return ret;
} }
if((pp != NULL) && (ret >= 0)) if((pp != NULL) && (ret >= 0))
@@ -30180,10 +30181,13 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct"); WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
return NULL; return NULL;
} }
obj->dynamic = WOLFSSL_ASN1_DYNAMIC;
} else {
obj->dynamic = 0;
} }
obj->type = id; obj->type = id;
obj->grp = type; obj->grp = type;
obj->dynamic = 1;
XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName)); XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
objBuf[0] = ASN_OBJECT_ID; objSz++; objBuf[0] = ASN_OBJECT_ID; objSz++;
@@ -30191,11 +30195,14 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
XMEMCPY(objBuf + objSz, oid, oidSz); XMEMCPY(objBuf + objSz, oid, oidSz);
objSz += oidSz; objSz += oidSz;
obj->objSz = objSz; obj->objSz = objSz;
if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) ||
obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1); (((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) == 0) && (obj->obj == NULL))) {
if (obj->obj == NULL) { obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
wolfSSL_ASN1_OBJECT_free(obj); if (obj->obj == NULL) {
return NULL; wolfSSL_ASN1_OBJECT_free(obj);
return NULL;
}
obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
} }
XMEMCPY(obj->obj, objBuf, obj->objSz); XMEMCPY(obj->obj, objBuf, obj->objSz);

View File

@@ -14989,7 +14989,7 @@ static void test_wc_PKCS7_EncodeSignedData_ex(void)
int certSz, keySz; int certSz, keySz;
fp = XFOPEN("./certs/client-ecc-cert.der", "rb"); fp = XFOPEN("./certs/client-ecc-cert.der", "rb");
AssertTrue(fp != BADFILE); AssertTrue(fp != XBADFILE);
certSz = XFREAD(cert, 1, sizeof_cliecc_cert_der_256, fp); certSz = XFREAD(cert, 1, sizeof_cliecc_cert_der_256, fp);
XFCLOSE(fp); XFCLOSE(fp);
@@ -18552,29 +18552,28 @@ static void test_wolfSSL_OBJ(void)
for (i = 0; f[i] != NULL; i++) for (i = 0; f[i] != NULL; i++)
{ {
printf("file=%s\n", f[i]);
AssertTrue((fp = XFOPEN(f[i], "r")) != XBADFILE); AssertTrue((fp = XFOPEN(f[i], "r")) != XBADFILE);
AssertNotNull(x509 = d2i_X509_fp(fp, NULL)); AssertNotNull(x509 = d2i_X509_fp(fp, NULL));
XFCLOSE(fp);
AssertNotNull(x509Name = X509_get_issuer_name(x509)); AssertNotNull(x509Name = X509_get_issuer_name(x509));
AssertIntNE((numNames = X509_NAME_entry_count(x509Name)), 0); AssertIntNE((numNames = X509_NAME_entry_count(x509Name)), 0);
AssertTrue((bio = BIO_new(BIO_s_mem())) != NULL); AssertTrue((bio = BIO_new(BIO_s_mem())) != NULL);
for (j = 0; j < numNames; j++) 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)); AssertNotNull(asn1Name = X509_NAME_ENTRY_get_object(x509NameEntry));
AssertTrue((nid = OBJ_obj2nid(asn1Name)) > 0); AssertTrue((nid = OBJ_obj2nid(asn1Name)) > 0);
printf("nid=%d\n", nid);
//ASN1_OBJECT_free(asn1Name);
} }
BIO_free(bio); BIO_free(bio);
X509_free(x509); X509_free(x509);
XFCLOSE(fp); ASN1_OBJECT_free(asn1Name);
} }
for (i = 0; p12_f[i] != NULL; i++) for (i = 0; p12_f[i] != NULL; i++)
{ {
AssertTrue((fp = XFOPEN(p12_f[i], "r")) != XBADFILE); AssertTrue((fp = XFOPEN(p12_f[i], "r")) != XBADFILE);
AssertNotNull(p12 = d2i_PKCS12_fp(fp, NULL)); AssertNotNull(p12 = d2i_PKCS12_fp(fp, NULL));
XFCLOSE(fp);
AssertTrue((boolRet = PKCS12_parse(p12, "wolfSSL test", &pkey, &x509, NULL)) > 0); AssertTrue((boolRet = PKCS12_parse(p12, "wolfSSL test", &pkey, &x509, NULL)) > 0);
AssertNotNull((x509Name = X509_get_issuer_name(x509)) != NULL); AssertNotNull((x509Name = X509_get_issuer_name(x509)) != NULL);
AssertIntNE((numNames = X509_NAME_entry_count(x509Name)), 0); 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(x509NameEntry = X509_NAME_get_entry(x509Name, j));
AssertNotNull(asn1Name = X509_NAME_ENTRY_get_object(x509NameEntry)); AssertNotNull(asn1Name = X509_NAME_ENTRY_get_object(x509NameEntry));
AssertTrue((nid = OBJ_obj2nid(asn1Name)) > 0); AssertTrue((nid = OBJ_obj2nid(asn1Name)) > 0);
printf("nid=%d\n", nid);
//ASN1_OBJECT_free(asn1Name);
} }
BIO_free(bio); BIO_free(bio);
X509_free(x509); X509_free(x509);
XFCLOSE(fp); ASN1_OBJECT_free(asn1Name);
} }
printf(resultFmt, passed); printf(resultFmt, passed);
@@ -19262,7 +19259,7 @@ static void test_wolfSSL_RSA_DER(void)
AssertIntEQ(i2d_RSAPublicKey(rsa, &buff), pub[i].sz); AssertIntEQ(i2d_RSAPublicKey(rsa, &buff), pub[i].sz);
AssertNotNull(buff); AssertNotNull(buff);
AssertIntEQ(0, memcmp((void *)buff, (void *)pub[i].der, pub[i].sz)); 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); RSA_free(rsa);
} }

View File

@@ -220,6 +220,8 @@ struct WOLFSSL_ASN1_OBJECT {
int nid; int nid;
unsigned int objSz; unsigned int objSz;
unsigned char dynamic; /* if 1 then obj was dynamiclly created, 0 otherwise */ 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 */ struct d { /* derefrenced */
WOLFSSL_ASN1_STRING ia5_internal; WOLFSSL_ASN1_STRING ia5_internal;
WOLFSSL_ASN1_STRING* ia5; /* points to ia5_internal */ WOLFSSL_ASN1_STRING* ia5; /* points to ia5_internal */