]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
global: Use mail_user_deinit() wherever possible
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 26 Jul 2019 07:31:12 +0000 (10:31 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Sat, 31 Aug 2019 12:49:24 +0000 (12:49 +0000)
This makes sure that the user is fully deinitialized in the places where we
expect it to be.

This mainly makes sure that lmtp won't continue running code for the user
after lmtp has already switched to running as root. That could then end up
reading/writing files as root. This can happen only if there are bugs in
the code that leaks user references. Normally user is supposed to be fully
unreferenced before switching to root, so this change just adds an assert
to make sure it is.

24 files changed:
src/doveadm/doveadm-auth-server.c
src/doveadm/doveadm-auth.c
src/doveadm/doveadm-dsync.c
src/doveadm/doveadm-mail-copymove.c
src/doveadm/doveadm-mail-import.c
src/doveadm/doveadm-mail.c
src/imap-urlauth/imap-urlauth-worker.c
src/imap/imap-client.c
src/imap/main.c
src/indexer/master-connection.c
src/lda/main.c
src/lib-storage/index/shared/shared-storage.c
src/lib-storage/mail-storage-service.c
src/lib-storage/test-mail-storage.c
src/lmtp/lmtp-client.c
src/lmtp/lmtp-local.c
src/plugins/mail-crypt/doveadm-mail-crypt.c
src/plugins/mail-crypt/mail-crypt-acl-plugin.c
src/plugins/mail-crypt/test-mail-key.c
src/plugins/quota/quota-status.c
src/pop3/main.c
src/pop3/pop3-client.c
src/submission/main.c
src/submission/submission-client.c

index 94ad89b1b7be97e8816582dc2d751d2f85c37ab4..462c8e47adfbb5203569db0e02e8db90b392ffd5 100644 (file)
@@ -367,7 +367,7 @@ cmd_user_mail_input(struct mail_storage_service_ctx *storage_service,
 
        }
 
-       mail_user_unref(&user);
+       mail_user_deinit(&user);
        mail_storage_service_user_unref(&service_user);
        pool_unref(&pool);
        return 1;
index 3a571a84b0349d88748540105f84a468244d7830..e7406ae8929e70d7f342c84214f9276befe936e9 100644 (file)
@@ -600,7 +600,7 @@ cmd_user_mail_input(struct mail_storage_service_ctx *storage_service,
                }
        }
 
-       mail_user_unref(&user);
+       mail_user_deinit(&user);
        mail_storage_service_user_unref(&service_user);
        pool_unref(&pool);
        return 1;
index beb164bd06aaa6d68200c2fdfdadb0148dff0607..8055a2975303fdaf75997b623e3db1415850910c 100644 (file)
@@ -391,7 +391,7 @@ cmd_dsync_run_local(struct dsync_cmd_context *ctx, struct mail_user *user,
                        "virtual mailbox hierarchy separator "
                        "(specify separator for the default namespace)");
                ctx->ctx.exit_code = EX_CONFIG;
-               mail_user_unref(&user2);
+               mail_user_deinit(&user2);
                return -1;
        }
        if (paths_are_equal(user, user2, MAILBOX_LIST_PATH_TYPE_MAILBOX) &&
@@ -401,7 +401,7 @@ cmd_dsync_run_local(struct dsync_cmd_context *ctx, struct mail_user *user,
                        mailbox_list_get_root_forced(user->namespaces->list,
                                                     MAILBOX_LIST_PATH_TYPE_MAILBOX));
                ctx->ctx.exit_code = EX_CONFIG;
-               mail_user_unref(&user2);
+               mail_user_deinit(&user2);
                return -1;
        }
 
index 55e7d062ee2892fd4e95026a757f159f44ec1fac..2485463df4e3a5fdef5d4aa0b999b9cc183b0d9a 100644 (file)
@@ -170,7 +170,7 @@ static void cmd_copy_deinit(struct doveadm_mail_cmd_context *_ctx)
 
        if (ctx->source_user != NULL) {
                mail_storage_service_user_unref(&ctx->source_service_user);
-               mail_user_unref(&ctx->source_user);
+               mail_user_deinit(&ctx->source_user);
        }
 }
 
