}
if (prov != NULL) {
- if (skey->skeymgmt->prov == prov)
+ if (skey->skeymgmt->prov == prov) {
skeymgmt = skey->skeymgmt;
- else
+ /* Balance the short-circuit free below */
+ if (!EVP_SKEYMGMT_up_ref(skeymgmt))
+ goto err;
+ } else {
skeymgmt = evp_skeymgmt_fetch_from_prov(prov, skey->skeymgmt->type_name,
propquery);
+ }
} else {
/* If no provider, get the default skeymgmt */
skeymgmt = EVP_SKEYMGMT_fetch(libctx, skey->skeymgmt->type_name,
ret->keydata = ctx.keydata;
+ /* Balance the local reference obtained earlier (fetch or alias up_ref) */
+ EVP_SKEYMGMT_free(skeymgmt);
+
return ret;
err: