]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mailbox_list_iter_next() - Fix memory allocation for special_use flags
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 11 Mar 2025 09:50:54 +0000 (11:50 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Mar 2025 13:01:57 +0000 (13:01 +0000)
It's not safe to store the string into data stack.

src/lib-storage/list/mailbox-list-iter.c
src/lib-storage/mailbox-list-private.h

index 966c1140c89ea3cab414c94874c53768003f4203..6d41dfedb99748e8ee83b73b1601582fdbfca352 100644 (file)
@@ -1025,9 +1025,13 @@ mailbox_list_iter_next_call(struct mailbox_list_iterate_context *ctx)
                        return NULL;
                }
                if (array_not_empty(&set->special_use)) {
+                       const char *flags =
+                               t_array_const_string_join(&set->special_use, " ");
                        ctx->specialuse_info = *info;
+                       i_free(ctx->specialuse_info_flags);
+                       ctx->specialuse_info_flags = i_strdup(flags);
                        ctx->specialuse_info.special_use =
-                               t_array_const_string_join(&set->special_use, " ");
+                               ctx->specialuse_info_flags;
                        info = &ctx->specialuse_info;
                }
                settings_free(set);
@@ -1101,6 +1105,7 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
                return -1;
        if (ctx->autocreate_ctx != NULL)
                hash_table_destroy(&ctx->autocreate_ctx->duplicate_vnames);
+       i_free(ctx->specialuse_info_flags);
        return ctx->list->v.iter_deinit(ctx);
 }
 
index 0e078cfe5025ce50b2b4344e81ac758c24347063..8316afeca7617dcb615761656d831ce418e32438 100644 (file)
@@ -166,6 +166,7 @@ struct mailbox_list_iterate_context {
        struct imap_match_glob *glob;
        struct mailbox_list_autocreate_iterate_context *autocreate_ctx;
        struct mailbox_info specialuse_info;
+       char *specialuse_info_flags;
 
        ARRAY(union mailbox_list_iterate_module_context *) module_contexts;
        HASH_TABLE(const char *, void*) found_mailboxes;