72 lines
2.3 KiB
Diff
72 lines
2.3 KiB
Diff
From 691a3b2e9bfaba842e46a5ccb7f5e6ea144c3ade Mon Sep 17 00:00:00 2001
|
|
From: Florian Weimer <fweimer@redhat.com>
|
|
Date: Wed, 24 Jul 2024 12:06:47 +0200
|
|
Subject: [PATCH] resolv: Allow short error responses to match any query (bug
|
|
31890)
|
|
|
|
Reviewed-by: DJ Delorie <dj@redhat.com>
|
|
|
|
Conflict:tst-resolv-short-response test case
|
|
Reference:https://sourceware.org/git/?p=glibc.git;a=patch;h=691a3b2e9bfaba842e46a5ccb7f5e6ea144c3ade
|
|
|
|
---
|
|
resolv/res_send.c | 29 +++++++++++++++++++----------
|
|
1 file changed, 19 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/resolv/res_send.c b/resolv/res_send.c
|
|
index 701c089a..f2014a94 100644
|
|
--- a/resolv/res_send.c
|
|
+++ b/resolv/res_send.c
|
|
@@ -1194,19 +1194,30 @@ send_dg(res_state statp,
|
|
}
|
|
|
|
/* Check for the correct header layout and a matching
|
|
- question. */
|
|
+ question. Some recursive resolvers send REFUSED
|
|
+ without copying back the question section
|
|
+ (producing a response that is only HFIXEDSZ bytes
|
|
+ long). Skip query matching in this case. */
|
|
+ bool thisansp_error = (anhp->rcode == SERVFAIL ||
|
|
+ anhp->rcode == NOTIMP ||
|
|
+ anhp->rcode == REFUSED);
|
|
+ bool skip_query_match = (*thisresplenp == HFIXEDSZ
|
|
+ && ntohs (anhp->qdcount) == 0
|
|
+ && thisansp_error);
|
|
int matching_query = 0; /* Default to no matching query. */
|
|
if (!recvresp1
|
|
&& anhp->id == hp->id
|
|
- && __libc_res_queriesmatch (buf, buf + buflen,
|
|
- *thisansp,
|
|
- *thisansp + *thisanssizp))
|
|
+ && (skip_query_match
|
|
+ || __libc_res_queriesmatch (buf, buf + buflen,
|
|
+ *thisansp,
|
|
+ *thisansp + *thisanssizp)))
|
|
matching_query = 1;
|
|
if (!recvresp2
|
|
&& anhp->id == hp2->id
|
|
- && __libc_res_queriesmatch (buf2, buf2 + buflen2,
|
|
- *thisansp,
|
|
- *thisansp + *thisanssizp))
|
|
+ && (skip_query_match
|
|
+ || __libc_res_queriesmatch (buf2, buf2 + buflen2,
|
|
+ *thisansp,
|
|
+ *thisansp + *thisanssizp)))
|
|
matching_query = 2;
|
|
if (matching_query == 0)
|
|
/* Spurious UDP packet. Drop it and continue
|
|
@@ -1216,9 +1227,7 @@ send_dg(res_state statp,
|
|
goto wait;
|
|
}
|
|
|
|
- if (anhp->rcode == SERVFAIL ||
|
|
- anhp->rcode == NOTIMP ||
|
|
- anhp->rcode == REFUSED) {
|
|
+ if (thisansp_error) {
|
|
next_ns:
|
|
if (recvresp1 || (buf2 != NULL && recvresp2)) {
|
|
*resplen2 = 0;
|
|
--
|
|
2.33.0
|
|
|