Hello,

The following diffs plug two memory leaks in smtpd:

a- in lka_filter.c, the name of the filter chain for a session is strdup()-ed
upon session allocation but not released upon session release. free() it
in lka_filter_end().

b- in smtp_session.c, filter io channel should be released when a tx is over,
but it isn't. call io_free() on the channel in smtp_tx_free() if we do
have a channel ready.

Gilles


diff --git a/usr.sbin/smtpd/lka_filter.c b/usr.sbin/smtpd/lka_filter.c
index 9891e6140a3..6eb0829efca 100644
--- a/usr.sbin/smtpd/lka_filter.c
+++ b/usr.sbin/smtpd/lka_filter.c
@@ -535,6 +535,7 @@ lka_filter_end(uint64_t reqid)
        free(fs->mail_from);
        free(fs->username);
        free(fs->lastparam);
+       free(fs->filter_name);
        free(fs);
        log_trace(TRACE_FILTERS, "%016"PRIx64" filters session-end", reqid);
 }

diff --git a/usr.sbin/smtpd/smtp_session.c b/usr.sbin/smtpd/smtp_session.c
index 60123ad9a80..4530f44fb69 100644
--- a/usr.sbin/smtpd/smtp_session.c
+++ b/usr.sbin/smtpd/smtp_session.c
@@ -2438,6 +2438,11 @@ smtp_tx_free(struct smtp_tx *tx)
        if (tx->ofile)
                fclose(tx->ofile);
 
+       if (tx->filter) {
+               io_free(tx->filter);
+               tx->filter = NULL;
+       }
+
        tx->session->tx = NULL;
 
        free(tx);

Reply via email to