diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2020-02-04 11:31:01 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2020-02-04 11:31:01 +0000 |
commit | b8c3d9217701515945e23c6ba898b310881aee92 (patch) | |
tree | a446c8969b8c730e4fd255eacaa6d4f63bfad7cc /main/busybox/nslookup.patch | |
parent | 34bfa353330e1a3097d6c6ef87b283ac81b1cb5e (diff) | |
download | aports-b8c3d9217701515945e23c6ba898b310881aee92.tar.bz2 aports-b8c3d9217701515945e23c6ba898b310881aee92.tar.xz |
main/busybox: fix nslookup with search domains
upstream report: https://bugs.busybox.net/show_bug.cgi?id=12541
downstream report: https://github.com/gliderlabs/docker-alpine/issues/539
Diffstat (limited to 'main/busybox/nslookup.patch')
-rw-r--r-- | main/busybox/nslookup.patch | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/main/busybox/nslookup.patch b/main/busybox/nslookup.patch new file mode 100644 index 0000000000..79498f9171 --- /dev/null +++ b/main/busybox/nslookup.patch @@ -0,0 +1,176 @@ +From adf24e909cda1ae30767d8ca4902eac92781d932 Mon Sep 17 00:00:00 2001 +From: Jo-Philipp Wich <jo@mein.io> +Date: Thu, 27 Jun 2019 17:27:28 +0200 +Subject: [PATCH 1/2] nslookup: handle replies without RRs + +Under some circumstances, a DNS reply might contain no resource records, +e.g. when a valid domain is queried that does not have records of the +requested type. + +Example with nslookup from BIND dnsutils: + + $ nslookup -q=SRV example.org + Server: 10.11.12.13 + Address: 10.11.12.13#53 + + Non-authoritative answer: + *** Can't find example.org: No answer + +Currently the busybox nslookup applet simply prints nothing after the +"Non-authoritative answer:" line in the same situation. + +This change modifies nslookup to either print "Parse error" or "No answer" +diagnostics, depending on the parse_reply() return value. + +function old new delta +send_queries 1676 1711 +35 + +Signed-off-by: Jo-Philipp Wich <jo@mein.io> +Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> +(cherry picked from commit 8c3b520d4f937b1d1856898dec5f634b12d9cc36) +--- + networking/nslookup.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/networking/nslookup.c b/networking/nslookup.c +index 24e09d4f0..f7fd1d377 100644 +--- a/networking/nslookup.c ++++ b/networking/nslookup.c +@@ -615,9 +615,15 @@ static int send_queries(struct ns *ns) + G.query[qn].name, rcodes[rcode]); + G.exitcode = EXIT_FAILURE; + } else { +- if (parse_reply(reply, recvlen) < 0) { ++ switch (parse_reply(reply, recvlen)) { ++ case -1: + printf("*** Can't find %s: Parse error\n", G.query[qn].name); + G.exitcode = EXIT_FAILURE; ++ break; ++ ++ case 0: ++ printf("*** Can't find %s: No answer\n", G.query[qn].name); ++ break; + } + } + bb_putchar('\n'); +-- +2.25.0 + + +From 1fc999c00aa6649f17f0879b960427313dac64ae Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Tue, 4 Feb 2020 11:04:37 +0000 +Subject: [PATCH 2/2] nslookup: fix exitcode with search domains, closes 12541 + +Return success if there are any valid answer rather than exit with error. + +bloatcheck on x86_64: + +function old new delta +nslookup_main 917 924 +7 +send_queries 2115 2121 +6 +.rodata 136606 136609 +3 +------------------------------------------------------------------------------ +(add/remove: 0/0 grow/shrink: 3/0 up/down: 16/0) Total: 16 +bytes + text data bss dec hex filename + 839394 14660 2080 856134 d1046 busybox_old + 839410 14660 2080 856150 d1056 busybox_unstripped + +Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> +--- + networking/nslookup.c | 34 ++++++++++++++++++---------------- + 1 file changed, 18 insertions(+), 16 deletions(-) + +diff --git a/networking/nslookup.c b/networking/nslookup.c +index f7fd1d377..d66b13039 100644 +--- a/networking/nslookup.c ++++ b/networking/nslookup.c +@@ -265,7 +265,7 @@ struct query { + const char *name; + unsigned qlen; + // unsigned latency; +-// uint8_t rcode; ++ uint8_t rcode; + unsigned char query[512]; + // unsigned char reply[512]; + }; +@@ -320,7 +320,7 @@ struct globals { + struct query *query; + char *search; + smalluint have_search_directive; +- smalluint exitcode; ++ smallint answer; + } FIX_ALIASING; + #define G (*(struct globals*)bb_common_bufsiz1) + #define INIT_G() do { \ +@@ -605,28 +605,31 @@ static int send_queries(struct ns *ns) + + /* Process reply */ + G.query[qn].qlen = 0; /* flag: "reply received" */ ++ G.query[qn].rcode = rcode; + tcur = monotonic_ms(); + #if 1 + if (option_mask32 & OPT_debug) { + printf("Query #%d completed in %ums:\n", qn, tcur - tstart); + } + if (rcode != 0) { +- printf("** server can't find %s: %s\n", +- G.query[qn].name, rcodes[rcode]); +- G.exitcode = EXIT_FAILURE; ++ printf("** server can't find %s: %s\n\n", ++ G.query[qn].name, rcodes[rcode]); + } else { + switch (parse_reply(reply, recvlen)) { + case -1: +- printf("*** Can't find %s: Parse error\n", G.query[qn].name); +- G.exitcode = EXIT_FAILURE; ++ printf("*** Can't find %s: Parse error\n\n", G.query[qn].name); ++ G.query[qn].rcode = 0x10; + break; + + case 0: +- printf("*** Can't find %s: No answer\n", G.query[qn].name); ++ G.query[qn].rcode = 0x20; ++ break; ++ default: ++ bb_putchar('\n'); ++ G.answer++; + break; + } + } +- bb_putchar('\n'); + n_replies++; + if (n_replies >= G.query_count) + goto ret; +@@ -984,21 +987,20 @@ int nslookup_main(int argc UNUSED_PARAM, char **argv) + } + + err = 0; +- for (rc = 0; rc < G.query_count; rc++) { +- if (G.query[rc].qlen) { +- printf("*** Can't find %s: No answer\n", G.query[rc].name); +- err = 1; ++ for (rc = 0; !G.answer && rc < G.query_count; rc++) { ++ if (G.query[rc].qlen || G.query[rc].rcode == 0x20) { ++ printf("*** Can't find %s: No answer\n\n", G.query[rc].name); ++ } else if (G.query[rc].rcode != 0) { ++ err = EXIT_FAILURE; + } + } +- if (err) /* should this affect exicode too? */ +- bb_putchar('\n'); + + if (ENABLE_FEATURE_CLEAN_UP) { + free(G.server); + free(G.query); + } + +- return G.exitcode; ++ return err; + } + + #endif +-- +2.25.0 + |