mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-24 12:04:40 +00:00
Stop copying CA certificates on Mbed TLS
get_ca_certs() handed out heap copies of the context's CA certificates, but free_cert() frees nothing on Mbed TLS, so every copy leaked. Hand out the context's own certificates instead, as get_peer_certs() does the session's, and say on the declaration that they last only as long as the context's CA certificates stay as they are. This showed up on every redirect from a client given a store with set_ca_cert_store(), which passes the store on through these certificates.
This commit is contained in:
1 parent
43c9c6ddf3
commit
9a3c1febee
1 file changed
+9
-17
@@ -5257,6 +5257,8 @@ const char *get_sni(const_session_t session);
|
|||||||
ca_store_t create_ca_store(const char *pem, size_t len);
|
ca_store_t create_ca_store(const char *pem, size_t len);
|
||||||
void free_ca_store(ca_store_t store);
|
void free_ca_store(ca_store_t store);
|
||||||
bool set_ca_store(ctx_t ctx, ca_store_t store);
|
bool set_ca_store(ctx_t ctx, ca_store_t store);
|
||||||
|
// Free each with free_cert(), and do not use them once the context's CA
|
||||||
|
// certificates change.
|
||||||
size_t get_ca_certs(ctx_t ctx, std::vector<cert_t> &certs);
|
size_t get_ca_certs(ctx_t ctx, std::vector<cert_t> &certs);
|
||||||
std::vector<std::string> get_ca_names(ctx_t ctx);
|
std::vector<std::string> get_ca_names(ctx_t ctx);
|
||||||
|
|
||||||
@@ -21432,9 +21434,9 @@ inline size_t get_peer_certs(const_session_t session,
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void free_cert(cert_t cert) {
|
inline void free_cert(cert_t cert) {
|
||||||
// Mbed TLS: peer certificate is owned by the SSL context.
|
// Mbed TLS: every cert_t handed out points into a session's or a context's
|
||||||
// No-op here, but callers should still call this for cross-backend
|
// chain, so there is nothing to free. Callers still call this for the other
|
||||||
// portability.
|
// backends.
|
||||||
(void)cert;
|
(void)cert;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21739,20 +21741,10 @@ inline size_t get_ca_certs(ctx_t ctx, std::vector<cert_t> &certs) {
|
|||||||
if (!ctx) { return 0; }
|
if (!ctx) { return 0; }
|
||||||
auto *mbed_ctx = static_cast<impl::MbedTlsContext *>(ctx);
|
auto *mbed_ctx = static_cast<impl::MbedTlsContext *>(ctx);
|
||||||
|
|
||||||
// Iterate through the CA chain
|
// Owned by the context; see free_cert()
|
||||||
mbedtls_x509_crt *cert = &mbed_ctx->ca_chain;
|
for (auto cert = &mbed_ctx->ca_chain; cert && cert->raw.len > 0;
|
||||||
while (cert != nullptr && cert->raw.len > 0) {
|
cert = cert->next) {
|
||||||
// Create a copy of the certificate for the caller
|
certs.push_back(static_cast<cert_t>(cert));
|
||||||
auto *copy = new mbedtls_x509_crt;
|
|
||||||
mbedtls_x509_crt_init(copy);
|
|
||||||
int ret = mbedtls_x509_crt_parse_der(copy, cert->raw.p, cert->raw.len);
|
|
||||||
if (ret == 0) {
|
|
||||||
certs.push_back(static_cast<cert_t>(copy));
|
|
||||||
} else {
|
|
||||||
mbedtls_x509_crt_free(copy);
|
|
||||||
delete copy;
|
|
||||||
}
|
|
||||||
cert = cert->next;
|
|
||||||
}
|
}
|
||||||
return certs.size();
|
return certs.size();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user