]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Memory leak fixes.
authorTimo Sirainen <tss@iki.fi>
Fri, 15 May 2009 20:47:14 +0000 (16:47 -0400)
committerTimo Sirainen <tss@iki.fi>
Fri, 15 May 2009 20:47:14 +0000 (16:47 -0400)
--HG--
branch : HEAD

src/lib-master/master-service-settings.c
src/lib-master/master-service.c
src/lib-settings/settings-parser.c
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h
src/util/doveadm.c

index 421bc097c9d1f11d843a26a3d6f31c961e2f6dd8..eadae7eaecf4175db8224b4ebb15ff71f492e26b 100644 (file)
@@ -195,9 +195,10 @@ int master_service_settings_read(struct master_service *service,
                        return -1;
        }
 
-       if (service->set_pool != NULL)
+       if (service->set_pool != NULL) {
+               settings_parser_deinit(&service->set_parser);
                p_clear(service->set_pool);
-       else {
+       else {
                service->set_pool =
                        pool_alloconly_create("master service settings", 4096);
        }
index 4b88f1a66fc34a5378e74b9adeb754affeccde0e..993ac97574d549460967bfcf0dea1fa3714e37d8 100644 (file)
@@ -8,6 +8,7 @@
 #include "home-expand.h"
 #include "restrict-access.h"
 #include "fd-close-on-exec.h"
+#include "settings-parser.h"
 #include "syslog-util.h"
 #include "master-service-private.h"
 #include "master-service-settings.h"
@@ -436,6 +437,10 @@ void master_service_deinit(struct master_service **_service)
        if (array_is_created(&service->config_overrides))
                array_free(&service->config_overrides);
 
+       if (service->set_parser != NULL) {
+               settings_parser_deinit(&service->set_parser);
+               pool_unref(&service->set_pool);
+       }
        lib_signals_deinit();
        io_loop_destroy(&service->ioloop);
 
index 64b6cf1e07a4a31666d80c2fa1993b9947681a24..ce7ebc6f85cc4073fccd4899e9e14303785d8b81 100644 (file)
@@ -113,6 +113,7 @@ settings_parser_init_list(pool_t set_pool,
 
        i_assert(count > 0);
 
+       pool_ref(set_pool);
        parser_pool = pool_alloconly_create("settings parser", 8192);
        ctx = p_new(parser_pool, struct setting_parser_context, 1);
        ctx->set_pool = set_pool;
@@ -1095,6 +1096,7 @@ settings_parser_dup(struct setting_parser_context *old_ctx, pool_t new_pool)
        void *key, *value;
        unsigned int i;
 
+       pool_ref(new_pool);
        new_ctx = p_new(new_pool, struct setting_parser_context, 1);
        new_ctx->set_pool = new_pool;
        new_ctx->parser_pool = pool_alloconly_create("settings parser", 2048);
@@ -1134,5 +1136,6 @@ settings_parser_dup(struct setting_parser_context *old_ctx, pool_t new_pool)
                                  new_link);
        }
        hash_table_iterate_deinit(&iter);
+       hash_table_destroy(&links);
        return new_ctx;
 }
index a20a607c8688639b2443a46a7c29aad9f90d0dc0..44e97e3fff1f70698742ea37bea1038323862a08 100644 (file)
@@ -683,14 +683,25 @@ int mail_storage_service_multi_next(struct mail_storage_service_multi_ctx *ctx,
        return 0;
 }
 
+void mail_storage_service_multi_user_free(struct mail_storage_service_multi_user *user)
+{
+       settings_parser_deinit(&user->set_parser);
+}
+
+unsigned int
+mail_storage_service_multi_all_init(struct mail_storage_service_multi_ctx *ctx)
+{
+       if (ctx->auth_list != NULL)
+               (void)auth_master_user_list_deinit(&ctx->auth_list);
+       ctx->auth_list = auth_master_user_list_init(ctx->conn);
+       return auth_master_user_list_count(ctx->auth_list);
+}
+
 int mail_storage_service_multi_all_next(struct mail_storage_service_multi_ctx *ctx,
                                        const char **username_r)
 {
        i_assert((ctx->flags & MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP) != 0);
 
-       if (ctx->auth_list == NULL)
-               ctx->auth_list = auth_master_user_list_init(ctx->conn);
-
        *username_r = auth_master_user_list_next(ctx->auth_list);
        if (*username_r != NULL)
                return 1;
@@ -702,6 +713,8 @@ void mail_storage_service_multi_deinit(struct mail_storage_service_multi_ctx **_
        struct mail_storage_service_multi_ctx *ctx = *_ctx;
 
        *_ctx = NULL;
+       if (ctx->auth_list != NULL)
+               (void)auth_master_user_list_deinit(&ctx->auth_list);
        if (ctx->conn != NULL)
                auth_master_deinit(&ctx->conn);
        i_free(ctx);
index 7eba5d6c9f475e4e2a61c33de8bd46b4d53ac17c..aae91ef21722baf78802b2e827b79b0f96852593 100644 (file)
@@ -47,6 +47,10 @@ int mail_storage_service_multi_next(struct mail_storage_service_multi_ctx *ctx,
                                    struct mail_storage_service_multi_user *user,
                                    struct mail_user **mail_user_r,
                                    const char **error_r);
+void mail_storage_service_multi_user_free(struct mail_storage_service_multi_user *user);
+/* Initialize iterating through all users. Return the number of users. */
+unsigned int
+mail_storage_service_multi_all_init(struct mail_storage_service_multi_ctx *ctx);
 /* Iterate through all usernames. Returns 1 if username was returned, 0 if
    there are no more users, -1 if error. */
 int mail_storage_service_multi_all_next(struct mail_storage_service_multi_ctx *ctx,
index cc58d68264e8b5d8304d144f7142bc2bee347d20..82c5cd4f5fb1e5d0a1a3a9f9186953e65cc29602 100644 (file)
@@ -140,8 +140,10 @@ handle_next_user(struct mail_storage_service_multi_ctx *multi,
        if (mail_storage_service_multi_next(multi, multi_user,
                                            &mail_user, &error) < 0) {
                i_error("User init failed: %s", error);
+               mail_storage_service_multi_user_free(multi_user);
                return -1;
        }
+       mail_storage_service_multi_user_free(multi_user);
        handle_command(mail_user, argv[0], argv+1);
        mail_user_unref(&mail_user);
        return 0;
@@ -175,12 +177,6 @@ handle_all_users(struct master_service *service,
        
        user_idx = 0;
        while ((ret = mail_storage_service_multi_all_next(multi, &user)) > 0) {
-               if (killed_signo != 0) {
-                       /* killed by a signal */
-                       i_warning("Killed with signal %d", killed_signo);
-                       ret = -1;
-                       break;
-               }
                p_clear(pool);
                input.username = user;
                T_BEGIN {
@@ -194,6 +190,11 @@ handle_all_users(struct master_service *service,
                                fflush(stdout);
                        }
                }
+               if (killed_signo != 0) {
+                       i_warning("Killed with signal %d", killed_signo);
+                       ret = -1;
+                       break;
+               }
        }
        if ((service_flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0)
                printf("\n");
@@ -201,6 +202,7 @@ handle_all_users(struct master_service *service,
        if (ret < 0)
                i_error("Failed to iterate through some users");
        mail_storage_service_multi_deinit(&multi);
+       pool_unref(&pool);
 }
 
 int main(int argc, char *argv[])