]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Panic if doveadm_print_init() is called too late
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 24 Feb 2023 14:22:28 +0000 (16:22 +0200)
committerMarco Bettini <marco.bettini@open-xchange.com>
Thu, 9 Mar 2023 12:32:39 +0000 (12:32 +0000)
Otherwise it's not noticed unless the doveadm command is called for multiple
users (-A, -F).

src/doveadm/doveadm-mail.c
src/doveadm/doveadm-print.c
src/doveadm/doveadm-print.h

index 42fcc00b58b752029fb66b35b505c9e1fb4d1fb9..82a07012f4553ecff97a710cb0014898116e2356 100644 (file)
@@ -626,6 +626,11 @@ doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
                ctx->v.get_next_user = doveadm_mail_cmd_get_next_user;
        if (ctx->v.deinit == NULL)
                ctx->v.deinit = doveadm_mail_cmd_deinit_noop;
+       if (!doveadm_print_is_initialized()) {
+               /* alloc() should call doveadm_print_init(). It's too late
+                  afterwards. */
+               doveadm_print_init_disallow(TRUE);
+       }
 
        p_array_init(&ctx->module_contexts, ctx->pool, 5);
        return ctx;
index 5feb3c9be1d810dae4ba6cfd492d65acb776fe1c..70e9ae11d2e9ea62d18d1b8bd14e10da230e340b 100644 (file)
@@ -25,6 +25,7 @@ bool doveadm_print_hide_titles = FALSE;
 struct ostream *doveadm_print_ostream = NULL;
 
 static struct doveadm_print_context *ctx;
+static bool doveadm_print_init_disallowed = FALSE;
 
 bool doveadm_print_is_initialized(void)
 {
@@ -163,6 +164,8 @@ void doveadm_print_init(const char *name)
                /* already forced the type */
                return;
        }
+       if (doveadm_print_init_disallowed)
+               i_panic("doveadm_print_init() is called in wrong place");
 
        pool = pool_alloconly_create("doveadm print", 1024);
        ctx = p_new(pool, struct doveadm_print_context, 1);
@@ -198,4 +201,11 @@ void doveadm_print_deinit(void)
                i_free(hdr->sticky_value);
        pool_unref(&ctx->pool);
        ctx = NULL;
+
+       doveadm_print_init_disallowed = FALSE;
+}
+
+void doveadm_print_init_disallow(bool disallow)
+{
+       doveadm_print_init_disallowed = disallow;
 }
index a907d9038d3919cc1a3c54e213108824d73d8205..7edbe73c0dea1b345e10c68f8adc22e23d1e9177 100644 (file)
@@ -44,6 +44,9 @@ void doveadm_print_flush(void);
 
 void doveadm_print_init(const char *name);
 void doveadm_print_deinit(void);
+/* Panic if doveadm_print_init() is attempted to be called. This is reset also
+   by doveadm_print_deinit(). */
+void doveadm_print_init_disallow(bool disallow);
 
 void doveadm_print_formatted_set_format(const char *format);