| From: Uwe Kleine-König <uwe@kleine-koenig.org> |
| Date: Sat, 8 Oct 2022 19:22:52 +0200 |
| Subject: [PATCH] nslookup: ensure unique transaction IDs for the DNS queries |
| |
| The transaction IDs generated by res_mkquery() for both glibc and musl only |
| depends on the state of the monotonic clock. |
| For some machines (here: a TP-Link RE200 powered by a MediaTek MT7620A) |
| the monotonic clock has a coarse resolution (here: 20 µs) and it can happen |
| that the requests for A and AAAA share the same transaction ID. |
| |
| In that case the mapping from received responses to the sent queries |
| doesn't work and name resolution fails as follows: |
| |
| # /bin/busybox nslookup heise.de |
| Server: 127.0.0.1 |
| Address: 127.0.0.1:53 |
| |
| Non-authoritative answer: |
| Name: heise.de |
| Address: 193.99.144.80 |
| |
| *** Can't find heise.de: No answer |
| |
| because the AAAA reply is dropped as a duplicate reply to the A query. |
| |
| To prevent this make sure the transaction IDs are unique. |
| |
| Forwarded: http://lists.busybox.net/pipermail/busybox/2022-October/089911.html |
| --- |
| --- a/networking/nslookup.c |
| +++ b/networking/nslookup.c |
| @@ -978,6 +978,10 @@ int nslookup_main(int argc UNUSED_PARAM, |
| } |
| } |
| |
| + /* Ensure the Transaction IDs are unique */ |
| + for (rc = 1; rc < G.query_count; rc++) |
| + G.query[rc].query[1] = G.query[rc - 1].query[1] + 1; |
| + |
| for (rc = 0; rc < G.serv_count;) { |
| int c; |
| |