From ffb01963fc99eb9c5046dcd65140a71243ec46c9 Mon Sep 17 00:00:00 2001 From: Ivan Korytov Date: Fri, 13 Mar 2026 12:17:55 +0300 Subject: [PATCH] lib:roken: allow large fragmented UDP replies from glibc resolver glibc resolver returns same answer length as buffer size when buffer is too small for the answer. Signed-off-by: Ivan Korytov --- lib/roken/resolve.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/roken/resolve.c b/lib/roken/resolve.c index 31da4136d..63ed96d84 100644 --- a/lib/roken/resolve.c +++ b/lib/roken/resolve.c @@ -568,16 +568,18 @@ dns_lookup_int(const char *domain, int rr_class, int rr_type) fprintf(stderr, "dns_lookup(%s, %d, %s) --> %d\n", domain, rr_class, rk_dns_type_to_string(rr_type), size); } - if (size > len) { + + if ((size == len || size <= 0) && len < rk_DNS_MAX_PACKET_SIZE) { + /* resolver may have a truncated reply or a failure occured */ + len *= 2; + if (len > rk_DNS_MAX_PACKET_SIZE) + len = rk_DNS_MAX_PACKET_SIZE; + } else if (size > len) { /* resolver thinks it know better, go for it */ len = size; } else if (size > 0) { /* got a good reply */ break; - } else if (size <= 0 && len < rk_DNS_MAX_PACKET_SIZE) { - len *= 2; - if (len > rk_DNS_MAX_PACKET_SIZE) - len = rk_DNS_MAX_PACKET_SIZE; } else { /* the end, leave */ resolve_free_handle(handle);