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

Reply via email to