Memory Leak Fix

1. In `wolfSSL_d2i_DHparams()`, when setting the internal key on a
   WOLFSSL_KEY, set the flag inSet.
2. Not a leak, but in `wolfSSL_EVP_PKEY_set1_DH()`, only allocate one
   buffer to store the flat key. Saves an alloc, memcpy, and free.
This commit is contained in:
John Safranek
2020-04-17 16:31:38 -07:00
parent 61f3783111
commit ccd096e1bb
2 changed files with 4 additions and 15 deletions

View File

@ -18539,6 +18539,7 @@ WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp,
wolfSSL_DH_free(newDH); wolfSSL_DH_free(newDH);
return NULL; return NULL;
} }
newDH->inSet = 1;
if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) { if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) {
WOLFSSL_MSG("SetDhExternal failed"); WOLFSSL_MSG("SetDhExternal failed");

View File

@ -5826,8 +5826,6 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
word32 derSz = 0; word32 derSz = 0;
byte* derBuf = NULL; byte* derBuf = NULL;
DhKey* dhkey = NULL; DhKey* dhkey = NULL;
mp_int pubKey;
mp_int privKey;
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH"); WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH");
@ -5849,11 +5847,8 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
dhkey = (DhKey*)key->internal; dhkey = (DhKey*)key->internal;
pubKey = dhkey->pub; havePublic = mp_unsigned_bin_size(&dhkey->pub) > 0;
privKey = dhkey->priv; havePrivate = mp_unsigned_bin_size(&dhkey->priv) > 0;
havePublic = mp_unsigned_bin_size(&pubKey) > 0;
havePrivate = mp_unsigned_bin_size(&privKey) > 0;
/* Get size of DER buffer only */ /* Get size of DER buffer only */
if (havePublic && !havePrivate) { if (havePublic && !havePrivate) {
@ -5891,15 +5886,8 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
} }
/* Store DH key into pkey (DER format) */ /* Store DH key into pkey (DER format) */
pkey->pkey.ptr = (char*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); pkey->pkey.ptr = (char*)derBuf;
if (pkey->pkey.ptr == NULL) {
WOLFSSL_MSG("key malloc failed");
XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
return WOLFSSL_FAILURE;
}
pkey->pkey_sz = derSz; pkey->pkey_sz = derSz;
XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
return WOLFSSL_SUCCESS; return WOLFSSL_SUCCESS;
} }