index fff06b09baab23a27d5a3edd9b5b496e54d257a8..fc85202d81f4708c33ea4119405cbb2085047999 100644 (file)
@@ -224,7 +224,7 @@ static void cmd_import_deinit(struct doveadm_mail_cmd_context *_ctx)
        struct import_cmd_context *ctx = (struct import_cmd_context *)_ctx;
 
        if (ctx->src_user != NULL)
-               mail_user_unref(&ctx->src_user);
+               mail_user_deinit(&ctx->src_user);
 }
 
 static bool cmd_import_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
index d59b74c1300914b2e4416667c7925343335005e0..2525087e0cb4f3434787d9cbda49cbe960f6faa5 100644 (file)
@@ -462,7 +462,7 @@ doveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
        if (ctx->v.run(ctx, ctx->cur_mail_user) < 0) {
                i_assert(ctx->exit_code != 0);
        }
-       mail_user_unref(&ctx->cur_mail_user);
+       mail_user_deinit(&ctx->cur_mail_user);
        mail_storage_service_user_unref(&ctx->cur_service_user);
        return 1;
 }
index 7746aff8eba46d4c821ac09f65f414b10db667ff..1c505b016c682dbe2c693c1794091a823e19eb20 100644 (file)
@@ -237,7 +237,7 @@ static void client_destroy(struct client *client)
                imap_urlauth_deinit(&client->urlauth_ctx);
 
        if (client->mail_user != NULL)
-               mail_user_unref(&client->mail_user);
+               mail_user_deinit(&client->mail_user);
 
        io_remove(&client->io);
        io_remove(&client->ctrl_io);
index 168e9cdc27a1241e69550cd976493e35754d6cb1..3ad64a63f6a9fb22ea54ed838394e84c4c06023b 100644 (file)
@@ -498,7 +498,7 @@ static void client_default_destroy(struct client *client, const char *reason)
                client->autoexpunged_count = mail_user_autoexpunge(client->user);
                client_log_disconnect(client, reason);
        }
-       mail_user_unref(&client->user);
+       mail_user_deinit(&client->user);
 
        /* free the i/ostreams after mail_user_unref(), which could trigger
           mail_storage_callbacks notifications that write to the ostream. */
index 6b43de1ce9a99e06d2bafcf464bdc3cf70317b0f..6f6b7d9e9704fe66b0c5ac8542cd199afa2cb656 100644 (file)
@@ -275,7 +275,7 @@ int client_create_from_input(const struct mail_storage_service_input *input,
                                mail_user->pool, mail_user_var_expand_table(mail_user),
                                &errstr) <= 0) {
                *error_r = t_strdup_printf("Failed to expand settings: %s", errstr);
-               mail_user_unref(&mail_user);
+               mail_user_deinit(&mail_user);
                mail_storage_service_user_unref(&user);
                event_unref(&event);
                return -1;
index a08ce0897b136833b349eb838808bb4d7a95d27c..039ab34fe053323fd9011b6901364de43366d0da 100644 (file)
@@ -249,7 +249,7 @@ master_connection_input_line(struct master_connection *conn, const char *line)
                /* refresh proctitle before a potentially long-running
                   user unref */
                indexer_worker_refresh_proctitle(user->username, "(deinit)", 0, 0);
-               mail_user_unref(&user);
+               mail_user_deinit(&user);
                mail_storage_service_user_unref(&service_user);
                indexer_worker_refresh_proctitle(NULL, NULL, 0, 0);
        }
index 3cd6b460050b9e285addb337b042decde6a2efff..63392443c04320b48fb0f8c2124290061e3029d7 100644 (file)
@@ -568,7 +568,7 @@ int main(int argc, char *argv[])
                mailbox_transaction_rollback(&t);
                mailbox_free(&box);
 
-               mail_user_unref(&dinput.rcpt_user);
+               mail_user_deinit(&dinput.rcpt_user);
                mail_storage_service_user_unref(&service_user);
        }
 
index a7168f5b4c0ea910ddc607765eecea56e93c24cd..0814eb5d8eaaeacdbef0768babd0a0cee0c39b71 100644 (file)
@@ -260,7 +260,7 @@ int shared_storage_get_namespace(struct mail_namespace **_ns,
                        mailbox_list_set_critical(list,
                                "Couldn't create namespace '%s' for user %s: %s",
                                ns->prefix, userdomain, error);
-                       mail_user_unref(&owner);
+                       mail_user_deinit(&owner);
                        return -1;
                }
                ret = 0;
