From c99fe55d4535d839a6ad0735c4719e076a1adb2c Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 15 May 2009 16:47:14 -0400 Subject: [PATCH] Memory leak fixes. --HG-- branch : HEAD --- src/lib-master/master-service-settings.c | 5 +++-- src/lib-master/master-service.c | 5 +++++ src/lib-settings/settings-parser.c | 3 +++ src/lib-storage/mail-storage-service.c | 19 ++++++++++++++++--- src/lib-storage/mail-storage-service.h | 4 ++++ src/util/doveadm.c | 14 ++++++++------ 6 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 421bc097c9..eadae7eaec 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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); } diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 4b88f1a66f..993ac97574 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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); diff --git a/src/lib-settings/settings-parser.c b/src/lib-settings/settings-parser.c index 64b6cf1e07..ce7ebc6f85 100644 --- a/src/lib-settings/settings-parser.c +++ b/src/lib-settings/settings-parser.c @@ -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; } diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index a20a607c86..44e97e3fff 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -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); diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index 7eba5d6c9f..aae91ef217 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -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, diff --git a/src/util/doveadm.c b/src/util/doveadm.c index cc58d68264..82c5cd4f5f 100644 --- a/src/util/doveadm.c +++ b/src/util/doveadm.c @@ -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[]) -- 2.47.3