From 4f9a1b03dc6a84bbbaf0e395f5b5faa49ea47350 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 1 Dec 2020 15:10:32 +1100 Subject: [PATCH] Add the ability to display the BADCOOKIE message in dig when +badcookie is in effect. --- bin/dig/dig.c | 19 +++++++++++++++---- bin/dig/dig.rst | 5 +++++ bin/dig/dighost.c | 7 +++++++ bin/dig/dighost.h | 6 +++--- doc/man/dig.1in | 5 +++++ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/bin/dig/dig.c b/bin/dig/dig.c index 7cec01aba1..0dad0153de 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -282,6 +282,7 @@ help(void) { "short\n" " form of answers - global " "option)\n" + " +[no]showbadcookie (Show BADCOOKIE message)\n" " +[no]showsearch (Search with intermediate " "results)\n" " +[no]split=## (Split hex/base64 fields " @@ -1795,10 +1796,20 @@ plus_option(char *option, bool is_batchfile, bool *need_clone, } break; case 'w': /* showsearch */ - FULLCHECK("showsearch"); - if (!lookup->trace) { - showsearch = state; - usesearch = state; + switch (cmd[4]) { + case 'b': + FULLCHECK("showbadcookie"); + lookup->showbadcookie = state; + break; + case 's': + FULLCHECK("showsearch"); + if (!lookup->trace) { + showsearch = state; + usesearch = state; + } + break; + default: + goto invalid_option; } break; default: diff --git a/bin/dig/dig.rst b/bin/dig/dig.rst index 93c0b26c43..c447eb879d 100644 --- a/bin/dig/dig.rst +++ b/bin/dig/dig.rst @@ -503,6 +503,11 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to form. This option always has a global effect; it cannot be set globally and then overridden on a per-lookup basis. +``+[no]showbadcookie`` + This option toggles whether to show the message containing the + BADCOOKIE rcode before retrying the request or not. The default + is to not show the messages. + ``+[no]showsearch`` This option performs [or does not perform] a search showing intermediate results. diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index b6131e0831..14859ed74c 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -735,6 +735,8 @@ clone_lookup(dig_lookup_t *lookold, bool servers) { } looknew->https_get = lookold->https_get; looknew->http_plain = lookold->http_plain; + + looknew->showbadcookie = lookold->showbadcookie; looknew->sendcookie = lookold->sendcookie; looknew->seenbadcookie = lookold->seenbadcookie; looknew->badcookie = lookold->badcookie; @@ -3852,6 +3854,11 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, { process_opt(l, msg); if (msg->cc_ok) { + if (l->showbadcookie) { + dighost_printmessage(query, &b, msg, true); + dighost_received(isc_buffer_usedlength(&b), + &peer, query); + } dighost_comments(l, "BADCOOKIE, retrying%s.", l->seenbadcookie ? " in TCP mode" : ""); diff --git a/bin/dig/dighost.h b/bin/dig/dighost.h index 8da437625b..c02e23d67c 100644 --- a/bin/dig/dighost.h +++ b/bin/dig/dighost.h @@ -120,9 +120,9 @@ struct dig_lookup { section_answer, section_authority, section_question, seenbadcookie, sendcookie, servfail_stops, setqid, /*% use a speciied query ID */ - stats, tcflag, tcp_keepalive, tcp_mode, tcp_mode_set, - tls_mode, /*% connect using TLS */ - trace, /*% dig +trace */ + showbadcookie, stats, tcflag, tcp_keepalive, tcp_mode, + tcp_mode_set, tls_mode, /*% connect using TLS */ + trace, /*% dig +trace */ trace_root, /*% initial query for either +trace or +nssearch */ ttlunits, use_usec, waiting_connect, zflag; char textname[MXNAME]; /*% Name we're going to be looking up */ diff --git a/doc/man/dig.1in b/doc/man/dig.1in index 10d7a44911..3d7b332857 100644 --- a/doc/man/dig.1in +++ b/doc/man/dig.1in @@ -515,6 +515,11 @@ This option toggles whether a terse answer is provided. The default is to print form. This option always has a global effect; it cannot be set globally and then overridden on a per\-lookup basis. .TP +.B \fB+[no]showbadcookie\fP +This option toggles whether to show the message containing the +BADCOOKIE rcode before retrying the request or not. The default +is to not show the messages. +.TP .B \fB+[no]showsearch\fP This option performs [or does not perform] a search showing intermediate results. .TP