@@ -272,7 +272,7 @@ int shared_storage_get_namespace(struct mail_namespace **_ns,
                        mailbox_list_set_critical(list, "Namespace '%s': "
                                "Could not lookup home for user %s",
                                ns->prefix, userdomain);
-                       mail_user_unref(&owner);
+                       mail_user_deinit(&owner);
                        return -1;
                }
        }
index e7f948086f6963b3b83534078fc1eecfb99a0140..41648a7e4a87131e8b03e579ca9f4889a43e4104 100644 (file)
@@ -760,7 +760,7 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx,
        }
        if ((user->flags & MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES) == 0) {
                if (mail_namespaces_init(mail_user, error_r) < 0) {
-                       mail_user_unref(&mail_user);
+                       mail_user_deinit(&mail_user);
                        return -1;
                }
        }
index c75735e6a26a7de0c25ca0d57c77fbde6cae4703..05acd79f1fe4bba78456fbfccc33866688b76959 100644 (file)
@@ -319,7 +319,7 @@ static int test_mail_init_user(const char *user, const char *driver,
 #define test_mail_init_maildir_user(user) test_mail_init_user(user,"maildir","",NULL)
 static void test_mail_deinit_user(struct test_mail_storage_ctx *ctx)
 {
-       mail_user_unref(&ctx->user);
+       mail_user_deinit(&ctx->user);
        mail_storage_service_user_unref(&ctx->service_user);
 }
 
index 93ba3b3df36aa1cfaaee1604217c98b2930c8902..972dcc64fa6e19130675627c04b54a7f009b2859 100644 (file)
@@ -244,7 +244,7 @@ client_default_destroy(struct client *client, const char *enh_code,
        DLLIST_REMOVE(&clients, client);
 
        if (client->raw_mail_user != NULL)
-               mail_user_unref(&client->raw_mail_user);
+               mail_user_deinit(&client->raw_mail_user);
 
        client_state_reset(client);
        event_unref(&client->event);
index 4fdf1c641beef84773f9b74afaea5e6017a977ba..1bd161835ae8bd6a66fb92eddf8824f310fba558 100644 (file)
@@ -207,7 +207,7 @@ lmtp_local_rcpt_check_quota(struct lmtp_local_recipient *llrcpt)
                        ret = -1;
                }
                mailbox_free(&box);
-               mail_user_unref(&user);
+               mail_user_deinit(&user);
        }
 
        if (ret < 0 && !smtp_server_recipient_is_replied(rcpt)) {
@@ -666,7 +666,7 @@ lmtp_local_deliver_to_rcpts(struct lmtp_local *local,
                    (ret != 0 && local->rcpt_user != NULL)) {
                        if (i == (count - 1))
                                mail_user_autoexpunge(local->rcpt_user);
-                       mail_user_unref(&local->rcpt_user);
+                       mail_user_deinit(&local->rcpt_user);
                } else if (ret == 0) {
                        /* use the first saved message to save it elsewhere too.
                           this might allow hard linking the files.
@@ -752,7 +752,7 @@ void lmtp_local_data(struct client *client,
                mailbox_transaction_rollback(&trans);
                mailbox_free(&box);
                mail_user_autoexpunge(user);
-               mail_user_unref(&user);
+               mail_user_deinit(&user);
        }
 
        if (old_uid == 0) {
index d095daf3991925b19cadaf9729dbca969cd9ddf7..8c75a5e870be209cba1bff9bdcf4d58267c66ca4 100644 (file)
@@ -157,7 +157,7 @@ mcp_update_shared_key(struct mailbox_transaction_context *t,
        mail_storage_service_io_deactivate_user(user->_service_user);
        mail_storage_service_io_activate_user(dest_service_user);
 
-       mail_user_unref(&dest_user);
+       mail_user_deinit(&dest_user);
        mail_storage_service_user_unref(&dest_service_user);
 
        if ((cur_ioloop_ctx = io_loop_get_current_context(current_ioloop)) != NULL)
index ec56de01ea1ee814f9d9370e36b94d0fbd14c1f8..e68b9f22386ab6e0817f5e885a1897b10b6b91e0 100644 (file)
@@ -319,7 +319,7 @@ static int mail_crypt_acl_object_update(struct acl_object *aclobj,
                );
                mail_storage_service_io_activate_user(dest_service_user);
 
-               mail_user_unref(&dest_user);
+               mail_user_deinit(&dest_user);
                mail_storage_service_user_unref(&dest_service_user);
 
                if ((cur_ioloop_ctx = io_loop_get_current_context(current_ioloop)) != NULL)
index c4b73fdb15ebdf83fd1b8a3d0204702cc2e84f84..8a8711f48bbf0df01fdd65fe68eed0a1c56efd4b 100644 (file)
@@ -187,7 +187,7 @@ static
 void deinit_test_mail_user()
 {
        const char *error;
-       mail_user_unref(&test_mail_user);
+       mail_user_deinit(&test_mail_user);
        mail_storage_service_user_unref(&test_service_user);
        mail_storage_service_deinit(&mail_storage_service);
        if (unlink_directory(mail_home, UNLINK_DIRECTORY_FLAG_RMDIR,
index 3eb1c61e0be5ac0b6d000f78b2376dbc55337c11..8dcb8f48c681a09963f924d4584d5070d69791b1 100644 (file)
@@ -133,7 +133,7 @@ static void client_handle_request(struct quota_client *client)
                        break;
                }
                value = t_strdup(value); /* user's pool is being freed */
-               mail_user_unref(&user);
+               mail_user_deinit(&user);
                mail_storage_service_user_unref(&service_user);
        } else {
                i_error("Failed to lookup user %s: %s", input.username, error);
index 588ef77b947795e4ca83a176017a0d12d00d3575..9f00163072de9d4fc9706f1258edd3c057c8d8ad 100644 (file)
@@ -124,7 +124,7 @@ client_create_from_input(const struct mail_storage_service_input *input,
                                mail_user->pool, mail_user_var_expand_table(mail_user),
                                &errstr) <= 0) {
                *error_r = t_strdup_printf("Failed to expand settings: %s", errstr);
-               mail_user_unref(&mail_user);
+               mail_user_deinit(&mail_user);
                mail_storage_service_user_unref(&user);
                return -1;
        }
index 685fd621cffa7fc83bbf3183996f1d481e037198..1f8933ed4f4a7d77a2dbfc63afb68354f7a487da 100644 (file)
@@ -631,7 +631,7 @@ static void client_default_destroy(struct client *client, const char *reason)
           as an active POP3 session for the user. */
        pop3_refresh_proctitle();
        mail_user_autoexpunge(client->user);
-       mail_user_unref(&client->user);
+       mail_user_deinit(&client->user);
        mail_storage_service_user_unref(&client->service_user);
 
        pop3_client_count--;
index 93ed82ef95df9afd6de1428dff7154967eb3402f..36ef9e0e68edfe56ed8947652c9ca276e3125ff5 100644 (file)
@@ -137,7 +137,7 @@ client_create_from_input(const struct mail_storage_service_input *input,
                *error_r = t_strdup_printf("Failed to expand settings: %s", errstr);
                send_error(fd_out, set->hostname,
                        "4.3.5", MAIL_ERRSTR_CRITICAL_MSG);
-               mail_user_unref(&mail_user);
+               mail_user_deinit(&mail_user);
                mail_storage_service_user_unref(&user);
                return -1;
        }
@@ -148,7 +148,7 @@ client_create_from_input(const struct mail_storage_service_input *input,
                        "(submission_relay_host is unset)";
                send_error(fd_out, set->hostname,
                        "4.3.5", MAIL_ERRSTR_CRITICAL_MSG);
-               mail_user_unref(&mail_user);
+               mail_user_deinit(&mail_user);
                mail_storage_service_user_unref(&user);
                return -1;
        }
index 4c7537f96465a791e5f3b8b94b7244aaf86ea81f..ed378131b494b15072b54689160350ef13395478 100644 (file)
@@ -327,7 +327,7 @@ client_default_destroy(struct client *client, const char *prefix,
        if (client->urlauth_ctx != NULL)
                imap_urlauth_deinit(&client->urlauth_ctx);
 
-       mail_user_unref(&client->user);
+       mail_user_deinit(&client->user);
        mail_storage_service_user_unref(&client->service_user);
 
        client_state_reset(client);