On Sun, Feb 12, 2017 at 01:42:02PM +0100, Matthias Andree wrote: > Am 12.02.2017 um 13:23 schrieb Matthias Andree: > > All this certificate handling apparently introduces memory leaks. I > > first tried to get a hold of them with clang's address sanitizer, which > > seems somehow handicapped on Ubuntu 16.04, but valgrind seems useful > > enough even if it hogs down performance even more. > > Got it. The attached patch plugs the leak. If you use > X509_STORE_add_cert(), it makes a copy of the certificate we are > offering it, so we need to X509_free it afterwards.
Excellent. Thanks for tracking that down - I should have looked more deeply to see if it was copying the cert or not. The PEM_read_X509() actually seems to be able to reuse the cert if we pass it as the second parameter: see check_certificate_by_digest(). Using that same logic, how about if fold this into the original patch instead: diff --git a/mutt_ssl.c b/mutt_ssl.c --- a/mutt_ssl.c +++ b/mutt_ssl.c @@ -90,43 +90,45 @@ * certs loaded into the trusted store. This function filters out expired * certs. * Previously the code used this form: * SSL_CTX_load_verify_locations (ssldata->ctx, SslCertFile, NULL); */ static int ssl_load_certificates (SSL_CTX *ctx) { FILE *fp; - X509 *cert; + X509 *cert = NULL; X509_STORE *store; char buf[STRING]; dprint (2, (debugfile, "ssl_load_certificates: loading trusted certificates\n")); store = SSL_CTX_get_cert_store (ctx); if (!store) { store = X509_STORE_new (); SSL_CTX_set_cert_store (ctx, store); } if ((fp = fopen (SslCertFile, "rt")) == NULL) return 0; - while ((cert = PEM_read_X509 (fp, NULL, NULL, NULL)) != NULL) + while ((cert = PEM_read_X509 (fp, &cert, NULL, NULL)) != NULL) { if ((X509_cmp_current_time (X509_get_notBefore (cert)) >= 0) || (X509_cmp_current_time (X509_get_notAfter (cert)) <= 0)) { dprint (2, (debugfile, "ssl_load_certificates: filtering expired cert: %s\n", X509_NAME_oneline (X509_get_subject_name (cert), buf, sizeof (buf)))); - X509_free (cert); } else + { X509_STORE_add_cert (store, cert); + } } + X509_free (cert); safe_fclose (&fp); return 1; } /* mutt_ssl_starttls: Negotiate TLS over an already opened connection. * TODO: Merge this code better with ssl_socket_open. */ int mutt_ssl_starttls (CONNECTION* conn) -- Kevin J. McCarthy GPG Fingerprint: 8975 A9B3 3AA3 7910 385C 5308 ADEF 7684 8031 6BDA
signature.asc
Description: PGP signature