Control: tags -1 + confirmed upstream Control: severity -1 minor On Fri, Apr 05, 2024 at 10:04:29PM +0000, Einhard Leichtfuß wrote: > when the Dovecot configuration contains an `!include` statement with a > wildcard that does not match anything, dovecot prints an error and > terminates. > > Expected behaviour: Dovecot processes the configuration as if the > `!include` statement was not present. > > The upstream on-line documentation [0] says on `!include`: > > It’s not an error if wildcards don’t result in any matching files. > > [0] > <https://doc.dovecot.org/configuration_manual/config_file/#including-config-files>
Confirmed based on your repro steps. The documentation does indeed claim that this should not result in an error, but that's not consistent with the code. Some relevant snippets of code from src/config/config-parser.c: from config_parse_line(): if (strcmp(key, "!include") == 0) return CONFIG_LINE_TYPE_INCLUDE; if (strcmp(key, "!include_try") == 0) return CONFIG_LINE_TYPE_INCLUDE_TRY; This return value is later handled with a case statement in config_parser_apply_line(): case CONFIG_LINE_TYPE_INCLUDE: case CONFIG_LINE_TYPE_INCLUDE_TRY: (void)settings_include(ctx, fix_relative_path(value, ctx->cur_input), type == CONFIG_LINE_TYPE_INCLUDE_TRY); break; The result of the "type == CONFIG_LINE_TYPE_INCLUDE_TRY" statement is passed as the bool ignore_errors parameter to bool ignore_errors(), so if it evaluates to false as it does when type == CONFIG_LINE_TYPE_INCLUDE, then we return an error: case GLOB_NOMATCH: if (ignore_errors) return 0; ctx->error = "No matches"; return -1; I will pass this along to upstream. It's not clear from here whether the issue is with the code or with the documentation. noah