diff options
author | Ladar Levison <ladar@lavabit.com> | 2019-02-27 19:31:27 +0300 |
---|---|---|
committer | Ladar Levison <ladar@lavabit.com> | 2019-02-27 19:31:27 +0300 |
commit | fa8b97cd64ff39032789c39c98b25ec65cbfbeff (patch) | |
tree | 09711ca4d97ed57349544cafc9017bec60d712ce | |
parent | fb424172aa88d474bc6ce33eea688ddec1e84759 (diff) |
Fix SMTP bypass list leaking memory at shutdown.
-rw-r--r-- | src/engine/config/global/global.c | 3 | ||||
-rw-r--r-- | src/servers/smtp/checkers.c | 17 | ||||
-rw-r--r-- | src/servers/smtp/smtp.h | 11 |
3 files changed, 24 insertions, 7 deletions
diff --git a/src/engine/config/global/global.c b/src/engine/config/global/global.c index d89ffb8a..266d96f6 100644 --- a/src/engine/config/global/global.c +++ b/src/engine/config/global/global.c @@ -63,6 +63,7 @@ void config_free(void) { cache_free(); relay_free(); servers_free(); + smtp_bypass_free(); return; } @@ -554,7 +555,7 @@ bool_t config_value_set(magma_keys_t *setting, stringer_t *value) { return true; } - if (!smtp_add_bypass_entry(value)) { + if (!smtp_bypass_add(value)) { log_critical("Unable to add smtp bypass entry { entry = %s }", st_char_get(value)); return false; } diff --git a/src/servers/smtp/checkers.c b/src/servers/smtp/checkers.c index 13cf1a43..a008d17c 100644 --- a/src/servers/smtp/checkers.c +++ b/src/servers/smtp/checkers.c @@ -246,7 +246,7 @@ int_t smtp_check_filters(smtp_inbound_prefs_t *prefs, stringer_t **local) { * @param subnet a pointer to a managed string containing the IP address or subnet address to be bypassed for checks. * @return true if the entry was valid and was added, or false on failure. */ -bool_t smtp_add_bypass_entry(stringer_t *subnet) { +bool_t smtp_bypass_add(stringer_t *subnet) { subnet_t *sn; multi_t key; @@ -280,6 +280,21 @@ bool_t smtp_add_bypass_entry(stringer_t *subnet) { return true; } + + +/** + * @brief Free the SMTP bypass list at shutdown. + * @return This function returns no value. + */ +void smtp_bypass_free(void) { + + if (magma.smtp.bypass_subnets) { + inx_free(magma.smtp.bypass_subnets); + magma.smtp.bypass_subnets = NULL; + } + +} + /** * @brief Check if a connection should bypass certain SMTP checks. * @note This check is run against host and/or subnet masks configured in the magma.smtp.bypass_addr option. diff --git a/src/servers/smtp/smtp.h b/src/servers/smtp/smtp.h index 34ea0f9a..aeaba8d2 100644 --- a/src/servers/smtp/smtp.h +++ b/src/servers/smtp/smtp.h @@ -15,11 +15,12 @@ int_t smtp_store_message(smtp_inbound_prefs_t *prefs, stringer_t **local); bool_t smtp_store_spamsig(smtp_inbound_prefs_t *prefs, int_t spam); /// checkers.c -int_t smtp_check_filters(smtp_inbound_prefs_t *prefs, stringer_t **local); -int_t smtp_check_greylist(connection_t *con, smtp_inbound_prefs_t *prefs); -int_t smtp_check_rbl(connection_t *con); -bool_t smtp_add_bypass_entry(stringer_t *subnet); -bool_t smtp_bypass_check(connection_t *con); +bool_t smtp_bypass_add(stringer_t *subnet); +bool_t smtp_bypass_check(connection_t *con); +void smtp_bypass_free(void); +int_t smtp_check_filters(smtp_inbound_prefs_t *prefs, stringer_t **local); +int_t smtp_check_greylist(connection_t *con, smtp_inbound_prefs_t *prefs); +int_t smtp_check_rbl(connection_t *con); /// commands.c void smtp_requeue(connection_t *con); |