Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/lavabit/magma.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLadar Levison <ladar@lavabit.com>2019-02-27 19:31:27 +0300
committerLadar Levison <ladar@lavabit.com>2019-02-27 19:31:27 +0300
commitfa8b97cd64ff39032789c39c98b25ec65cbfbeff (patch)
tree09711ca4d97ed57349544cafc9017bec60d712ce
parentfb424172aa88d474bc6ce33eea688ddec1e84759 (diff)
Fix SMTP bypass list leaking memory at shutdown.
-rw-r--r--src/engine/config/global/global.c3
-rw-r--r--src/servers/smtp/checkers.c17
-rw-r--r--src/servers/smtp/smtp.h11
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);