Fix memory leak during multi-message reception using STARTTLS
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 17 Feb 2018 16:53:27 +0000 (16:53 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 17 Feb 2018 16:53:27 +0000 (16:53 +0000)
Reported-by: Wolfgang Breyha
doc/doc-txt/ChangeLog
src/src/tls-gnu.c
src/src/tls-openssl.c

index 988c509bbef7646ea5d2df1314bac5641e16ed7d..c5a506c162460a9f6a2732de48c98dd78da6b789 100644 (file)
@@ -106,6 +106,10 @@ JH/19 Speed up macro lookups during configuration file read, by skipping non-
 JH/20 DANE support moved from Experimental to mainline.  The Makefile control
       for the build is renamed.
 
+JH/21 Fix memory leak during multi-message connections using STARTTLS.  A buffer
+      was allocated for every new TLS startup, meaning one per message.  Fix
+      by only allocating once (OpenSSL) or freeing on TLS-close (GnuTLS).
+
 
 Exim version 4.90
 -----------------
index dab96974ce8fc2c33dc9810299b1b2d8e707c51b..38e8eab09a3efc451a0579aa56dac61cd326846b 100644 (file)
@@ -2464,9 +2464,10 @@ gnutls_certificate_free_credentials(state->x509_cred);
 
 
 state->tlsp->active = -1;
+if (state->xfer_buffer) store_free(state->xfer_buffer);
 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
 
-if ((state_server.session == NULL) && (state_client.session == NULL))
+if (!state_server.session && !state_client.session)
   {
   gnutls_global_deinit();
   exim_gnutls_base_init_done = FALSE;
index 71d748f5c495fd31a033bf29c53835a184979dcb..7a6e8bfdf79c57809aa9dde9f0b966877e67d86b 100644 (file)
@@ -2095,7 +2095,7 @@ DEBUG(D_tls)
    smtp_read_response()/ip_recv().
    Hence no need to duplicate for _in and _out.
  */
-ssl_xfer_buffer = store_malloc(ssl_xfer_buffer_size);
+if (!ssl_xfer_buffer) ssl_xfer_buffer = store_malloc(ssl_xfer_buffer_size);
 ssl_xfer_buffer_lwm = ssl_xfer_buffer_hwm = 0;
 ssl_xfer_eof = ssl_xfer_error = 0;