* ERR_FATAL in any fatal error case
* ERR_ALERT if the reason of the error is available in err
* ERR_WARN if a warning is available into err
+ * The caller is responsible of freeing the newly built or newly refcounted
+ * find_chain element.
* The value 0 means there is no error nor warning and
* the operation succeed.
*/
}
if (data->chain) {
- *find_chain = data->chain;
+ *find_chain = X509_chain_up_ref(data->chain);
} else {
/* Find Certificate Chain in global */
struct issuer_chain *issuer;
issuer = ssl_get0_issuer_chain(data->cert);
if (issuer)
- *find_chain = issuer->chain;
+ *find_chain = X509_chain_up_ref(issuer->chain);
}
if (!*find_chain) {
#else
{ /* legacy compat (< openssl 1.0.2) */
X509 *ca;
- STACK_OF(X509) *chain;
- chain = X509_chain_up_ref(*find_chain);
- while ((ca = sk_X509_shift(chain)))
+ while ((ca = sk_X509_shift(*find_chain)))
if (!SSL_CTX_add_extra_chain_cert(ctx, ca)) {
memprintf(err, "%sunable to load chain certificate into SSL Context '%s'.\n",
err && *err ? *err : "", path);
X509_free(ca);
- sk_X509_pop_free(chain, X509_free);
errcode |= ERR_ALERT | ERR_FATAL;
goto end;
}
#endif
end:
+ sk_X509_pop_free(find_chain, X509_free);
return errcode;
}
}
end:
+ sk_X509_pop_free(find_chain, X509_free);
return errcode;
}