diff --git a/CHANGES b/CHANGES index 38e3bad85a..ba9ef64a97 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ +3683. [cleanup] Add a more detailed "not found" message to rndc + commands which specify a zone name. [RT #35059] + 3682. [bug] Correct the behavior of rndc retransfer to allow - inline-signing slave zones to retain NSEC3 parameters instead of - reverting to NSEC [RT #34745] + inline-signing slave zones to retain NSEC3 parameters + instead of reverting to NSEC. [RT #34745] 3681. [port] Update the Windows build system to support feature selection and WIN64 builds. This is a work in diff --git a/bin/named/control.c b/bin/named/control.c index 8d85975c4b..2ab480b316 100644 --- a/bin/named/control.c +++ b/bin/named/control.c @@ -105,7 +105,8 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) { } else if (command_compare(command, NS_COMMAND_REFRESH)) { result = ns_server_refreshcommand(ns_g_server, command, text); } else if (command_compare(command, NS_COMMAND_RETRANSFER)) { - result = ns_server_retransfercommand(ns_g_server, command); + result = ns_server_retransfercommand(ns_g_server, + command, text); } else if (command_compare(command, NS_COMMAND_HALT)) { #ifdef HAVE_LIBSCF /* @@ -200,7 +201,7 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) { result = ns_server_validation(ns_g_server, command, text); } else if (command_compare(command, NS_COMMAND_SIGN) || command_compare(command, NS_COMMAND_LOADKEYS)) { - result = ns_server_rekey(ns_g_server, command); + result = ns_server_rekey(ns_g_server, command, text); } else if (command_compare(command, NS_COMMAND_ADDZONE)) { result = ns_server_add_zone(ns_g_server, command); } else if (command_compare(command, NS_COMMAND_DELZONE)) { diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index b586f5c4ac..73c648b139 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -231,7 +231,8 @@ ns_server_refreshcommand(ns_server_t *server, char *args, isc_buffer_t *text); */ isc_result_t -ns_server_retransfercommand(ns_server_t *server, char *args); +ns_server_retransfercommand(ns_server_t *server, char *args, + isc_buffer_t *text); /*%< * Act on a "retransfer" command from the command channel. */ @@ -320,7 +321,7 @@ ns_server_sync(ns_server_t *server, char *args, isc_buffer_t *text); * take place incrementally. */ isc_result_t -ns_server_rekey(ns_server_t *server, char *args); +ns_server_rekey(ns_server_t *server, char *args, isc_buffer_t *text); /*% * Dump the current recursive queries. diff --git a/bin/named/server.c b/bin/named/server.c index e88fb74d04..4acd0372c4 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -391,6 +391,9 @@ end_reserved_dispatches(ns_server_t *server, isc_boolean_t all); static void newzone_cfgctx_destroy(void **cfgp); +static isc_result_t +putstr(isc_buffer_t *b, const char *str); + isc_result_t add_comment(FILE *fp, const char *viewname); @@ -6877,7 +6880,8 @@ next_token(char **stringp, const char *delim) { */ static isc_result_t zone_from_args(ns_server_t *server, char *args, const char *zonetxt, - dns_zone_t **zonep, const char **zonename, isc_boolean_t skip) + dns_zone_t **zonep, const char **zonename, + isc_buffer_t *text, isc_boolean_t skip) { char *input, *ptr; char *classtxt; @@ -6887,6 +6891,7 @@ zone_from_args(ns_server_t *server, char *args, const char *zonetxt, isc_buffer_t buf; dns_view_t *view = NULL; dns_rdataclass_t rdclass; + char problem[1024] = ""; REQUIRE(zonep != NULL && *zonep == NULL); REQUIRE(zonename == NULL || *zonename == NULL); @@ -6938,15 +6943,24 @@ zone_from_args(ns_server_t *server, char *args, const char *zonetxt, dns_fixedname_name(&name), ISC_TF(classtxt == NULL), rdclass, zonep); + if (result == ISC_R_NOTFOUND) + sprintf(problem, "no matching zone '%s' in any view", + zonetxt); } else { result = dns_viewlist_find(&server->viewlist, viewtxt, rdclass, &view); - if (result != ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) { + sprintf(problem, "no matching view '%s'", viewtxt); goto fail1; + } result = dns_zt_find(view->zonetable, dns_fixedname_name(&name), 0, NULL, zonep); - dns_view_detach(&view); + if (result != ISC_R_SUCCESS) { + sprintf(problem, "no matching zone '%s' in view '%s'", + zonetxt, viewtxt); + goto fail1; + } } /* Partial match? */ @@ -6955,6 +6969,14 @@ zone_from_args(ns_server_t *server, char *args, const char *zonetxt, if (result == DNS_R_PARTIALMATCH) result = ISC_R_NOTFOUND; fail1: + if (result != ISC_R_SUCCESS) { + putstr(text, problem); + isc_buffer_putuint8(text, 0); + } + + if (view != NULL) + dns_view_detach(&view); + return (result); } @@ -6962,13 +6984,16 @@ zone_from_args(ns_server_t *server, char *args, const char *zonetxt, * Act on a "retransfer" command from the command channel. */ isc_result_t -ns_server_retransfercommand(ns_server_t *server, char *args) { +ns_server_retransfercommand(ns_server_t *server, char *args, + isc_buffer_t *text) +{ isc_result_t result; dns_zone_t *zone = NULL; dns_zone_t *raw = NULL; dns_zonetype_t type; - result = zone_from_args(server, args, NULL, &zone, NULL, ISC_TRUE); + result = zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_TRUE); if (result != ISC_R_SUCCESS) return (result); if (zone == NULL) @@ -6998,7 +7023,8 @@ ns_server_reloadcommand(ns_server_t *server, char *args, isc_buffer_t *text) { dns_zonetype_t type; const char *msg = NULL; - result = zone_from_args(server, args, NULL, &zone, NULL, ISC_TRUE); + result = zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_TRUE); if (result != ISC_R_SUCCESS) return (result); if (zone == NULL) { @@ -7058,7 +7084,8 @@ ns_server_notifycommand(ns_server_t *server, char *args, isc_buffer_t *text) { dns_zone_t *zone = NULL; const unsigned char msg[] = "zone notify queued"; - result = zone_from_args(server, args, NULL, &zone, NULL, ISC_TRUE); + result = zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_TRUE); if (result != ISC_R_SUCCESS) return (result); if (zone == NULL) @@ -7083,7 +7110,8 @@ ns_server_refreshcommand(ns_server_t *server, char *args, isc_buffer_t *text) { const unsigned char msg2[] = "not a slave or stub zone"; dns_zonetype_t type; - result = zone_from_args(server, args, NULL, &zone, NULL, ISC_TRUE); + result = zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_TRUE); if (result != ISC_R_SUCCESS) return (result); if (zone == NULL) @@ -8259,7 +8287,7 @@ ns_server_tsiglist(ns_server_t *server, isc_buffer_t *text) { * Act on a "sign" or "loadkeys" command from the command channel. */ isc_result_t -ns_server_rekey(ns_server_t *server, char *args) { +ns_server_rekey(ns_server_t *server, char *args, isc_buffer_t *text) { isc_result_t result; dns_zone_t *zone = NULL; dns_zonetype_t type; @@ -8269,7 +8297,8 @@ ns_server_rekey(ns_server_t *server, char *args) { if (strncasecmp(args, NS_COMMAND_SIGN, strlen(NS_COMMAND_SIGN)) == 0) fullsign = ISC_TRUE; - result = zone_from_args(server, args, NULL, &zone, NULL, ISC_TRUE); + result = zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_TRUE); if (result != ISC_R_SUCCESS) return (result); if (zone == NULL) @@ -8342,7 +8371,8 @@ ns_server_sync(ns_server_t *server, char *args, isc_buffer_t *text) { arg = next_token(&args, " \t"); } - result = zone_from_args(server, args, arg, &zone, NULL, ISC_FALSE); + result = zone_from_args(server, args, arg, &zone, NULL, + text, ISC_FALSE); if (result != ISC_R_SUCCESS) return (result); @@ -8418,7 +8448,8 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args, isc_boolean_t frozen; const char *msg = NULL; - result = zone_from_args(server, args, NULL, &zone, NULL, ISC_TRUE); + result = zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_TRUE); if (result != ISC_R_SUCCESS) return (result); if (zone == NULL) { @@ -8810,8 +8841,8 @@ ns_server_del_zone(ns_server_t *server, char *args, isc_buffer_t *text) { arg = next_token(&args, " \t"); } - CHECK(zone_from_args(server, args, arg, &zone, &zonename, ISC_FALSE)); - + CHECK(zone_from_args(server, args, arg, &zone, &zonename, + text, ISC_FALSE)); if (zone == NULL) { result = ISC_R_UNEXPECTEDEND; goto cleanup; @@ -9131,7 +9162,8 @@ ns_server_signing(ns_server_t *server, char *args, isc_buffer_t *text) { } else CHECK(DNS_R_SYNTAX); - CHECK(zone_from_args(server, args, NULL, &zone, NULL, ISC_FALSE)); + CHECK(zone_from_args(server, args, NULL, &zone, NULL, + text, ISC_FALSE)); if (zone == NULL) CHECK(ISC_R_UNEXPECTEDEND); @@ -9248,7 +9280,8 @@ ns_server_zonestatus(ns_server_t *server, char *args, isc_buffer_t *text) { isc_time_settoepoch(&refreshkeytime); isc_time_settoepoch(&resigntime); - CHECK(zone_from_args(server, args, NULL, &zone, &zonename, ISC_TRUE)); + CHECK(zone_from_args(server, args, NULL, &zone, &zonename, + text, ISC_TRUE)); if (zone == NULL) { result = ISC_R_UNEXPECTEDEND; goto cleanup;