From: Aram Sargsyan Date: Thu, 31 Mar 2022 14:33:49 +0000 (+0000) Subject: When using +qr in dig print the data of the current query X-Git-Tag: v9.19.0~15^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f831e758d19282e692dfcdd1ccdf1f172b4d3c03;p=thirdparty%2Fbind9.git When using +qr in dig print the data of the current query In `send_udp()` and `launch_next_query()` functions, when calling `dighost_printmessage()` to print detailed information about the sent query, dig always prints the data of the first query in the lookup's queries list. The first query in the list can be already finished, having its handles freed, and accessing this information results in assertion failure. Print the current query's information instead. --- diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 166358b3480..35d29eefd8d 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -3080,10 +3080,9 @@ send_udp(dig_query_t *query) { debug("sendcount=%" PRIuFAST32, isc_refcount_current(&sendcount)); /* XXX qrflag, print_query, etc... */ - if (!ISC_LIST_EMPTY(query->lookup->q) && query->lookup->qr) { + if (query->lookup->qr) { extrabytes = 0; - dighost_printmessage(ISC_LIST_HEAD(query->lookup->q), - &query->lookup->renderbuf, + dighost_printmessage(query, &query->lookup->renderbuf, query->lookup->sendmsg, true); if (query->lookup->stats) { print_query_size(query); @@ -3426,10 +3425,10 @@ launch_next_query(dig_query_t *query) { isc_refcount_current(&sendcount)); /* XXX qrflag, print_query, etc... */ - if (!ISC_LIST_EMPTY(l->q) && l->qr) { + if (l->qr) { extrabytes = 0; - dighost_printmessage(ISC_LIST_HEAD(l->q), &l->renderbuf, - l->sendmsg, true); + dighost_printmessage(query, &l->renderbuf, l->sendmsg, + true); if (l->stats) { print_query_size(query); } diff --git a/bin/tests/system/digdelv/tests.sh b/bin/tests/system/digdelv/tests.sh index 6c28ac7bca4..767e33f8e66 100644 --- a/bin/tests/system/digdelv/tests.sh +++ b/bin/tests/system/digdelv/tests.sh @@ -1081,6 +1081,15 @@ if [ -x "$DIG" ] ; then grep -F ";; No acceptable nameservers" dig.out.test$n > /dev/null || ret=1 if [ $ret -ne 0 ]; then echo_i "failed"; fi status=$((status+ret)) + + # See [GL #3244] for more information + n=$((n+1)) + echo_i "check that dig handles printing query information with +qr and +y when multiple queries are involved (including a failed query) ($n)" + ret=0 + dig_with_opts +timeout=1 +qr +y @127.0.0.1 @10.53.0.3 a.example > dig.out.test$n 2>&1 || ret=1 + grep -F "IN A 10.0.0.1" dig.out.test$n > /dev/null || ret=1 + if [ $ret -ne 0 ]; then echo_i "failed"; fi + status=$((status+ret)) else echo_i "$DIG is needed, so skipping these dig tests" fi