diff --git a/bin/tests/system/checkconf/bad-empty-include.conf b/bin/tests/system/checkconf/bad-empty-include.conf new file mode 100644 index 0000000000..ef47166944 --- /dev/null +++ b/bin/tests/system/checkconf/bad-empty-include.conf @@ -0,0 +1,14 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +include ""; diff --git a/lib/isccfg/parser.c b/lib/isccfg/parser.c index d2e777ba00..ec2d56149a 100644 --- a/lib/isccfg/parser.c +++ b/lib/isccfg/parser.c @@ -41,6 +41,7 @@ #include #include +#include #include #include #include @@ -50,7 +51,6 @@ #include #include #include -#include #include #include #include @@ -2257,6 +2257,9 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { * clause can occur. */ if (strcasecmp(TOKEN_STRING(pctx), "include") == 0) { + glob_t g; + int rc; + /* * Turn the file name into a temporary configuration * object just so that it is not overwritten by the @@ -2266,19 +2269,39 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { &includename)); CHECK(parse_semicolon(pctx)); - /* Allow include to specify a pattern that follows - * the same rules as the shell e.g "/path/zone*.conf" */ - glob_t glob_obj; - CHECK(isc_glob(includename->value.string.base, - &glob_obj)); - cfg_obj_destroy(pctx, &includename); - - for (size_t i = 0; i < glob_obj.gl_pathc; ++i) { - CHECK(parser_openfile(pctx, - glob_obj.gl_pathv[i])); + if (includename->value.string.length == 0) { + CHECK(ISC_R_FILENOTFOUND); } - isc_globfree(&glob_obj); + /* + * Allow include to specify a pattern that follows + * the same rules as the shell e.g "/path/zone*.conf" + */ + rc = glob(cfg_obj_asstring(includename), GLOB_ERR, NULL, + &g); + + switch (rc) { + case 0: + break; + case GLOB_NOMATCH: + CHECK(ISC_R_FILENOTFOUND); + break; + case GLOB_NOSPACE: + CHECK(ISC_R_NOMEMORY); + break; + default: + if (errno == 0) { + CHECK(ISC_R_IOERROR); + } + CHECK(isc_errno_toresult(errno)); + } + + for (size_t i = 0; i < g.gl_pathc; ++i) { + CHECK(parser_openfile(pctx, g.gl_pathv[i])); + } + + cfg_obj_destroy(pctx, &includename); + globfree(&g); goto redo; }