Merge branch '4357-treat-notfile-as-eof-9.18' into 'bind-9.18'

[9.18] Remove infinite loop on ISC_R_NOFILE

See merge request isc-projects/bind9!9018
This commit is contained in:
Mark Andrews
2024-05-07 01:51:55 +00:00
3 changed files with 63 additions and 28 deletions

View File

@@ -1,3 +1,6 @@
6384. [bug] Remove infinite loop when including a directory in a
zone file. [GL #4357]
6383. [bug] Address an infinite loop in $GENERATE when a negative
value was converted in nibble mode. [GL #4353]

View File

@@ -0,0 +1,13 @@
; 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 .
$INCLUDE ..

View File

@@ -214,33 +214,52 @@ task_send(dns_loadctx_t *lctx);
static void
loadctx_destroy(dns_loadctx_t *lctx);
#define GETTOKENERR(lexer, options, token, eol, err) \
do { \
result = gettoken(lexer, options, token, eol, callbacks); \
switch (result) { \
case ISC_R_SUCCESS: \
break; \
case ISC_R_UNEXPECTED: \
goto insist_and_cleanup; \
default: \
if (MANYERRS(lctx, result)) { \
SETRESULT(lctx, result); \
LOGIT(result); \
read_till_eol = true; \
err goto next_line; \
} else \
goto log_and_cleanup; \
} \
if ((token)->type == isc_tokentype_special) { \
result = DNS_R_SYNTAX; \
if (MANYERRS(lctx, result)) { \
SETRESULT(lctx, result); \
LOGIT(result); \
read_till_eol = true; \
goto next_line; \
} else \
goto log_and_cleanup; \
} \
#define LCTX_MANYERRORS(lctx) (((lctx)->options & DNS_MASTER_MANYERRORS) != 0)
#define GETTOKENERR(lexer, options, token, eol, err) \
do { \
result = gettoken(lexer, options, token, eol, callbacks); \
switch (result) { \
case ISC_R_SUCCESS: \
break; \
case ISC_R_NOTFILE: \
/* Treat "bad" $INCLUDE as eof. */ \
if (ictx->parent != NULL && LCTX_MANYERRORS(lctx)) { \
SETRESULT(lctx, result); \
COMMITALL; \
lctx->inc = ictx->parent; \
ictx->parent = NULL; \
incctx_destroy(lctx->mctx, ictx); \
RUNTIME_CHECK(isc_lex_close(lctx->lex) == \
ISC_R_SUCCESS); \
line = isc_lex_getsourceline(lctx->lex); \
POST(line); \
source = isc_lex_getsourcename(lctx->lex); \
ictx = lctx->inc; \
continue; \
} \
goto insist_and_cleanup; \
case ISC_R_UNEXPECTED: \
goto insist_and_cleanup; \
default: \
if (MANYERRS(lctx, result)) { \
SETRESULT(lctx, result); \
LOGIT(result); \
read_till_eol = true; \
err goto next_line; \
} else \
goto log_and_cleanup; \
} \
if ((token)->type == isc_tokentype_special) { \
result = DNS_R_SYNTAX; \
if (MANYERRS(lctx, result)) { \
SETRESULT(lctx, result); \
LOGIT(result); \
read_till_eol = true; \
goto next_line; \
} else \
goto log_and_cleanup; \
} \
} while (0)
#define GETTOKEN(lexer, options, token, eol) \
GETTOKENERR(lexer, options, token, eol, {})
@@ -293,7 +312,7 @@ loadctx_destroy(dns_loadctx_t *lctx);
#define MANYERRS(lctx, result) \
((result != ISC_R_SUCCESS) && (result != ISC_R_IOERROR) && \
((lctx)->options & DNS_MASTER_MANYERRORS) != 0)
LCTX_MANYERRORS(lctx))
#define SETRESULT(lctx, r) \
do { \