From 7b46a4aa418de3e1f2df63b9353b7148584afe64 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 10 Mar 2014 11:55:32 -0700 Subject: [PATCH] [master] fix negative numbers in $GENERATE 3780. [bug] $GENERATE handled negative numbers incorrectly. [RT #25528] --- CHANGES | 3 +++ bin/tests/system/checkzone/zones/bad2.db | 22 ++++++++++++++++++++++ doc/arm/Bv9ARM-book.xml | 5 +++-- lib/dns/master.c | 8 +++++--- 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 bin/tests/system/checkzone/zones/bad2.db diff --git a/CHANGES b/CHANGES index eabccd045e..71cf63ef44 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3780. [bug] $GENERATE handled negative numbers incorrectly. + [RT #25528] + 3779. [cleanup] Clarify the error message when using an option that was not enabled at compile time. [RT #35504] diff --git a/bin/tests/system/checkzone/zones/bad2.db b/bin/tests/system/checkzone/zones/bad2.db new file mode 100644 index 0000000000..d67a84ccd6 --- /dev/null +++ b/bin/tests/system/checkzone/zones/bad2.db @@ -0,0 +1,22 @@ +; 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 600 +@ SOA ns hostmaster 2011012708 3600 1200 604800 1200 + NS ns +ns A 192.0.2.1 + +; The following GENERATE directive contains two dashes in the range +; which is a syntax error. +$GENERATE 9--10 host$ 3600 A 192.0.2.$ diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 6392a36248..a5da819544 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -14205,8 +14205,9 @@ HOST-127.EXAMPLE. MX 0 . This can be one of two forms: start-stop or start-stop/step. If the first form is used, then step - is set to - 1. All of start, stop and step must be positive. + is set to 1. start, stop and step must be positive + integers between 0 and (2^31)-1. start must not be + larger than stop. diff --git a/lib/dns/master.c b/lib/dns/master.c index 0300b5035a..8e8b5c61f6 100644 --- a/lib/dns/master.c +++ b/lib/dns/master.c @@ -806,7 +806,7 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs, isc_buffer_t target; isc_result_t result; isc_textregion_t r; - unsigned int start, stop, step, i; + int start, stop, step, i; dns_incctx_t *ictx; ictx = lctx->inc; @@ -824,8 +824,10 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs, } isc_buffer_init(&target, target_mem, target_size); - n = sscanf(range, "%u-%u/%u", &start, &stop, &step); - if (n < 2 || stop < start) { + n = sscanf(range, "%d-%d/%d", &start, &stop, &step); + if ((n < 2) || (start < 0) || (stop < 0) || (step < 0) || + (stop < start)) + { (*callbacks->error)(callbacks, "%s: %s:%lu: invalid range '%s'", "$GENERATE", source, line, range);