From: Timo Sirainen Date: Sat, 16 Mar 2024 10:42:45 +0000 (+0200) Subject: lib-fs: Fail if any extra fs { .. } named list filters are configured X-Git-Tag: 2.4.1~914 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e37250bb6cabf66b55f33001f1fda0bc0a35c9b5;p=thirdparty%2Fdovecot%2Fcore.git lib-fs: Fail if any extra fs { .. } named list filters are configured --- diff --git a/src/lib-fs/fs-api-private.h b/src/lib-fs/fs-api-private.h index edd92fcf6f..e00ebb267e 100644 --- a/src/lib-fs/fs-api-private.h +++ b/src/lib-fs/fs-api-private.h @@ -96,6 +96,7 @@ struct fs { /* Set only during initialization: */ const ARRAY_TYPE(const_string) *init_fs_list; unsigned int init_fs_list_idx; + unsigned int *init_fs_last_list_idx; char *username, *session_id; diff --git a/src/lib-fs/fs-api.c b/src/lib-fs/fs-api.c index 60b415e80c..844bd7b2e5 100644 --- a/src/lib-fs/fs-api.c +++ b/src/lib-fs/fs-api.c @@ -229,6 +229,7 @@ static int fs_init(struct event *event, const struct fs_parameters *params, const ARRAY_TYPE(const_string) *fs_list, unsigned int fs_list_idx, + unsigned int *init_fs_last_list_idx, struct fs **fs_r, const char **error_r) { const struct fs_settings *fs_set; @@ -255,6 +256,8 @@ static int fs_init(struct event *event, fs->init_fs_list = fs_list; fs->init_fs_list_idx = fs_list_idx; + fs->init_fs_last_list_idx = init_fs_last_list_idx; + *init_fs_last_list_idx = fs_list_idx; T_BEGIN { ret = fs->v.init(fs, params, &error); } T_END_PASS_STR_IF(ret < 0, &error); @@ -272,6 +275,8 @@ int fs_init_auto(struct event *event, const struct fs_parameters *params, struct fs **fs_r, const char **error_r) { const struct fs_settings *fs_set; + struct fs *fs; + unsigned int last_list_idx; int ret; if (settings_get(event, &fs_setting_parser_info, 0, @@ -283,9 +288,26 @@ int fs_init_auto(struct event *event, const struct fs_parameters *params, return 0; } - ret = fs_init(event, params, &fs_set->fs, 0, fs_r, error_r); + ret = fs_init(event, params, &fs_set->fs, 0, + &last_list_idx, &fs, error_r); + if (ret == 0 && last_list_idx + 1 < array_count(&fs_set->fs)) { + const char *fs_name_last = + array_idx_elem(&fs_set->fs, last_list_idx); + const char *fs_name_extra = + array_idx_elem(&fs_set->fs, last_list_idx + 1); + *error_r = t_strdup_printf( + "Extra fs %s { .. } named list filter - " + "the parent fs %s { .. } doesn't support a child fs", + fs_name_extra, fs_name_last); + settings_free(fs_set); + fs_unref(&fs); + return -1; + } settings_free(fs_set); - return ret < 0 ? -1 : 1; + if (ret < 0) + return -1; + *fs_r = fs; + return 1; } int fs_init_parent(struct fs *fs, const struct fs_parameters *params, @@ -301,6 +323,7 @@ int fs_init_parent(struct fs *fs, const struct fs_parameters *params, event_drop_parent_log_prefixes(event, 1); int ret = fs_init(event, params, fs->init_fs_list, fs->init_fs_list_idx + 1, + fs->init_fs_last_list_idx, &fs->parent, error_r); event_unref(&event); return ret;