]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3971. [bug] Reduce the cascasding failures due to a bad $TTL line
authorMark Andrews <marka@isc.org>
Sat, 4 Oct 2014 21:29:34 +0000 (08:29 +1100)
committerMark Andrews <marka@isc.org>
Sat, 4 Oct 2014 21:29:34 +0000 (08:29 +1100)
                        in named-checkconf / named-checkzone. [RT #37138]

CHANGES
bin/tests/system/checkzone/zones/badttl.db [new file with mode: 0644]
lib/dns/master.c

diff --git a/CHANGES b/CHANGES
index ec9bdc0c91fda14ea2d057ea3b167e929c8c8bf7..6413228d09d5f1157c7901023069df57df748d82 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3971.  [bug]           Reduce the cascasding failures due to a bad $TTL line
+                       in named-checkconf / named-checkzone. [RT #37138]
+
 3970.   [contrib]       Fixed a use after free bug in the SDB LDAP driver.
                        [RT #37237]
 
diff --git a/bin/tests/system/checkzone/zones/badttl.db b/bin/tests/system/checkzone/zones/badttl.db
new file mode 100644 (file)
index 0000000..256731e
--- /dev/null
@@ -0,0 +1,23 @@
+; Copyright (C) 2014  Internet Systems Consortium, Inc. ("ISC")
+;
+; Permission to use, copy, modify, and/or distribute this software for any
+; purpose with or without fee is hereby granted, provided that the above
+; copyright notice and this permission notice appear in all copies.
+;
+; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+; AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+; PERFORMANCE OF THIS SOFTWARE.
+
+
+$TTL
+@              SOA     ns hostmaster 2011012708 3600 1200 604800 1200
+                NS      ns
+ns             A       192.0.2.1
+
+ns-and-dname   NS      ns.ns-and-dname
+               DNAME   example.com.
+ns.ns-and-dname        A       203.178.141.207
index 98ec9280dc92c3cf60fbced89603fa7c796ba7a0..c8c9f91bfab88cdb3af22b9d587e1b0a84a2454a 100644 (file)
@@ -221,7 +221,7 @@ task_send(dns_loadctx_t *lctx);
 static void
 loadctx_destroy(dns_loadctx_t *lctx);
 
-#define GETTOKEN(lexer, options, token, eol) \
+#define GETTOKENERR(lexer, options, token, eol, err) \
        do { \
                result = gettoken(lexer, options, token, eol, callbacks); \
                switch (result) { \
@@ -234,6 +234,7 @@ loadctx_destroy(dns_loadctx_t *lctx);
                                SETRESULT(lctx, result); \
                                LOGIT(result); \
                                read_till_eol = ISC_TRUE; \
+                               err \
                                goto next_line; \
                        } else \
                                goto log_and_cleanup; \
@@ -249,6 +250,8 @@ loadctx_destroy(dns_loadctx_t *lctx);
                                goto log_and_cleanup; \
                } \
        } while (0)
+#define GETTOKEN(lexer, options, token, eol) \
+       GETTOKENERR(lexer, options, token, eol, )
 
 #define COMMITALL \
        do { \
@@ -389,13 +392,19 @@ gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *token,
        if (eol != ISC_TRUE)
                if (token->type == isc_tokentype_eol ||
                    token->type == isc_tokentype_eof) {
+                       unsigned long int line;
+                       const char *what;
+                       const char *file;
+                       file = isc_lex_getsourcename(lex);
+                       line = isc_lex_getsourceline(lex);
+                       if (token->type == isc_tokentype_eol) {
+                               line--;
+                               what = "line";
+                       } else
+                               what = "file";
                        (*callbacks->error)(callbacks,
                            "dns_master_load: %s:%lu: unexpected end of %s",
-                                           isc_lex_getsourcename(lex),
-                                           isc_lex_getsourceline(lex),
-                                           (token->type ==
-                                            isc_tokentype_eol) ?
-                                           "line" : "file");
+                                           file, line, what);
                        return (ISC_R_UNEXPECTEDEND);
                }
        return (ISC_R_SUCCESS);
@@ -1152,7 +1161,9 @@ load_text(dns_loadctx_t *lctx) {
                                finish_origin = ISC_TRUE;
                        } else if (strcasecmp(DNS_AS_STR(token),
                                              "$TTL") == 0) {
-                               GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);
+                               GETTOKENERR(lctx->lex, 0, &token, ISC_FALSE,
+                                           lctx->ttl = 0;
+                                           lctx->default_ttl_known = ISC_TRUE;);
                                result =
                                   dns_ttl_fromtext(&token.value.as_textregion,
                                                    &lctx->ttl);