]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login-common: Free settings if reload fails
authorAki Tuomi <aki.tuomi@open-xchange.com>
Tue, 14 May 2024 09:37:11 +0000 (12:37 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:01 +0000 (10:40 +0200)
src/login-common/client-common.c

index 0320f619021ba2099ff963086ca76637027514b3..a115eb1632a9a052aba09229e0da2e8173fddaeb 100644 (file)
@@ -197,6 +197,13 @@ static bool client_is_trusted(struct client *client)
        return FALSE;
 }
 
+static void client_settings_free(struct client *client)
+{
+       settings_free(client->set);
+       settings_free(client->ssl_set);
+       settings_free(client->ssl_server_set);
+}
+
 static int client_settings_get(struct client *client, const char **error_r)
 {
        i_assert(client->set == NULL);
@@ -207,8 +214,7 @@ static int client_settings_get(struct client *client, const char **error_r)
                         0, &client->ssl_set, error_r) < 0 ||
            settings_get(client->event, &ssl_server_setting_parser_info,
                         0, &client->ssl_server_set, error_r) < 0) {
-               settings_free(client->set);
-               settings_free(client->ssl_set);
+               client_settings_free(client);
                return -1;
        }
        return 0;
@@ -532,13 +538,6 @@ void client_ref(struct client *client)
        client->refcount++;
 }
 
-static void client_settings_free(struct client *client)
-{
-       settings_free(client->set);
-       settings_free(client->ssl_set);
-       settings_free(client->ssl_server_set);
-}
-
 bool client_unref(struct client **_client)
 {
        struct client *client = *_client;
@@ -684,6 +683,9 @@ int client_sni_callback(const char *name, const char **error_r,
        if (client_settings_get(client, error_r) < 0 ||
            (client->v.reload_config != NULL &&
             client->v.reload_config(client, error_r) < 0)) {
+               /* make sure settings are free'd if reload_config
+                  callback fails. */
+               client_settings_free(client);
                client->set = old_set;
                client->ssl_set = old_ssl_set;
                client->ssl_server_set = old_ssl_server_set;